aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek
Commit message (Collapse)AuthorAgeFilesLines
* kernel: bump 5.4 to 5.4.80John Audia2020-11-261-1/+1
| | | | | | | | | | | | | | | | | Removed since could be reverse-applied by quilt and found to be included upstream: backport-5.4/789-net-usb-qmi_wwan-Set-DTR-quirk-for-MR400.patch All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, bcm27xx/bcm2711, ath79/generic Run-tested: ipq806x/R7800 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Tested-by: Curtis Deptuck <curtdept@me.com> [x86_64 build/run]
* kernel: bump 5.4 to 5.4.77John Audia2020-11-187-12/+12
| | | | | | | | | | | | | | | | | | | | | | | | Manually rebased patches: bcm27xx/patches-5.4/950-0135-spi-spi-bcm2835-Disable-forced-software-CS.patch generic-backport/744-v5.5-net-sfp-soft-status-and-control-support.patch layerscape/patches-5.4/819-uart-0005-tty-serial-fsl_lpuart-enable-dma-mode-for-imx8qxp.patch mvebu/patches-5.4/521-arm64-dts-marvell-espressobin-Add-ethernet-switch-al.patch Removed: layerscape/patches-5.4/819-uart-0012-tty-serial-lpuart-add-LS1028A-support.patch All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711, lantiq/Easybox 904 xDSL, x86_64 Run-tested: ipq806x/R7800, lantiq/Easybox 904 xDSL, x86_64 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Co-developed-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* mediatek: fix mixed indent in DTS filesAdrian Schmutzler2020-11-165-141/+143
| | | | | | | | | mediatek frequently had mixed indent (tabs vs. spaces) in DTS files and DTS file kernel patches (probably due to careless copy/paste). The harmonizes these cases to tabs-only, as usual for DTS(I). Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* treewide: remove default-state off for LEDsAdrian Schmutzler2020-11-164-11/+2
| | | | | | | | | default-state = "off" is default for LEDs, no need to specify it explicitly. https://www.kernel.org/doc/Documentation/devicetree/bindings/leds/common.yaml Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* kernel: bump 5.4 to 5.4.75John Audia2020-11-101-23/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Manually rebased patches: bcm27xx: patches-5.4/950-0267-xhci-add-quirk-for-host-controllers-that-don-t-updat.patch bcm53xx: patches-5.4/180-usb-xhci-add-support-for-performing-fake-doorbell.patch layerscape: patches-5.4/802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch patches-5.4/808-i2c-0002-MLK-10893-i2c-imx-add-irqf_no_suspend.patch patches-5.4/820-usb-0016-MLK-16735-usb-host-add-XHCI_CDNS_HOST-flag.patch Removed since could be reverse-applied by quilt: mediatek: patches-5.4/0700-arm-dts-mt7623-add-missing-pause-for-switchport.patch All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711, x86_64 Run-tested: ipq806x/R7800, x86_64 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Tested-by: Curtis Deptuck <curtdept@me.com> [x86_64] Rebase of 802-can-0025-can-flexcan-add-LPSR-mode-support-for-i.MX7D.patch Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> Signed-off-by: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
* kernel: bump 5.4 to 5.4.73John Audia2020-11-011-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Removed upstreamed patches: generic/pending-5.4 445-mtd-spinand-gigadevice-Only-one-dummy-byte-in-QUA.patch 446-mtd-spinand-gigadevice-Add-QE-Bit.patch pistachio/patches-5.4 150-pwm-img-Fix-null-pointer-access-in-probe.patch Manually rebased: layerscape/patches-5.4 801-audio-0011-Revert-ASoC-fsl_sai-add-of_match-data.patch 801-audio-0039-MLK-16224-6-ASoC-fsl_sai-fix-DSD-suspend-resume.patch 801-audio-0073-MLK-21957-3-ASoC-fsl_sai-add-bitcount-and-timestamp-.patch 820-usb-0009-usb-dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh.patch All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711, mvebu (mamba, rango), x86_64, ramips/mt7621 Run-tested: ipq806x/R7800, mvebu (mamba, rango), x86_64, ramips (RT-AC57U) No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [alter 820-usb-0009-usb-dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* kernel: remove support for kernel 4.19Adrian Schmutzler2020-10-3046-32563/+0
| | | | | | | We use 5.4 on all targets by default, and 4.19 has never been released in a stable version. There is no reason to keep it. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* kernel: bump 5.4 to 5.4.72John Audia2020-10-201-5/+5
| | | | | | | | | | | | All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711 Run-tested: ipq806x/R7800 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us>
* mediatek: rewrite flow offload codeFelix Fietkau2020-10-163-1244/+12
| | | | | | | | | The code is now much cleaner and works better than the old code. Preparation for submitting it upstream (though with a different API) Also add back MT7621 support and fix flow table coherence issues on MT7622 Signed-off-by: Felix Fietkau <nbd@nbd.name>
* kernel: bump 5.4 to 5.4.71John Audia2020-10-151-1/+1
| | | | | | | | | | | | | | | All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711, lantiq/Easybox 904 xDSL Run-tested: ipq806x/R7800, lantiq/Easybox 904 xDSL No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [add lantiq test reports] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* kernel: move CONFIG_F2FS_CHECK_FS to generic kernel configHauke Mehrtens2020-10-111-1/+0
| | | | Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: Move CONFIG_F2FS_FS_SECURITY to generic kernel configHauke Mehrtens2020-10-111-1/+0
| | | | | | | Move the CONFIG_F2FS_FS_SECURITY kernel configuration option to the generic kernel configuration. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: Remove 2FS_FS_XATTR and F2FS_STAT_FS symbols from target configsHauke Mehrtens2020-10-112-3/+0
| | | | | | | This config option was moved to the generic kernel configuration. Fixes: ab1bd576562b ("kernel: move F2FS_FS_XATTR and F2FS_STAT_FS symbols to generic") Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* kernel: clean up XATTR config symbolsPaul Spooren2020-10-091-1/+0
| | | | | | | | | | | | | Extended attributes are required for overlayfs and have hence been long ago enabled for jffs2, but should be enabled unconditionally for all other filesystems which may potentially serve as overlayfs' upper directory. Previously it was inconsistently added in multiple targets. Add symbols to generic kernel config and remove all *_XATTR symbols from target configs. Signed-off-by: Paul Spooren <mail@aparcar.org> [keep things as they are for squashfs, improve commit message] Signed-off-by: Daniel Golle <daniel@makrotopia.org>
* kernel: bump 5.4 to 5.4.69John Audia2020-10-022-2/+2
| | | | | | | | | | | | | | | | | | | | | | Seemingly unneeded based on new upstream code so manually deleted: layerscape: 820-usb-0007-usb-dwc3-gadget-increase-timeout-value-for-send-ep-c.patch Manually merged: generic-hack: 251-sound_kconfig.patch All other modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x/R7800, ath79/generic, bcm27xx/bcm2711 Run-tested: ipq806x/R7800, lantiq/Easybox 904 xDSL No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [add lantiq test report, minor commit message clarification] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* kernel: bump 5.4 to 5.4.67John Audia2020-09-242-6/+2
| | | | | | | | | | | | | | All modifications made by update_kernel.sh Build system: x86_64 Build-tested: ipq806x, lantiq/xrx200 and ath79/generic Run-tested: ipq806x (R7800), lantiq (Easybox 904 xDSL) No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [add test on lantiq] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* target: update SPDX license namesAdrian Schmutzler2020-09-2239-39/+39
| | | | | | | SPDX moved from GPL-2.0 to GPL-2.0-only and from GPL-2.0+ to GPL-2.0-or-later. Reflect that in the SPDX license headers. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* mediatek: mt7622: select bluetooth module instead of firmwareChuanhong Guo2020-09-221-1/+1
| | | | Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
* mediatek: build btmtkuart as a kernel moduleChuanhong Guo2020-09-222-15/+12
| | | | | | | | bluetooth on mt7622 needs a firmware to start. It can't be built-in or it tries to load firmware before rootfs is mounted, and then fails. build it as a kernel module to fix that. Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
* mediatek: mt7623: use bash for generating bootable imagesDavid Woodhouse2020-09-191-1/+1
| | | | | | | | | | | | | | | | | It turns out that 'echo -e' isn't portable; it doesn't work in the dash builtin echo and Ubuntu users are complaining. I can't even get octal (specified by POSIX) to work consistently because those variants of 'echo' which *do* support -e don't seem to interpret octalwithout it. I could switch to /bin/echo but using -e with that isn't actually portable *either* even though it works today. For now just stick with bash, and use its builtin. We may end up using something else entirely; perhaps perl. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* mediatek: fix missing pause on switch port for Banana Pi R2David Woodhouse2020-09-191-0/+27
| | | | | | This causes rx drops when running iperf. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* kernel: bump 5.4 to 5.4.66John Audia2020-09-191-1/+1
| | | | | | | | | | | | All modifications made by update_kernel.sh/no manual intervention needed Run-tested: ipq806x (R7800), ath79 (Archer C7v5), x86/64 No dmesg regressions, everything appears functional Signed-off-by: John Audia <graysky@archlinux.us> [add run test from PR] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* mediatek: fix hardware flow offloadFelix Fietkau2020-09-171-1/+17
| | | | | | Add support for dealing with DSA ports Signed-off-by: Felix Fietkau <nbd@nbd.name>
* ramips/mediatek: improve GRO performance, fix PPE packet parsingFelix Fietkau2020-09-133-108/+16
| | | | | | | | Backport upstream changes to initialize GDM settings and reset PPE Allow GMAC to recognize the special tag to fix PPE packet parsing Improve GRO performance by passing PPE L4 hash as skb hash Signed-off-by: Felix Fietkau <nbd@nbd.name>
* kernel: bump 5.4 to 5.4.64John Audia2020-09-127-18/+18
| | | | | | | | | | | | | | | | | | | | | | Remove upstreamed patches: generic-backport 701-v5.5-net-core-use-listified-Rx-for-GRO_NORMAL-in-napi_gro.patch Manually merged: mediatek/patches-5.4 0603-net-dsa-mt7530-Extend-device-data-ready-for-adding-a.patch All other modifications made by update_kernel.sh Build-tested: ipq806x, lantiq/xrx200, mvebu, x86/64 Run-tested: ipq806x (R7800), mvebu (mamba, rango), lantiq/xrx200 (Easybox 904 xDSL), x86/64 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [add community build/run tests to commit message] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* mediatek/ramips: remove an ethernet optimization patch that was reported to ↵Felix Fietkau2020-09-093-13/+13
| | | | | | | | cause a regression In some tests, crashes were observed Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: backport the latest version of the mt7531 support patchesFelix Fietkau2020-09-0911-1952/+2573
| | | | | | Fixes unknown unicast flooding issue Signed-off-by: Felix Fietkau <nbd@nbd.name>
* kernel: bump 5.4 to 5.4.63John Audia2020-09-063-6/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | Manually merged: hack-5.4 230-openwrt_lzma_options.patch bcm27xx 950-0283-hid-usb-Add-device-quirks-for-Freeway-Airmouse-T3-an.patch x86 011-tune_lzma_options.patch Remove upstreamed patches in collaboration with Ansuel Smith: ipq806x 093-1-v5.8-ipq806x-PCI-qcom-Add-missing-ipq806x-clocks-in-PCIe-driver.patch 093-2-v5.8-ipq806x-PCI-qcom-Change-duplicate-PCI-reset-to-phy-reset.patch 093-3-v5.8-ipq806x-PCI-qcom-Add-missing-reset-for-ipq806x.patch All other modifications made by update_kernel.sh Build-tested: bcm27xx/bcm2708, ipq806x, x86/64 Run-tested: ipq806x (R7800), x86/64 No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [update commit message/tested] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* mediatek/mt7622: adjust kernel cpu features to match the hardwareFelix Fietkau2020-09-061-15/+15
| | | | | | | Disable unnecessary errata/features Enable potentially needed ones Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: enable coherent DMA for ethernet and PCIFelix Fietkau2020-09-042-0/+191
| | | | | | Improves performance by eliminating the need for extra cache flushes Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: fix an irq handling issueFelix Fietkau2020-09-041-0/+24
| | | | Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek/ramips: add patch to avoid unnecessary rearming of interruptsFelix Fietkau2020-09-042-10/+10
| | | | Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: disable packet steering by defaultFelix Fietkau2020-09-041-5/+0
| | | | | | | mt76 now spreads the load over multiple CPUs more smoothly, processing ethernet packets should be faster running on one core Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: enable kernel PCIe ASPM support, refresh kernel configFelix Fietkau2020-09-041-2/+11
| | | | | | Improves performance on PCIe devices Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek/ramips: unify ethernet driver fixes and add performance optimizationsFelix Fietkau2020-09-016-164/+21
| | | | | | Increase DMA burst size and tx ring size and optimize tx processing Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: pull in some fixes fromt he latest SDKJohn Crispin2020-09-013-0/+109
| | | | Signed-off-by: John Crispin <john@phrozen.org>
* kernel: bump 5.4 to 5.4.61John Audia2020-08-301-1/+1
| | | | | | | | | | | | | | | | | | | Manually merged: backport-5.4 011-kbuild-export-SUBARCH.patch layerscape 701-net-0262-net-dsa-ocelot-add-tagger-for-Ocelot-Felix-switches.patch All other modifications made by update_kernel.sh Build-tested: x86/64, lantiq/xrx200, ramips/mt7621 Run-tested: ipq806x (R7800), lantiq/xrx200, x86/64, ramips (RT-AC57U) No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> [minor commit message adjustments] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* treewide: use wpad-basic-wolfssl as defaultPetr Štetiar2020-08-201-1/+1
| | | | | | | | | | | | | | | In order to support SAE/WPA3-Personal in default images. Replace almost all occurencies of wpad-basic and wpad-mini with wpad-basic-wolfssl for consistency. Keep out ar71xx from the list as it won't be in the next release and would only make backports harder. Build-tested (build-bot settings): ath79: generic, ramips: mt7620/mt76x8/rt305x, lantiq: xrx200/xway, sunxi: a53 Signed-off-by: Petr Štetiar <ynezz@true.cz> [rebase, extend commit message] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* kernel: bump 5.4 to 5.4.58John Audia2020-08-187-82/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This PR is a blend of several kernel bumps authored by ldir taken from his staging tree w/ some further adjustments made by me and update_kernel.sh Summary: Deleted upstreamed patches: generic: 742-v5.5-net-sfp-add-support-for-module-quirks.patch 743-v5.5-net-sfp-add-some-quirks-for-GPON-modules.patch bcm63xx: 022-v5.8-mtd-rawnand-brcmnand-correctly-verify-erased-pages.patch 024-v5.8-mtd-rawnand-brcmnand-fix-CS0-layout.patch mediatek: 0402-net-ethernet-mtk_eth_soc-Always-call-mtk_gmac0_rgmii.patch Deleted patches applied differently upstream: generic: 641-sch_cake-fix-IP-protocol-handling-in-the-presence-of.patch Manually merged patches: generic: 395-v5.8-net-sch_cake-Take-advantage-of-skb-hash-where-appropriate.patch bcm27xx: 950-0132-lan78xx-Debounce-link-events-to-minimize-poll-storm.patch layerscape: 701-net-0231-enetc-Use-DT-protocol-information-to-set-up-the-port.patch Build system: x86_64 Build-tested: ath79/generic, bcm27xx/bcm2708, bcm27xx/bcm2711, imx6, mvebu/cortexa9, sunxi/a53 Run-tested: Netgear R7800 (ipq806x) No dmesg regressions, everything functional Signed-off-by: John Audia <graysky@archlinux.us> Tested-By: Lucian Cristian <Lucian.cristian@gmail.com> [mvebu] Tested-By: Curtis Deptuck <curtdept@me.com> [x86/64] [do not remove 395-v5.8-net-sch_cake-Take-advantage-... patch, adjust and refresh patches, adjust commit message] Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Tested-By: John Audia <graysky@archlinux.us> [ipq806x]
* mediatek: disable btif in device tree to make the WMAC work againFelix Fietkau2020-08-121-1/+1
| | | | | | | btif and wmac access the same resources and at the moment enabling one breaks the other Signed-off-by: Felix Fietkau <nbd@nbd.name>
* mediatek: fix PCI device tree node for elecom wrc-2533gentFelix Fietkau2020-08-121-2/+5
| | | | Signed-off-by: Felix Fietkau <nbd@nbd.name>
* kernel: Move CONFIG_IONIC to generic kernel configHauke Mehrtens2020-08-101-1/+0
| | | | | | | It is deactivated everywhere, just set this in the generic config. Acked-by: Yousong Zhou <yszhou4tech@gmail.com> Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
* mediatek: fix mt7622-rfb1 board supportFelix Fietkau2020-08-066-60/+67
| | | | | | | Make GPIO keys active-low. Add DSA support Signed-off-by: Felix Fietkau <nbd@nbd.name>
* kernel: unify CONFIG_GPIO_SYSFS in kernel configsFelix Fietkau2020-08-064-4/+0
| | | | | | Enable it for all platforms Signed-off-by: Felix Fietkau <nbd@nbd.name>
* target: replace remaining occurrences of ifconfig with ipAdrian Schmutzler2020-08-031-1/+1
| | | | | | | | | | | ifconfig is effectively deprecated for quite some time now. Let's replace the remaining occurrences for our target setup by the corresponding ip commands now. Note that this does not touch ar71xx, as it will be dropped anyway, and changing it would only make backports harder. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
* mediatek: mt7623: add full system image for UniElec U7623David Woodhouse2020-07-263-4/+48
| | | | | | | | | | | | | This adds a full eMMC image including U-Boot, which means that the kernel can inherit the true RAM size detected by the preloader. As implemented in previous commits, sysupgrade to this image from the legacy layout (and via that, from the vendor-installed image) is supported. Rename the legacy image for the 512MiB board, for clarity. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* mediatek: mt7623: rename gen_banana_pi_img.sh → gen_mtk_mmc_img.shDavid Woodhouse2020-07-263-11/+11
| | | | | | | As I buy more hardware and continue to work on consolidation, This will apply to a lot of MediaTek platforms; rename it accordingly. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* mediatek: mt7623: make gen_banana_pi_img.sh more genericDavid Woodhouse2020-07-262-15/+24
| | | | | | | | | | | This actually covers fairly much all the MediaTek platforms; they only have different images because they don't include the preloader and U-Boot, and rely on preinstalled stuff from the vendor. So this script can slowly take over the world as we complete the support for various other platforms, starting with UniElec U7623… Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* mediatek: mt7623: add scatter file for unbricking with SP Flash ToolDavid Woodhouse2020-07-262-0/+88
| | | | | | | | | | | | | | | | | | | | Many MediaTek SoCs can be unbricked by using the SP Flash Tool from http://spflashtool.com/ along with a "scatter list" file, which is just a text file listing which image gets loaded where. We use a trivial partition layout for the tool, with the whole eMMC image as a single "partition", which means users just need to unzip the sysupgrade image. Doing the real partition layout would be overly complex and would require the individual partitions to be shipped as artifacts — or users to extract them out of the sysupgrade image just for the tool to put them adjacent to each other on the eMMC anyway. The tool does require a copy of the preloader in order to operate, even when it isn't flashing the preloader to the eMMC boot region. So drop that into the bin directory as an artifact too. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
* mediatek: mt7623: build lzma fit for bpi-r2Chuanhong Guo2020-07-261-3/+0
| | | | | | | | | bpi-r2 images are shipped with mainline u-boot which can extract lzma with no problem. remove custom kernel recipe to build lzma fit image instead of uncompressed fit with zboot. Signed-off-by: Chuanhong Guo <gch981213@gmail.com>