From 67d3230d440ed9d416f5a1f1a20cc760403bac97 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Mon, 29 Aug 2022 20:06:44 +0200 Subject: [PATCH 1/7] Fix release version --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 4c832176..cab67892 100755 --- a/build.sh +++ b/build.sh @@ -42,7 +42,7 @@ SHORTCUT_FE=${SHORTCUT_FE:-no} #OMR_RELEASE=${OMR_RELEASE:-$(git describe --tags `git rev-list --tags --max-count=1` | sed 's/^\([0-9.]*\).*/\1/')} #OMR_RELEASE=${OMR_RELEASE:-$(git tag --sort=committerdate | tail -1)} OMR_RELEASE=${OMR_RELEASE:-$(git describe --tags `git rev-list --tags --max-count=1` | tail -1 | cut -d '-' -f1)} -OMR_REPO=${OMR_REPO:-http://$OMR_HOST:$OMR_PORT/release/$OMR_RELEASE/$OMR_TARGET} +OMR_REPO=${OMR_REPO:-http://$OMR_HOST:$OMR_PORT/release/$OMR_RELEASE-$OMR_KERNEL/$OMR_TARGET} OMR_FEED_URL="${OMR_FEED_URL:-https://github.com/ysurac/openmptcprouter-feeds}" OMR_FEED_SRC="${OMR_FEED_SRC:-develop}" @@ -149,7 +149,7 @@ fi cat >> "$OMR_TARGET/${OMR_KERNEL}/source/package/base-files/files/etc/banner" < Date: Fri, 9 Sep 2022 13:14:21 +0200 Subject: [PATCH 2/7] Remove mediatek related uboot packages to use upstream packages --- .../arm-trusted-firmware-mediatek/Makefile | 100 - .../patches/100-increase-nor-bl3-size.patch | 11 - root/package/boot/uboot-envtools/Makefile | 78 - root/package/boot/uboot-mediatek/Makefile | 142 - ...-clk-Add-debugging-for-return-values.patch | 69 - ...atek-add-more-network-configurations.patch | 44 - ...d-increase-the-minimum-bus-frequency.patch | 28 - ...support-for-MediaTek-SPI-NAND-flash-.patch | 3696 ----------------- ...15-mtd-mtk-snand-add-support-for-SPL.patch | 174 - ...v-add-support-for-generic-MTD-device.patch | 409 -- ...dd-support-for-booting-from-SPI-NAND.patch | 223 - ...board-mt7622-use-new-spi-nand-driver.patch | 76 - ...emove-unused-options-and-add-dm-comm.patch | 31 - ...22-enable-environment-for-mt7622_rfb.patch | 33 - .../patches/050-mt7622-enable-pstore.patch | 33 - ...00-scripts-remove-dependency-on-swig.patch | 24 - .../patches/110-no-kwbimage.patch | 10 - .../patches/120-use-xz-instead-of-lzma.patch | 11 - .../patches/200-cmd-add-imsz-and-imszb.patch | 132 - ...d-ability-to-select-item-by-shortkey.patch | 192 - .../211-cmd-bootmenu-custom-title.patch | 32 - .../patches/220-cmd-env-readmem.patch | 116 - .../patches/230-cmd-add-pstore-check.patch | 78 - .../patches/260-add-missing-type-u64.patch | 10 - ...-of-FIT-configuration-in-chosen-node.patch | 60 - ...7622-generic-reset-button-ignore-env.patch | 51 - ...7623-generic-reset-button-ignore-env.patch | 43 - ...50-add-support-for-Winbond-W25Q512JV.patch | 11 - .../patches/400-update-bpir2-defconfig.patch | 246 -- .../patches/401-update-u7623-defconfig.patch | 202 - ...-update-bananapi-bpi-r64-device-tree.patch | 71 - .../403-add-bananapi_bpi-r64-snand.patch | 33 - .../404-add-bananapi_bpi-r64_defconfigs.patch | 658 --- .../405-dts-mt7623n-bpi-r2-fix-leds.patch | 25 - .../patches/410-add-linksys-e8450.patch | 407 -- .../patches/412-add-ubnt-unifi-6-lr.patch | 454 -- .../500-board-mt7623-fix-mmc-detect.patch | 21 - 37 files changed, 8034 deletions(-) delete mode 100644 root/package/boot/arm-trusted-firmware-mediatek/Makefile delete mode 100644 root/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch delete mode 100644 root/package/boot/uboot-envtools/Makefile delete mode 100644 root/package/boot/uboot-mediatek/Makefile delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/301-mt7623-generic-reset-button-ignore-env.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch delete mode 100644 root/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch diff --git a/root/package/boot/arm-trusted-firmware-mediatek/Makefile b/root/package/boot/arm-trusted-firmware-mediatek/Makefile deleted file mode 100644 index 30488333..00000000 --- a/root/package/boot/arm-trusted-firmware-mediatek/Makefile +++ /dev/null @@ -1,100 +0,0 @@ -# -# Copyright (C) 2017 Hauke Mehrtens -# Copyright (C) 2021 Daniel Golle -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=arm-trusted-firmware-mediatek -PKG_RELEASE:=$(AUTORELEASE) - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL=https://github.com/mtk-openwrt/arm-trusted-firmware.git -PKG_SOURCE_DATE:=2021-05-08 -PKG_SOURCE_VERSION:=d2c75b2139be003887af9cc5a94da5e9bdc59de7 -PKG_MIRROR_HASH:=4af9ce8e11511afee7f588cc982946c06339edbfa47afef6a7f3e2231ac9f34d - -PKG_MAINTAINER:=Daniel Golle - -include $(INCLUDE_DIR)/trusted-firmware-a.mk -include $(INCLUDE_DIR)/package.mk - -define Trusted-Firmware-A/Default - BUILD_TARGET:=mediatek - BUILD_SUBTARGET:=mt7622 - PLAT:=mt7622 - TFA_IMAGE:=bl2.img bl31.bin - BOOT_DEVICE:= - DDR3_FLYBY:= -endef - -define Trusted-Firmware-A/mt7622-nor-1ddr - NAME:=MediaTek MT7622 (SPI-NOR, 1x DDR3) - BOOT_DEVICE:=nor -endef - -define Trusted-Firmware-A/mt7622-nor-2ddr - NAME:=MediaTek MT7622 (SPI-NOR, 2x DDR3) - BOOT_DEVICE:=nor - DDR3_FLYBY:=1 -endef - -define Trusted-Firmware-A/mt7622-snand-1ddr - NAME:=MediaTek MT7622 (SPI-NAND, 1x DDR3) - BOOT_DEVICE:=snand -endef - -define Trusted-Firmware-A/mt7622-snand-2ddr - NAME:=MediaTek MT7622 (SPI-NAND, 2x DDR3) - BOOT_DEVICE:=snand - DDR3_FLYBY:=1 -endef - -define Trusted-Firmware-A/mt7622-emmc-1ddr - NAME:=MediaTek MT7622 (eMMC, 1x DDR3) - BOOT_DEVICE:=emmc -endef - -define Trusted-Firmware-A/mt7622-emmc-2ddr - NAME:=MediaTek MT7622 (eMMC, 2x DDR3) - BOOT_DEVICE:=emmc - DDR3_FLYBY:=1 -endef - -define Trusted-Firmware-A/mt7622-sdmmc-1ddr - NAME:=MediaTek MT7622 (SDcard, 1x DDR3) - BOOT_DEVICE:=sdmmc -endef - -define Trusted-Firmware-A/mt7622-sdmmc-2ddr - NAME:=MediaTek MT7622 (SDcard, 2x DDR3) - BOOT_DEVICE:=sdmmc - DDR3_FLYBY:=1 -endef - -TFA_TARGETS:= \ - mt7622-nor-1ddr \ - mt7622-nor-2ddr \ - mt7622-snand-1ddr \ - mt7622-snand-2ddr \ - mt7622-emmc-1ddr \ - mt7622-emmc-2ddr \ - mt7622-sdmmc-1ddr \ - mt7622-sdmmc-2ddr - -TFA_MAKE_FLAGS += \ - BOOT_DEVICE=$(BOOT_DEVICE) \ - USE_MKIMAGE=1 MKIMAGE=$(STAGING_DIR_HOST)/bin/mkimage \ - $(if $(DDR3_FLYBY),DDR3_FLYBY=1) \ - all - -define Package/trusted-firmware-a/install - $(INSTALL_DIR) $(STAGING_DIR_IMAGE) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/mt7622/release/bl2.img $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl2.img - $(INSTALL_DATA) $(PKG_BUILD_DIR)/build/mt7622/release/bl31.bin $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-bl31.bin -endef - -$(eval $(call BuildPackage/Trusted-Firmware-A)) diff --git a/root/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch b/root/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch deleted file mode 100644 index 8de3cd77..00000000 --- a/root/package/boot/arm-trusted-firmware-mediatek/patches/100-increase-nor-bl3-size.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/plat/mediatek/mt7622/bl2_boot_nor.c -+++ b/plat/mediatek/mt7622/bl2_boot_nor.c -@@ -12,7 +12,7 @@ - #define MT7622_NOR_MAP_BASE 0x30000000 - - #define FIP_BASE 0x20000 --#define FIP_SIZE 0x80000 -+#define FIP_SIZE 0xa0000 - - const io_block_spec_t mtk_boot_dev_fip_spec = { - .offset = MT7622_NOR_MAP_BASE + FIP_BASE, diff --git a/root/package/boot/uboot-envtools/Makefile b/root/package/boot/uboot-envtools/Makefile deleted file mode 100644 index 5ea32d88..00000000 --- a/root/package/boot/uboot-envtools/Makefile +++ /dev/null @@ -1,78 +0,0 @@ -# -# Copyright (C) 2006-2014 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -include $(TOPDIR)/rules.mk - -PKG_NAME:=uboot-envtools -PKG_DISTNAME:=u-boot -PKG_VERSION:=2020.04 -PKG_RELEASE:=1 - -PKG_SOURCE_PROTO:=git -PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2 -PKG_SOURCE_SUBDIR:=$(PKG_DISTNAME)-$(PKG_VERSION) -PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_DISTNAME)-$(PKG_VERSION) -PKG_SOURCE_URL:=https://git.denx.de/u-boot.git -PKG_SOURCE_VERSION:=36fec02b1f90b92cf51ec531564f9284eae27ab4 -PKG_MIRROR_HASH:=fe732aaf037d9cc3c0909bad8362af366ae964bbdac6913a34081ff4ad565372 - -PKG_BUILD_DEPENDS:=fstools - -PKG_LICENSE:=GPL-2.0 GPL-2.0+ -PKG_LICENSE_FILES:=Licenses/README - -PKG_FLAGS:=nonshared - -PKG_BUILD_PARALLEL:=1 - -include $(INCLUDE_DIR)/package.mk - -define Package/uboot-envtools - SECTION:=utils - CATEGORY:=Utilities - SUBMENU:=Boot Loaders - TITLE:=read/modify U-Boot bootloader environment - URL:=http://www.denx.de/wiki/U-Boot -endef - -define Package/uboot-envtools/description - This package includes tools to read and modify U-Boot bootloader environment. -endef - -define Build/Configure - touch $(PKG_BUILD_DIR)/include/config.h - mkdir -p $(PKG_BUILD_DIR)/include/config - touch $(PKG_BUILD_DIR)/include/config/auto.conf - mkdir -p $(PKG_BUILD_DIR)/include/generated - touch $(PKG_BUILD_DIR)/include/generated/autoconf.h -endef - -MAKE_FLAGS += \ - TARGET_CFLAGS="$(TARGET_CFLAGS)" \ - TARGET_LDFLAGS="$(TARGET_LDFLAGS)" \ - no-dot-config-targets=envtools \ - envtools - -define Package/uboot-envtools/conffiles -/etc/config/ubootenv -/etc/fw_env.config -endef - -define Package/uboot-envtools/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/env/fw_printenv $(1)/usr/sbin - $(LN) fw_printenv $(1)/usr/sbin/fw_setenv - $(INSTALL_DIR) $(1)/lib - $(INSTALL_DATA) ./files/uboot-envtools.sh $(1)/lib - $(INSTALL_DIR) $(1)/etc/uci-defaults - $(if $(wildcard ./files/$(BOARD)), \ - $(INSTALL_DATA) ./files/$(BOARD) \ - $(1)/etc/uci-defaults/30_uboot-envtools \ - ) -endef - -$(eval $(call BuildPackage,uboot-envtools)) diff --git a/root/package/boot/uboot-mediatek/Makefile b/root/package/boot/uboot-mediatek/Makefile deleted file mode 100644 index bd380702..00000000 --- a/root/package/boot/uboot-mediatek/Makefile +++ /dev/null @@ -1,142 +0,0 @@ -include $(TOPDIR)/rules.mk -include $(INCLUDE_DIR)/kernel.mk - -PKG_VERSION:=2022.01 -PKG_HASH:=81b4543227db228c03f8a1bf5ddbc813b0bb8f6555ce46064ef721a6fc680413 -PKG_BUILD_DEPENDS:=arm-trusted-firmware-tools/host - -include $(INCLUDE_DIR)/u-boot.mk -include $(INCLUDE_DIR)/package.mk -include $(INCLUDE_DIR)/host-build.mk - -define U-Boot/Default - BUILD_TARGET:=mediatek - UBOOT_IMAGE:=u-boot-mtk.bin -endef - -define U-Boot/mt7622_rfb1 - NAME:=MT7622 Reference Board 1 - UBOOT_CONFIG:=mt7622_rfb - BUILD_DEVICES:=mediatek_mt7622-rfb1 mediatek_mt7622-rfb1-ubi - BUILD_SUBTARGET:=mt7622 -endef - -define U-Boot/mt7622_linksys_e8450 - NAME:=Linksys E8450 - UBOOT_CONFIG:=mt7622_linksys_e8450 - BUILD_DEVICES:=linksys_e8450-ubi - BUILD_SUBTARGET:=mt7622 - UBOOT_IMAGE:=u-boot.fip - BL2_BOOTDEV:=snand - BL2_DDRBLOB:=1 - DEPENDS:=+trusted-firmware-a-mt7622-snand-1ddr -endef - -define U-Boot/mt7622_bananapi_bpi-r64-emmc - NAME:=BananaPi R64 (eMMC) - UBOOT_CONFIG:=mt7622_bananapi_bpi-r64-emmc - BUILD_DEVICES:=bananapi_bpi-r64 - BUILD_SUBTARGET:=mt7622 - UBOOT_IMAGE:=u-boot.fip - BL2_BOOTDEV:=emmc - BL2_DDRBLOB:=2 - DEPENDS:=+trusted-firmware-a-mt7622-emmc-2ddr -endef - -define U-Boot/mt7622_bananapi_bpi-r64-sdmmc - NAME:=BananaPi R64 (SDMMC) - UBOOT_CONFIG:=mt7622_bananapi_bpi-r64-sdmmc - BUILD_DEVICES:=bananapi_bpi-r64 - BUILD_SUBTARGET:=mt7622 - UBOOT_IMAGE:=u-boot.fip - BL2_BOOTDEV:=sdmmc - BL2_DDRBLOB:=2 - DEPENDS:=+trusted-firmware-a-mt7622-sdmmc-2ddr -endef - -define U-Boot/mt7622_bananapi_bpi-r64-snand - NAME:=BananaPi R64 (SNAND) - UBOOT_CONFIG:=mt7622_bananapi_bpi-r64-snand - BUILD_DEVICES:=bananapi_bpi-r64 - BUILD_SUBTARGET:=mt7622 - UBOOT_IMAGE:=u-boot.fip - BL2_BOOTDEV:=snand - BL2_DDRBLOB:=2 - DEPENDS:=+trusted-firmware-a-mt7622-snand-2ddr -endef - -define U-Boot/mt7622_ubnt_unifi-6-lr - NAME:=Ubiquiti UniFi 6 LR - UBOOT_CONFIG:=mt7622_ubnt_unifi-6-lr - BUILD_DEVICES:=ubnt_unifi-6-lr-ubootmod - BUILD_SUBTARGET:=mt7622 - UBOOT_IMAGE:=u-boot.fip - BL2_BOOTDEV:=nor - BL2_DDRBLOB:=2 - DEPENDS:=+trusted-firmware-a-mt7622-nor-2ddr -endef - -define U-Boot/mt7623a_unielec_u7623 - NAME:=UniElec U7623 (mt7623) - BUILD_DEVICES:=unielec_u7623-02 - BUILD_SUBTARGET:=mt7623 - UBOOT_CONFIG:=mt7623a_unielec_u7623_02 -endef - -define U-Boot/mt7623n_bpir2 - NAME:=Banana Pi R2 (mt7623) - BUILD_DEVICES:=bananapi_bpi-r2 - BUILD_SUBTARGET:=mt7623 - UBOOT_IMAGE:=u-boot.bin - UBOOT_CONFIG:=mt7623n_bpir2 -endef - -define U-Boot/mt7629_rfb - NAME:=MT7629 Reference Board - BUILD_SUBTARGET:=mt7629 - BUILD_DEVICES:=mediatek_mt7629-rfb - UBOOT_CONFIG:=mt7629_rfb -endef - -UBOOT_TARGETS := \ - mt7622_bananapi_bpi-r64-emmc \ - mt7622_bananapi_bpi-r64-sdmmc \ - mt7622_bananapi_bpi-r64-snand \ - mt7622_linksys_e8450 \ - mt7622_rfb1 \ - mt7622_ubnt_unifi-6-lr \ - mt7623n_bpir2 \ - mt7623a_unielec_u7623 \ - mt7629_rfb - -UBOOT_MAKE_FLAGS += $(UBOOT_IMAGE:.fip=.bin) - -define Build/fip-image - $(STAGING_DIR_HOST)/bin/fiptool create \ - --soc-fw $(STAGING_DIR_IMAGE)/$(BUILD_SUBTARGET)-$(BL2_BOOTDEV)-$(BL2_DDRBLOB)ddr-bl31.bin \ - --nt-fw $(PKG_BUILD_DIR)/u-boot.bin \ - $(PKG_BUILD_DIR)/u-boot.fip -endef - -define Build/Configure - $(call Build/Configure/U-Boot) - sed -i 's/CONFIG_TOOLS_LIBCRYPTO=y/# CONFIG_TOOLS_LIBCRYPTO is not set/' $(PKG_BUILD_DIR)/.config -endef - -define Build/Compile - $(call Build/Compile/U-Boot) -ifeq ($(UBOOT_IMAGE),u-boot.fip)) - $(call Build/fip-image) -endif -endef - -# don't stage files to bindir, let target/linux/mediatek/image/*.mk do that -define Package/u-boot/install -endef - -define Build/InstallDev - $(INSTALL_DIR) $(STAGING_DIR_IMAGE) - $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(UBOOT_IMAGE) $(STAGING_DIR_IMAGE)/$(BUILD_VARIANT)-$(UBOOT_IMAGE) -endef - -$(eval $(call BuildPackage/U-Boot)) diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch deleted file mode 100644 index 1a0c1ce5..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-01-Revert-clk-Add-debugging-for-return-values.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 34ed9f6d3018d32c7c015e57c9985d3c4c07b706 Mon Sep 17 00:00:00 2001 -From: Daniel Golle -Date: Thu, 11 Mar 2021 10:28:53 +0000 -Subject: [PATCH 01/12] Revert "clk: Add debugging for return values" - -This reverts commit 5c5992cb90cf9ca4d51e38d9a95a13c293904df5. ---- - drivers/clk/clk-uclass.c | 16 +++++----------- - 1 file changed, 5 insertions(+), 11 deletions(-) - ---- a/drivers/clk/clk-uclass.c -+++ b/drivers/clk/clk-uclass.c -@@ -88,7 +88,7 @@ static int clk_get_by_index_tail(int ret - if (ret) { - debug("%s: uclass_get_device_by_of_offset failed: err=%d\n", - __func__, ret); -- return log_msg_ret("get", ret); -+ return ret; - } - - clk->dev = dev_clk; -@@ -101,15 +101,14 @@ static int clk_get_by_index_tail(int ret - ret = clk_of_xlate_default(clk, args); - if (ret) { - debug("of_xlate() failed: %d\n", ret); -- return log_msg_ret("xlate", ret); -+ return ret; - } - - return clk_request(dev_clk, clk); - err: - debug("%s: Node '%s', property '%s', failed to request CLK index %d: %d\n", - __func__, ofnode_get_name(node), list_name, index, ret); -- -- return log_msg_ret("prop", ret); -+ return ret; - } - - static int clk_get_by_indexed_prop(struct udevice *dev, const char *prop_name, -@@ -128,7 +127,7 @@ static int clk_get_by_indexed_prop(struc - if (ret) { - debug("%s: fdtdec_parse_phandle_with_args failed: err=%d\n", - __func__, ret); -- return log_ret(ret); -+ return ret; - } - - -@@ -501,7 +500,6 @@ int clk_free(struct clk *clk) - ulong clk_get_rate(struct clk *clk) - { - const struct clk_ops *ops; -- int ret; - - debug("%s(clk=%p)\n", __func__, clk); - if (!clk_valid(clk)) -@@ -511,11 +509,7 @@ ulong clk_get_rate(struct clk *clk) - if (!ops->get_rate) - return -ENOSYS; - -- ret = ops->get_rate(clk); -- if (ret) -- return log_ret(ret); -- -- return 0; -+ return ops->get_rate(clk); - } - - struct clk *clk_get_parent(struct clk *clk) diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch deleted file mode 100644 index 50c2ac2e..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-09-board-mediatek-add-more-network-configurations.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 938ba7ed996a86c9cc7af08b69df57b8b4c09510 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Tue, 2 Mar 2021 15:47:45 +0800 -Subject: [PATCH 02/12] board: mediatek: add more network configurations - -Make the network configurations uniform for mediatek boards - -Signed-off-by: Weijie Gao ---- - include/configs/mt7622.h | 3 ++- - include/configs/mt7623.h | 1 + - include/configs/mt7629.h | 1 + - 3 files changed, 4 insertions(+), 1 deletion(-) - ---- a/include/configs/mt7622.h -+++ b/include/configs/mt7622.h -@@ -30,6 +30,7 @@ - - /* Ethernet */ - #define CONFIG_IPADDR 192.168.1.1 --#define CONFIG_SERVERIP 192.168.1.3 -+#define CONFIG_SERVERIP 192.168.1.2 -+#define CONFIG_NETMASK 255.255.255.0 - - #endif ---- a/include/configs/mt7623.h -+++ b/include/configs/mt7623.h -@@ -45,6 +45,7 @@ - /* Ethernet */ - #define CONFIG_IPADDR 192.168.1.1 - #define CONFIG_SERVERIP 192.168.1.2 -+#define CONFIG_NETMASK 255.255.255.0 - - #ifdef CONFIG_DISTRO_DEFAULTS - ---- a/include/configs/mt7629.h -+++ b/include/configs/mt7629.h -@@ -45,5 +45,6 @@ - /* Ethernet */ - #define CONFIG_IPADDR 192.168.1.1 - #define CONFIG_SERVERIP 192.168.1.2 -+#define CONFIG_NETMASK 255.255.255.0 - - #endif diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch deleted file mode 100644 index 8f14a98f..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-10-mmc-mtk-sd-increase-the-minimum-bus-frequency.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 1d4fcea788e579934a1ad0a90cecd6e1761127d1 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Tue, 2 Mar 2021 15:56:17 +0800 -Subject: [PATCH 03/12] mmc: mtk-sd: increase the minimum bus frequency - -With a 48MHz input clock, the lowest bus frequency can be as low as -48000000 / (4 * 4095) = 2930Hz. Such an extremely low frequency will cause -the mmc framework take seconds to finish the initialization. - -Limiting the minimum bus frequency to a slightly higher value can solve the -issue without any side effects. - -Signed-off-by: Weijie Gao ---- - drivers/mmc/mtk-sd.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/mmc/mtk-sd.c -+++ b/drivers/mmc/mtk-sd.c -@@ -232,7 +232,7 @@ - - #define SCLK_CYCLES_SHIFT 20 - --#define MIN_BUS_CLK 200000 -+#define MIN_BUS_CLK 260000 - - #define CMD_INTS_MASK \ - (MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO) diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch deleted file mode 100644 index dead0db1..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-14-drivers-mtd-add-support-for-MediaTek-SPI-NAND-flash-.patch +++ /dev/null @@ -1,3696 +0,0 @@ -From d6c5309185aae3d9ecf80eae8b248522d11a6136 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Tue, 2 Mar 2021 16:58:01 +0800 -Subject: [PATCH 04/12] drivers: mtd: add support for MediaTek SPI-NAND flash - controller - -Add mtd driver for MediaTek SPI-NAND flash controller - -This driver is written from scratch, and uses standard mtd framework, not -the nand framework which only applies for raw parallel nand flashes so that -this driver can have a smaller size in binary. - -Signed-off-by: Weijie Gao ---- - drivers/mtd/Kconfig | 2 + - drivers/mtd/Makefile | 2 + - drivers/mtd/mtk-snand/Kconfig | 21 + - drivers/mtd/mtk-snand/Makefile | 11 + - drivers/mtd/mtk-snand/mtk-snand-def.h | 266 ++++ - drivers/mtd/mtk-snand/mtk-snand-ecc.c | 264 ++++ - drivers/mtd/mtk-snand/mtk-snand-ids.c | 511 +++++++ - drivers/mtd/mtk-snand/mtk-snand-mtd.c | 526 ++++++++ - drivers/mtd/mtk-snand/mtk-snand-os.c | 39 + - drivers/mtd/mtk-snand/mtk-snand-os.h | 120 ++ - drivers/mtd/mtk-snand/mtk-snand.c | 1776 +++++++++++++++++++++++++ - drivers/mtd/mtk-snand/mtk-snand.h | 77 ++ - 12 files changed, 3615 insertions(+) - create mode 100644 drivers/mtd/mtk-snand/Kconfig - create mode 100644 drivers/mtd/mtk-snand/Makefile - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-def.h - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-ecc.c - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-ids.c - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-mtd.c - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-os.c - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-os.h - create mode 100644 drivers/mtd/mtk-snand/mtk-snand.c - create mode 100644 drivers/mtd/mtk-snand/mtk-snand.h - ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -116,6 +116,8 @@ config STM32_FLASH - This is the driver of embedded flash for some STMicroelectronics - STM32 MCU. - -+source "drivers/mtd/mtk-snand/Kconfig" -+ - source "drivers/mtd/nand/Kconfig" - - config SYS_NAND_MAX_CHIPS ---- a/drivers/mtd/Makefile -+++ b/drivers/mtd/Makefile -@@ -39,3 +39,5 @@ obj-$(CONFIG_$(SPL_TPL_)SPI_FLASH_SUPPOR - obj-$(CONFIG_SPL_UBI) += ubispl/ - - endif -+ -+obj-$(CONFIG_MTK_SPI_NAND) += mtk-snand/ ---- /dev/null -+++ b/drivers/mtd/mtk-snand/Kconfig -@@ -0,0 +1,21 @@ -+# -+# Copyright (C) 2020 MediaTek Inc. All rights reserved. -+# Author: Weijie Gao -+# -+# SPDX-License-Identifier: GPL-2.0 -+# -+ -+config MTK_SPI_NAND -+ tristate "MediaTek SPI NAND flash controller driver" -+ depends on !MTD_SPI_NAND -+ help -+ This option enables access to SPI-NAND flashes through the -+ MediaTek SPI NAND Flash Controller -+ -+config MTK_SPI_NAND_MTD -+ tristate "MTD support for MediaTek SPI NAND flash controller" -+ depends on DM_MTD -+ depends on MTK_SPI_NAND -+ help -+ This option enables access to SPI-NAND flashes through the -+ MTD interface of MediaTek SPI NAND Flash Controller ---- /dev/null -+++ b/drivers/mtd/mtk-snand/Makefile -@@ -0,0 +1,11 @@ -+# -+# Copyright (C) 2020 MediaTek Inc. All rights reserved. -+# Author: Weijie Gao -+# -+# SPDX-License-Identifier: GPL-2.0 -+# -+ -+obj-y += mtk-snand.o mtk-snand-ecc.o mtk-snand-ids.o mtk-snand-os.o -+obj-$(CONFIG_MTK_SPI_NAND_MTD) += mtk-snand-mtd.o -+ -+ccflags-y += -DPRIVATE_MTK_SNAND_HEADER ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-def.h -@@ -0,0 +1,266 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#ifndef _MTK_SNAND_DEF_H_ -+#define _MTK_SNAND_DEF_H_ -+ -+#include "mtk-snand-os.h" -+ -+#ifdef PRIVATE_MTK_SNAND_HEADER -+#include "mtk-snand.h" -+#else -+#include -+#endif -+ -+struct mtk_snand_plat_dev; -+ -+enum snand_flash_io { -+ SNAND_IO_1_1_1, -+ SNAND_IO_1_1_2, -+ SNAND_IO_1_2_2, -+ SNAND_IO_1_1_4, -+ SNAND_IO_1_4_4, -+ -+ __SNAND_IO_MAX -+}; -+ -+#define SPI_IO_1_1_1 BIT(SNAND_IO_1_1_1) -+#define SPI_IO_1_1_2 BIT(SNAND_IO_1_1_2) -+#define SPI_IO_1_2_2 BIT(SNAND_IO_1_2_2) -+#define SPI_IO_1_1_4 BIT(SNAND_IO_1_1_4) -+#define SPI_IO_1_4_4 BIT(SNAND_IO_1_4_4) -+ -+struct snand_opcode { -+ uint8_t opcode; -+ uint8_t dummy; -+}; -+ -+struct snand_io_cap { -+ uint8_t caps; -+ struct snand_opcode opcodes[__SNAND_IO_MAX]; -+}; -+ -+#define SNAND_OP(_io, _opcode, _dummy) [_io] = { .opcode = (_opcode), \ -+ .dummy = (_dummy) } -+ -+#define SNAND_IO_CAP(_name, _caps, ...) \ -+ struct snand_io_cap _name = { .caps = (_caps), \ -+ .opcodes = { __VA_ARGS__ } } -+ -+#define SNAND_MAX_ID_LEN 4 -+ -+enum snand_id_type { -+ SNAND_ID_DYMMY, -+ SNAND_ID_ADDR = SNAND_ID_DYMMY, -+ SNAND_ID_DIRECT, -+ -+ __SNAND_ID_TYPE_MAX -+}; -+ -+struct snand_id { -+ uint8_t type; /* enum snand_id_type */ -+ uint8_t len; -+ uint8_t id[SNAND_MAX_ID_LEN]; -+}; -+ -+#define SNAND_ID(_type, ...) \ -+ { .type = (_type), .id = { __VA_ARGS__ }, \ -+ .len = sizeof((uint8_t[]) { __VA_ARGS__ }) } -+ -+struct snand_mem_org { -+ uint16_t pagesize; -+ uint16_t sparesize; -+ uint16_t pages_per_block; -+ uint16_t blocks_per_die; -+ uint16_t planes_per_die; -+ uint16_t ndies; -+}; -+ -+#define SNAND_MEMORG(_ps, _ss, _ppb, _bpd, _ppd, _nd) \ -+ { .pagesize = (_ps), .sparesize = (_ss), .pages_per_block = (_ppb), \ -+ .blocks_per_die = (_bpd), .planes_per_die = (_ppd), .ndies = (_nd) } -+ -+typedef int (*snand_select_die_t)(struct mtk_snand *snf, uint32_t dieidx); -+ -+struct snand_flash_info { -+ const char *model; -+ struct snand_id id; -+ const struct snand_mem_org memorg; -+ const struct snand_io_cap *cap_rd; -+ const struct snand_io_cap *cap_pl; -+ snand_select_die_t select_die; -+}; -+ -+#define SNAND_INFO(_model, _id, _memorg, _cap_rd, _cap_pl, ...) \ -+ { .model = (_model), .id = _id, .memorg = _memorg, \ -+ .cap_rd = (_cap_rd), .cap_pl = (_cap_pl), __VA_ARGS__ } -+ -+const struct snand_flash_info *snand_flash_id_lookup(enum snand_id_type type, -+ const uint8_t *id); -+ -+struct mtk_snand_soc_data { -+ uint16_t sector_size; -+ uint16_t max_sectors; -+ uint16_t fdm_size; -+ uint16_t fdm_ecc_size; -+ uint16_t fifo_size; -+ -+ bool bbm_swap; -+ bool empty_page_check; -+ uint32_t mastersta_mask; -+ -+ const uint8_t *spare_sizes; -+ uint32_t num_spare_size; -+}; -+ -+enum mtk_ecc_regs { -+ ECC_DECDONE, -+}; -+ -+struct mtk_ecc_soc_data { -+ const uint8_t *ecc_caps; -+ uint32_t num_ecc_cap; -+ const uint32_t *regs; -+ uint16_t mode_shift; -+ uint8_t errnum_bits; -+ uint8_t errnum_shift; -+}; -+ -+struct mtk_snand { -+ struct mtk_snand_plat_dev *pdev; -+ -+ void __iomem *nfi_base; -+ void __iomem *ecc_base; -+ -+ enum mtk_snand_soc soc; -+ const struct mtk_snand_soc_data *nfi_soc; -+ const struct mtk_ecc_soc_data *ecc_soc; -+ bool snfi_quad_spi; -+ bool quad_spi_op; -+ -+ const char *model; -+ uint64_t size; -+ uint64_t die_size; -+ uint32_t erasesize; -+ uint32_t writesize; -+ uint32_t oobsize; -+ -+ uint32_t num_dies; -+ snand_select_die_t select_die; -+ -+ uint8_t opcode_rfc; -+ uint8_t opcode_pl; -+ uint8_t dummy_rfc; -+ uint8_t mode_rfc; -+ uint8_t mode_pl; -+ -+ uint32_t writesize_mask; -+ uint32_t writesize_shift; -+ uint32_t erasesize_mask; -+ uint32_t erasesize_shift; -+ uint64_t die_mask; -+ uint32_t die_shift; -+ -+ uint32_t spare_per_sector; -+ uint32_t raw_sector_size; -+ uint32_t ecc_strength; -+ uint32_t ecc_steps; -+ uint32_t ecc_bytes; -+ uint32_t ecc_parity_bits; -+ -+ uint8_t *page_cache; /* Used by read/write page */ -+ uint8_t *buf_cache; /* Used by block bad/markbad & auto_oob */ -+}; -+ -+enum mtk_snand_log_category { -+ SNAND_LOG_NFI, -+ SNAND_LOG_SNFI, -+ SNAND_LOG_ECC, -+ SNAND_LOG_CHIP, -+ -+ __SNAND_LOG_CAT_MAX -+}; -+ -+int mtk_ecc_setup(struct mtk_snand *snf, void *fmdaddr, uint32_t max_ecc_bytes, -+ uint32_t msg_size); -+int mtk_snand_ecc_encoder_start(struct mtk_snand *snf); -+void mtk_snand_ecc_encoder_stop(struct mtk_snand *snf); -+int mtk_snand_ecc_decoder_start(struct mtk_snand *snf); -+void mtk_snand_ecc_decoder_stop(struct mtk_snand *snf); -+int mtk_ecc_wait_decoder_done(struct mtk_snand *snf); -+int mtk_ecc_check_decode_error(struct mtk_snand *snf, uint32_t page); -+ -+int mtk_snand_mac_io(struct mtk_snand *snf, const uint8_t *out, uint32_t outlen, -+ uint8_t *in, uint32_t inlen); -+int mtk_snand_set_feature(struct mtk_snand *snf, uint32_t addr, uint32_t val); -+ -+int mtk_snand_log(struct mtk_snand_plat_dev *pdev, -+ enum mtk_snand_log_category cat, const char *fmt, ...); -+ -+#define snand_log_nfi(pdev, fmt, ...) \ -+ mtk_snand_log(pdev, SNAND_LOG_NFI, fmt, ##__VA_ARGS__) -+ -+#define snand_log_snfi(pdev, fmt, ...) \ -+ mtk_snand_log(pdev, SNAND_LOG_SNFI, fmt, ##__VA_ARGS__) -+ -+#define snand_log_ecc(pdev, fmt, ...) \ -+ mtk_snand_log(pdev, SNAND_LOG_ECC, fmt, ##__VA_ARGS__) -+ -+#define snand_log_chip(pdev, fmt, ...) \ -+ mtk_snand_log(pdev, SNAND_LOG_CHIP, fmt, ##__VA_ARGS__) -+ -+/* ffs64 */ -+static inline int mtk_snand_ffs64(uint64_t x) -+{ -+ if (!x) -+ return 0; -+ -+ if (!(x & 0xffffffff)) -+ return ffs((uint32_t)(x >> 32)) + 32; -+ -+ return ffs((uint32_t)(x & 0xffffffff)); -+} -+ -+/* NFI dummy commands */ -+#define NFI_CMD_DUMMY_READ 0x00 -+#define NFI_CMD_DUMMY_WRITE 0x80 -+ -+/* SPI-NAND opcodes */ -+#define SNAND_CMD_RESET 0xff -+#define SNAND_CMD_BLOCK_ERASE 0xd8 -+#define SNAND_CMD_READ_FROM_CACHE_QUAD 0xeb -+#define SNAND_CMD_WINBOND_SELECT_DIE 0xc2 -+#define SNAND_CMD_READ_FROM_CACHE_DUAL 0xbb -+#define SNAND_CMD_READID 0x9f -+#define SNAND_CMD_READ_FROM_CACHE_X4 0x6b -+#define SNAND_CMD_READ_FROM_CACHE_X2 0x3b -+#define SNAND_CMD_PROGRAM_LOAD_X4 0x32 -+#define SNAND_CMD_SET_FEATURE 0x1f -+#define SNAND_CMD_READ_TO_CACHE 0x13 -+#define SNAND_CMD_PROGRAM_EXECUTE 0x10 -+#define SNAND_CMD_GET_FEATURE 0x0f -+#define SNAND_CMD_READ_FROM_CACHE 0x0b -+#define SNAND_CMD_WRITE_ENABLE 0x06 -+#define SNAND_CMD_PROGRAM_LOAD 0x02 -+ -+/* SPI-NAND feature addresses */ -+#define SNAND_FEATURE_MICRON_DIE_ADDR 0xd0 -+#define SNAND_MICRON_DIE_SEL_1 BIT(6) -+ -+#define SNAND_FEATURE_STATUS_ADDR 0xc0 -+#define SNAND_STATUS_OIP BIT(0) -+#define SNAND_STATUS_WEL BIT(1) -+#define SNAND_STATUS_ERASE_FAIL BIT(2) -+#define SNAND_STATUS_PROGRAM_FAIL BIT(3) -+ -+#define SNAND_FEATURE_CONFIG_ADDR 0xb0 -+#define SNAND_FEATURE_QUAD_ENABLE BIT(0) -+#define SNAND_FEATURE_ECC_EN BIT(4) -+ -+#define SNAND_FEATURE_PROTECT_ADDR 0xa0 -+ -+#endif /* _MTK_SNAND_DEF_H_ */ ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-ecc.c -@@ -0,0 +1,264 @@ -+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include "mtk-snand-def.h" -+ -+/* ECC registers */ -+#define ECC_ENCCON 0x000 -+#define ENC_EN BIT(0) -+ -+#define ECC_ENCCNFG 0x004 -+#define ENC_MS_S 16 -+#define ENC_BURST_EN BIT(8) -+#define ENC_TNUM_S 0 -+ -+#define ECC_ENCIDLE 0x00c -+#define ENC_IDLE BIT(0) -+ -+#define ECC_DECCON 0x100 -+#define DEC_EN BIT(0) -+ -+#define ECC_DECCNFG 0x104 -+#define DEC_EMPTY_EN BIT(31) -+#define DEC_CS_S 16 -+#define DEC_CON_S 12 -+#define DEC_CON_CORRECT 3 -+#define DEC_BURST_EN BIT(8) -+#define DEC_TNUM_S 0 -+ -+#define ECC_DECIDLE 0x10c -+#define DEC_IDLE BIT(0) -+ -+#define ECC_DECENUM0 0x114 -+#define ECC_DECENUM(n) (ECC_DECENUM0 + (n) * 4) -+ -+/* ECC_ENCIDLE & ECC_DECIDLE */ -+#define ECC_IDLE BIT(0) -+ -+/* ENC_MODE & DEC_MODE */ -+#define ECC_MODE_NFI 1 -+ -+#define ECC_TIMEOUT 500000 -+ -+static const uint8_t mt7622_ecc_caps[] = { 4, 6, 8, 10, 12 }; -+ -+static const uint8_t mt7986_ecc_caps[] = { -+ 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 -+}; -+ -+static const uint32_t mt7622_ecc_regs[] = { -+ [ECC_DECDONE] = 0x11c, -+}; -+ -+static const uint32_t mt7986_ecc_regs[] = { -+ [ECC_DECDONE] = 0x124, -+}; -+ -+static const struct mtk_ecc_soc_data mtk_ecc_socs[__SNAND_SOC_MAX] = { -+ [SNAND_SOC_MT7622] = { -+ .ecc_caps = mt7622_ecc_caps, -+ .num_ecc_cap = ARRAY_SIZE(mt7622_ecc_caps), -+ .regs = mt7622_ecc_regs, -+ .mode_shift = 4, -+ .errnum_bits = 5, -+ .errnum_shift = 5, -+ }, -+ [SNAND_SOC_MT7629] = { -+ .ecc_caps = mt7622_ecc_caps, -+ .num_ecc_cap = ARRAY_SIZE(mt7622_ecc_caps), -+ .regs = mt7622_ecc_regs, -+ .mode_shift = 4, -+ .errnum_bits = 5, -+ .errnum_shift = 5, -+ }, -+ [SNAND_SOC_MT7986] = { -+ .ecc_caps = mt7986_ecc_caps, -+ .num_ecc_cap = ARRAY_SIZE(mt7986_ecc_caps), -+ .regs = mt7986_ecc_regs, -+ .mode_shift = 5, -+ .errnum_bits = 5, -+ .errnum_shift = 8, -+ }, -+}; -+ -+static inline uint32_t ecc_read32(struct mtk_snand *snf, uint32_t reg) -+{ -+ return readl(snf->ecc_base + reg); -+} -+ -+static inline void ecc_write32(struct mtk_snand *snf, uint32_t reg, -+ uint32_t val) -+{ -+ writel(val, snf->ecc_base + reg); -+} -+ -+static inline void ecc_write16(struct mtk_snand *snf, uint32_t reg, -+ uint16_t val) -+{ -+ writew(val, snf->ecc_base + reg); -+} -+ -+static int mtk_ecc_poll(struct mtk_snand *snf, uint32_t reg, uint32_t bits) -+{ -+ uint32_t val; -+ -+ return read16_poll_timeout(snf->ecc_base + reg, val, (val & bits), 0, -+ ECC_TIMEOUT); -+} -+ -+static int mtk_ecc_wait_idle(struct mtk_snand *snf, uint32_t reg) -+{ -+ int ret; -+ -+ ret = mtk_ecc_poll(snf, reg, ECC_IDLE); -+ if (ret) { -+ snand_log_ecc(snf->pdev, "ECC engine is busy\n"); -+ return -EBUSY; -+ } -+ -+ return 0; -+} -+ -+int mtk_ecc_setup(struct mtk_snand *snf, void *fmdaddr, uint32_t max_ecc_bytes, -+ uint32_t msg_size) -+{ -+ uint32_t i, val, ecc_msg_bits, ecc_strength; -+ int ret; -+ -+ snf->ecc_soc = &mtk_ecc_socs[snf->soc]; -+ -+ snf->ecc_parity_bits = fls(1 + 8 * msg_size); -+ ecc_strength = max_ecc_bytes * 8 / snf->ecc_parity_bits; -+ -+ for (i = snf->ecc_soc->num_ecc_cap - 1; i >= 0; i--) { -+ if (snf->ecc_soc->ecc_caps[i] <= ecc_strength) -+ break; -+ } -+ -+ if (unlikely(i < 0)) { -+ snand_log_ecc(snf->pdev, "Page size %u+%u is not supported\n", -+ snf->writesize, snf->oobsize); -+ return -ENOTSUPP; -+ } -+ -+ snf->ecc_strength = snf->ecc_soc->ecc_caps[i]; -+ snf->ecc_bytes = DIV_ROUND_UP(snf->ecc_strength * snf->ecc_parity_bits, -+ 8); -+ -+ /* Encoder config */ -+ ecc_write16(snf, ECC_ENCCON, 0); -+ ret = mtk_ecc_wait_idle(snf, ECC_ENCIDLE); -+ if (ret) -+ return ret; -+ -+ ecc_msg_bits = msg_size * 8; -+ val = (ecc_msg_bits << ENC_MS_S) | -+ (ECC_MODE_NFI << snf->ecc_soc->mode_shift) | i; -+ ecc_write32(snf, ECC_ENCCNFG, val); -+ -+ /* Decoder config */ -+ ecc_write16(snf, ECC_DECCON, 0); -+ ret = mtk_ecc_wait_idle(snf, ECC_DECIDLE); -+ if (ret) -+ return ret; -+ -+ ecc_msg_bits += snf->ecc_strength * snf->ecc_parity_bits; -+ val = DEC_EMPTY_EN | (ecc_msg_bits << DEC_CS_S) | -+ (DEC_CON_CORRECT << DEC_CON_S) | -+ (ECC_MODE_NFI << snf->ecc_soc->mode_shift) | i; -+ ecc_write32(snf, ECC_DECCNFG, val); -+ -+ return 0; -+} -+ -+int mtk_snand_ecc_encoder_start(struct mtk_snand *snf) -+{ -+ int ret; -+ -+ ret = mtk_ecc_wait_idle(snf, ECC_ENCIDLE); -+ if (ret) { -+ ecc_write16(snf, ECC_ENCCON, 0); -+ mtk_ecc_wait_idle(snf, ECC_ENCIDLE); -+ } -+ -+ ecc_write16(snf, ECC_ENCCON, ENC_EN); -+ -+ return 0; -+} -+ -+void mtk_snand_ecc_encoder_stop(struct mtk_snand *snf) -+{ -+ mtk_ecc_wait_idle(snf, ECC_ENCIDLE); -+ ecc_write16(snf, ECC_ENCCON, 0); -+} -+ -+int mtk_snand_ecc_decoder_start(struct mtk_snand *snf) -+{ -+ int ret; -+ -+ ret = mtk_ecc_wait_idle(snf, ECC_DECIDLE); -+ if (ret) { -+ ecc_write16(snf, ECC_DECCON, 0); -+ mtk_ecc_wait_idle(snf, ECC_DECIDLE); -+ } -+ -+ ecc_write16(snf, ECC_DECCON, DEC_EN); -+ -+ return 0; -+} -+ -+void mtk_snand_ecc_decoder_stop(struct mtk_snand *snf) -+{ -+ mtk_ecc_wait_idle(snf, ECC_DECIDLE); -+ ecc_write16(snf, ECC_DECCON, 0); -+} -+ -+int mtk_ecc_wait_decoder_done(struct mtk_snand *snf) -+{ -+ uint16_t val, step_mask = (1 << snf->ecc_steps) - 1; -+ uint32_t reg = snf->ecc_soc->regs[ECC_DECDONE]; -+ int ret; -+ -+ ret = read16_poll_timeout(snf->ecc_base + reg, val, -+ (val & step_mask) == step_mask, 0, -+ ECC_TIMEOUT); -+ if (ret) -+ snand_log_ecc(snf->pdev, "ECC decoder is busy\n"); -+ -+ return ret; -+} -+ -+int mtk_ecc_check_decode_error(struct mtk_snand *snf, uint32_t page) -+{ -+ uint32_t i, regi, fi, errnum; -+ uint32_t errnum_shift = snf->ecc_soc->errnum_shift; -+ uint32_t errnum_mask = (1 << snf->ecc_soc->errnum_bits) - 1; -+ int ret = 0; -+ -+ for (i = 0; i < snf->ecc_steps; i++) { -+ regi = i / 4; -+ fi = i % 4; -+ -+ errnum = ecc_read32(snf, ECC_DECENUM(regi)); -+ errnum = (errnum >> (fi * errnum_shift)) & errnum_mask; -+ if (!errnum) -+ continue; -+ -+ if (errnum <= snf->ecc_strength) { -+ if (ret >= 0) -+ ret += errnum; -+ continue; -+ } -+ -+ snand_log_ecc(snf->pdev, -+ "Uncorrectable bitflips in page %u sect %u\n", -+ page, i); -+ ret = -EBADMSG; -+ } -+ -+ return ret; -+} ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-ids.c -@@ -0,0 +1,511 @@ -+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include "mtk-snand-def.h" -+ -+static int mtk_snand_winbond_select_die(struct mtk_snand *snf, uint32_t dieidx); -+static int mtk_snand_micron_select_die(struct mtk_snand *snf, uint32_t dieidx); -+ -+#define SNAND_MEMORG_512M_2K_64 SNAND_MEMORG(2048, 64, 64, 512, 1, 1) -+#define SNAND_MEMORG_1G_2K_64 SNAND_MEMORG(2048, 64, 64, 1024, 1, 1) -+#define SNAND_MEMORG_2G_2K_64 SNAND_MEMORG(2048, 64, 64, 2048, 1, 1) -+#define SNAND_MEMORG_2G_2K_120 SNAND_MEMORG(2048, 120, 64, 2048, 1, 1) -+#define SNAND_MEMORG_4G_2K_64 SNAND_MEMORG(2048, 64, 64, 4096, 1, 1) -+#define SNAND_MEMORG_1G_2K_120 SNAND_MEMORG(2048, 120, 64, 1024, 1, 1) -+#define SNAND_MEMORG_1G_2K_128 SNAND_MEMORG(2048, 128, 64, 1024, 1, 1) -+#define SNAND_MEMORG_2G_2K_128 SNAND_MEMORG(2048, 128, 64, 2048, 1, 1) -+#define SNAND_MEMORG_4G_2K_128 SNAND_MEMORG(2048, 128, 64, 4096, 1, 1) -+#define SNAND_MEMORG_4G_4K_240 SNAND_MEMORG(4096, 240, 64, 2048, 1, 1) -+#define SNAND_MEMORG_4G_4K_256 SNAND_MEMORG(4096, 256, 64, 2048, 1, 1) -+#define SNAND_MEMORG_8G_4K_256 SNAND_MEMORG(4096, 256, 64, 4096, 1, 1) -+#define SNAND_MEMORG_2G_2K_64_2P SNAND_MEMORG(2048, 64, 64, 2048, 2, 1) -+#define SNAND_MEMORG_2G_2K_64_2D SNAND_MEMORG(2048, 64, 64, 1024, 1, 2) -+#define SNAND_MEMORG_2G_2K_128_2P SNAND_MEMORG(2048, 128, 64, 2048, 2, 1) -+#define SNAND_MEMORG_4G_2K_64_2P SNAND_MEMORG(2048, 64, 64, 4096, 2, 1) -+#define SNAND_MEMORG_4G_2K_128_2P_2D SNAND_MEMORG(2048, 128, 64, 2048, 2, 2) -+#define SNAND_MEMORG_8G_4K_256_2D SNAND_MEMORG(4096, 256, 64, 2048, 1, 2) -+ -+static const SNAND_IO_CAP(snand_cap_read_from_cache_quad, -+ SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 | -+ SPI_IO_1_4_4, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8), -+ SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8), -+ SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 4), -+ SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8), -+ SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 4)); -+ -+static const SNAND_IO_CAP(snand_cap_read_from_cache_quad_q2d, -+ SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 | -+ SPI_IO_1_4_4, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8), -+ SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8), -+ SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 4), -+ SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8), -+ SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 2)); -+ -+static const SNAND_IO_CAP(snand_cap_read_from_cache_quad_a8d, -+ SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2 | SPI_IO_1_1_4 | -+ SPI_IO_1_4_4, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8), -+ SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8), -+ SNAND_OP(SNAND_IO_1_2_2, SNAND_CMD_READ_FROM_CACHE_DUAL, 8), -+ SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8), -+ SNAND_OP(SNAND_IO_1_4_4, SNAND_CMD_READ_FROM_CACHE_QUAD, 8)); -+ -+static const SNAND_IO_CAP(snand_cap_read_from_cache_x4, -+ SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_1_4, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8), -+ SNAND_OP(SNAND_IO_1_1_2, SNAND_CMD_READ_FROM_CACHE_X2, 8), -+ SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8)); -+ -+static const SNAND_IO_CAP(snand_cap_read_from_cache_x4_only, -+ SPI_IO_1_1_1 | SPI_IO_1_1_4, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_READ_FROM_CACHE, 8), -+ SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_READ_FROM_CACHE_X4, 8)); -+ -+static const SNAND_IO_CAP(snand_cap_program_load_x1, -+ SPI_IO_1_1_1, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_PROGRAM_LOAD, 0)); -+ -+static const SNAND_IO_CAP(snand_cap_program_load_x4, -+ SPI_IO_1_1_1 | SPI_IO_1_1_4, -+ SNAND_OP(SNAND_IO_1_1_1, SNAND_CMD_PROGRAM_LOAD, 0), -+ SNAND_OP(SNAND_IO_1_1_4, SNAND_CMD_PROGRAM_LOAD_X4, 0)); -+ -+static const struct snand_flash_info snand_flash_ids[] = { -+ SNAND_INFO("W25N512GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x20), -+ SNAND_MEMORG_512M_2K_64, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("W25N01GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x21), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("W25M02GV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xab, 0x21), -+ SNAND_MEMORG_2G_2K_64_2D, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4, -+ mtk_snand_winbond_select_die), -+ SNAND_INFO("W25N02KV", SNAND_ID(SNAND_ID_DYMMY, 0xef, 0xaa, 0x22), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("GD5F1GQ4UAWxx", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0x10), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F1GQ4UExIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd1), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F1GQ4UExxH", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd9), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F1GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf1), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F2GQ4UExIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd2), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F2GQ5UExxH", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0x32), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_a8d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F2GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf2), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F4GQ4UBxIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xd4), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F4GQ4xAYIG", SNAND_ID(SNAND_ID_ADDR, 0xc8, 0xf4), -+ SNAND_MEMORG_4G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F2GQ5UExxG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x52), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("GD5F4GQ4UCxIG", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0xb4), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("MX35LF1GE4AB", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x12), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF1G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x14), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX31LF1GE4BC", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x1e), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF2GE4AB", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x22), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF2G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x24), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF2GE4AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x26), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF2G14AC", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x20), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF4G24AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x35), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MX35LF4GE4AD", SNAND_ID(SNAND_ID_DYMMY, 0xc2, 0x37), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("MT29F1G01AAADD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x12), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x1), -+ SNAND_INFO("MT29F1G01ABAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x14), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MT29F2G01AAAED", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x9f), -+ SNAND_MEMORG_2G_2K_64_2P, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x1), -+ SNAND_INFO("MT29F2G01ABAGD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x24), -+ SNAND_MEMORG_2G_2K_128_2P, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MT29F4G01AAADD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x32), -+ SNAND_MEMORG_4G_2K_64_2P, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x1), -+ SNAND_INFO("MT29F4G01ABAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x34), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("MT29F4G01ADAGD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x36), -+ SNAND_MEMORG_4G_2K_128_2P_2D, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4, -+ mtk_snand_micron_select_die), -+ SNAND_INFO("MT29F8G01ADAFD", SNAND_ID(SNAND_ID_DYMMY, 0x2c, 0x46), -+ SNAND_MEMORG_8G_4K_256_2D, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4, -+ mtk_snand_micron_select_die), -+ -+ SNAND_INFO("TC58CVG0S3HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xc2), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x1), -+ SNAND_INFO("TC58CVG1S3HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xcb), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x1), -+ SNAND_INFO("TC58CVG2S0HRAIG", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xcd), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x1), -+ SNAND_INFO("TC58CVG0S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xe2), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("TC58CVG1S3HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xeb), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("TC58CVG2S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xed), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("TH58CVG3S0HRAIJ", SNAND_ID(SNAND_ID_DYMMY, 0x98, 0xe4), -+ SNAND_MEMORG_8G_4K_256, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("F50L512M41A", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x20), -+ SNAND_MEMORG_512M_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("F50L1G41A", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x21), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("F50L1G41LB", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x01), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("F50L2G41LB", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x0a), -+ SNAND_MEMORG_2G_2K_64_2D, -+ &snand_cap_read_from_cache_quad, -+ &snand_cap_program_load_x4, -+ mtk_snand_winbond_select_die), -+ -+ SNAND_INFO("CS11G0T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x00), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("CS11G0G0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x10), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("CS11G0S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x20), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("CS11G1T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x01), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("CS11G1S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x21), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("CS11G2T0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x02), -+ SNAND_MEMORG_4G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("CS11G2S0A0AA", SNAND_ID(SNAND_ID_DYMMY, 0x6b, 0x22), -+ SNAND_MEMORG_4G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("EM73B044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x01), -+ SNAND_MEMORG_512M_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x11), -+ SNAND_MEMORG_1G_2K_120, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044SNF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x09), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x18), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x19), -+ SNAND_MEMORG(2048, 64, 128, 512, 1, 1), -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044VCD", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1c), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1d), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1e), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044VCC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x22), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044VCF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x25), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044SNC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x31), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044SNC", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0a), -+ SNAND_MEMORG_2G_2K_120, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x12), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044SNF", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x10), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x13), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x14), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCD", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x17), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCH", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1b), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1d), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCG", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x1f), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCE", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x20), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCL", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2e), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x32), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73E044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x03), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73E044SND", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0b), -+ SNAND_MEMORG_4G_4K_240, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73E044SNB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x23), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73E044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2c), -+ SNAND_MEMORG_4G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73E044VCB", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2f), -+ SNAND_MEMORG_4G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73F044SNA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x24), -+ SNAND_MEMORG_8G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73F044VCA", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x2d), -+ SNAND_MEMORG_8G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73E044SNE", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0e), -+ SNAND_MEMORG_8G_4K_256, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73C044SNG", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0c), -+ SNAND_MEMORG_1G_2K_120, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("EM73D044VCN", SNAND_ID(SNAND_ID_DYMMY, 0xd5, 0x0f), -+ SNAND_MEMORG_2G_2K_64, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("FM35Q1GA", SNAND_ID(SNAND_ID_DYMMY, 0xe5, 0x71), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("PN26G01A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe1), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("PN26G02A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe2), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("IS37SML01G1", SNAND_ID(SNAND_ID_DYMMY, 0xc8, 0x21), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("ATO25D1GA", SNAND_ID(SNAND_ID_DYMMY, 0x9b, 0x12), -+ SNAND_MEMORG_1G_2K_64, -+ &snand_cap_read_from_cache_x4_only, -+ &snand_cap_program_load_x4), -+ -+ SNAND_INFO("HYF1GQ4U", SNAND_ID(SNAND_ID_DYMMY, 0xc9, 0x51), -+ SNAND_MEMORG_1G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+ SNAND_INFO("HYF2GQ4U", SNAND_ID(SNAND_ID_DYMMY, 0xc9, 0x52), -+ SNAND_MEMORG_2G_2K_128, -+ &snand_cap_read_from_cache_quad_q2d, -+ &snand_cap_program_load_x4), -+}; -+ -+static int mtk_snand_winbond_select_die(struct mtk_snand *snf, uint32_t dieidx) -+{ -+ uint8_t op[2]; -+ -+ if (dieidx > 1) { -+ snand_log_chip(snf->pdev, "Invalid die index %u\n", dieidx); -+ return -EINVAL; -+ } -+ -+ op[0] = SNAND_CMD_WINBOND_SELECT_DIE; -+ op[1] = (uint8_t)dieidx; -+ -+ return mtk_snand_mac_io(snf, op, sizeof(op), NULL, 0); -+} -+ -+static int mtk_snand_micron_select_die(struct mtk_snand *snf, uint32_t dieidx) -+{ -+ int ret; -+ -+ if (dieidx > 1) { -+ snand_log_chip(snf->pdev, "Invalid die index %u\n", dieidx); -+ return -EINVAL; -+ } -+ -+ ret = mtk_snand_set_feature(snf, SNAND_FEATURE_MICRON_DIE_ADDR, -+ SNAND_MICRON_DIE_SEL_1); -+ if (ret) { -+ snand_log_chip(snf->pdev, -+ "Failed to set die selection feature\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+const struct snand_flash_info *snand_flash_id_lookup(enum snand_id_type type, -+ const uint8_t *id) -+{ -+ const struct snand_id *fid; -+ uint32_t i; -+ -+ for (i = 0; i < ARRAY_SIZE(snand_flash_ids); i++) { -+ if (snand_flash_ids[i].id.type != type) -+ continue; -+ -+ fid = &snand_flash_ids[i].id; -+ if (memcmp(fid->id, id, fid->len)) -+ continue; -+ -+ return &snand_flash_ids[i]; -+ } -+ -+ return NULL; -+} ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-mtd.c -@@ -0,0 +1,524 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "mtk-snand.h" -+ -+struct mtk_snand_mtd { -+ struct udevice *dev; -+ struct mtk_snand *snf; -+ struct mtk_snand_chip_info cinfo; -+ uint8_t *page_cache; -+}; -+ -+static const char snand_mtd_name_prefix[] = "spi-nand"; -+ -+static u32 snandidx; -+ -+static inline struct mtk_snand_mtd *mtd_to_msm(struct mtd_info *mtd) -+{ -+ return mtd->priv; -+} -+ -+static int mtk_snand_mtd_erase(struct mtd_info *mtd, struct erase_info *instr) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ u64 start_addr, end_addr; -+ int ret; -+ -+ /* Do not allow write past end of device */ -+ if ((instr->addr + instr->len) > mtd->size) { -+ pr_debug("%s: attempt to erase beyond end of device\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ start_addr = instr->addr & (~mtd->erasesize_mask); -+ end_addr = instr->addr + instr->len; -+ if (end_addr & mtd->erasesize_mask) { -+ end_addr = (end_addr + mtd->erasesize_mask) & -+ (~mtd->erasesize_mask); -+ } -+ -+ instr->state = MTD_ERASING; -+ -+ while (start_addr < end_addr) { -+ WATCHDOG_RESET(); -+ -+ if (mtk_snand_block_isbad(msm->snf, start_addr)) { -+ if (!instr->scrub) { -+ instr->fail_addr = start_addr; -+ ret = -EIO; -+ break; -+ } -+ } -+ -+ ret = mtk_snand_erase_block(msm->snf, start_addr); -+ if (ret) { -+ instr->fail_addr = start_addr; -+ break; -+ } -+ -+ start_addr += mtd->erasesize; -+ } -+ -+ if (ret) -+ instr->state = MTD_ERASE_FAILED; -+ else -+ instr->state = MTD_ERASE_DONE; -+ -+ if (ret) -+ ret = -EIO; -+ -+ return ret; -+} -+ -+static int mtk_snand_mtd_read_data(struct mtk_snand_mtd *msm, uint64_t addr, -+ struct mtd_oob_ops *ops) -+{ -+ struct mtd_info *mtd = dev_get_uclass_priv(msm->dev); -+ size_t len, ooblen, maxooblen, chklen; -+ uint32_t col, ooboffs; -+ uint8_t *datcache, *oobcache; -+ bool raw = ops->mode == MTD_OPS_RAW ? true : false; -+ int ret; -+ -+ col = addr & mtd->writesize_mask; -+ addr &= ~mtd->writesize_mask; -+ maxooblen = mtd_oobavail(mtd, ops); -+ ooboffs = ops->ooboffs; -+ ooblen = ops->ooblen; -+ len = ops->len; -+ -+ datcache = len ? msm->page_cache : NULL; -+ oobcache = ooblen ? msm->page_cache + mtd->writesize : NULL; -+ -+ ops->oobretlen = 0; -+ ops->retlen = 0; -+ -+ while (len || ooblen) { -+ WATCHDOG_RESET(); -+ -+ if (ops->mode == MTD_OPS_AUTO_OOB) -+ ret = mtk_snand_read_page_auto_oob(msm->snf, addr, -+ datcache, oobcache, maxooblen, NULL, raw); -+ else -+ ret = mtk_snand_read_page(msm->snf, addr, datcache, -+ oobcache, raw); -+ -+ if (ret < 0) -+ return ret; -+ -+ if (len) { -+ /* Move data */ -+ chklen = mtd->writesize - col; -+ if (chklen > len) -+ chklen = len; -+ -+ memcpy(ops->datbuf + ops->retlen, datcache + col, -+ chklen); -+ len -= chklen; -+ col = 0; /* (col + chklen) % */ -+ ops->retlen += chklen; -+ } -+ -+ if (ooblen) { -+ /* Move oob */ -+ chklen = maxooblen - ooboffs; -+ if (chklen > ooblen) -+ chklen = ooblen; -+ -+ memcpy(ops->oobbuf + ops->oobretlen, oobcache + ooboffs, -+ chklen); -+ ooblen -= chklen; -+ ooboffs = 0; /* (ooboffs + chklen) % maxooblen; */ -+ ops->oobretlen += chklen; -+ } -+ -+ addr += mtd->writesize; -+ } -+ -+ return 0; -+} -+ -+static int mtk_snand_mtd_read_oob(struct mtd_info *mtd, loff_t from, -+ struct mtd_oob_ops *ops) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ uint32_t maxooblen; -+ -+ if (!ops->oobbuf && !ops->datbuf) { -+ if (ops->ooblen || ops->len) -+ return -EINVAL; -+ -+ return 0; -+ } -+ -+ switch (ops->mode) { -+ case MTD_OPS_PLACE_OOB: -+ case MTD_OPS_AUTO_OOB: -+ case MTD_OPS_RAW: -+ break; -+ default: -+ pr_debug("%s: unsupported oob mode: %u\n", __func__, ops->mode); -+ return -EINVAL; -+ } -+ -+ maxooblen = mtd_oobavail(mtd, ops); -+ -+ /* Do not allow read past end of device */ -+ if (ops->datbuf && (from + ops->len) > mtd->size) { -+ pr_debug("%s: attempt to read beyond end of device\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ if (unlikely(ops->ooboffs >= maxooblen)) { -+ pr_debug("%s: attempt to start read outside oob\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ if (unlikely(from >= mtd->size || -+ ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) - -+ (from >> mtd->writesize_shift)) * maxooblen)) { -+ pr_debug("%s: attempt to read beyond end of device\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ return mtk_snand_mtd_read_data(msm, from, ops); -+} -+ -+static int mtk_snand_mtd_write_data(struct mtk_snand_mtd *msm, uint64_t addr, -+ struct mtd_oob_ops *ops) -+{ -+ struct mtd_info *mtd = dev_get_uclass_priv(msm->dev); -+ size_t len, ooblen, maxooblen, chklen, oobwrlen; -+ uint32_t col, ooboffs; -+ uint8_t *datcache, *oobcache; -+ bool raw = ops->mode == MTD_OPS_RAW ? true : false; -+ int ret; -+ -+ col = addr & mtd->writesize_mask; -+ addr &= ~mtd->writesize_mask; -+ maxooblen = mtd_oobavail(mtd, ops); -+ ooboffs = ops->ooboffs; -+ ooblen = ops->ooblen; -+ len = ops->len; -+ -+ datcache = len ? msm->page_cache : NULL; -+ oobcache = ooblen ? msm->page_cache + mtd->writesize : NULL; -+ -+ ops->oobretlen = 0; -+ ops->retlen = 0; -+ -+ while (len || ooblen) { -+ WATCHDOG_RESET(); -+ -+ if (len) { -+ /* Move data */ -+ chklen = mtd->writesize - col; -+ if (chklen > len) -+ chklen = len; -+ -+ memset(datcache, 0xff, col); -+ memcpy(datcache + col, ops->datbuf + ops->retlen, -+ chklen); -+ memset(datcache + col + chklen, 0xff, -+ mtd->writesize - col - chklen); -+ len -= chklen; -+ col = 0; /* (col + chklen) % */ -+ ops->retlen += chklen; -+ } -+ -+ oobwrlen = 0; -+ if (ooblen) { -+ /* Move oob */ -+ chklen = maxooblen - ooboffs; -+ if (chklen > ooblen) -+ chklen = ooblen; -+ -+ memset(oobcache, 0xff, ooboffs); -+ memcpy(oobcache + ooboffs, -+ ops->oobbuf + ops->oobretlen, chklen); -+ memset(oobcache + ooboffs + chklen, 0xff, -+ mtd->oobsize - ooboffs - chklen); -+ oobwrlen = chklen + ooboffs; -+ ooblen -= chklen; -+ ooboffs = 0; /* (ooboffs + chklen) % maxooblen; */ -+ ops->oobretlen += chklen; -+ } -+ -+ if (ops->mode == MTD_OPS_AUTO_OOB) -+ ret = mtk_snand_write_page_auto_oob(msm->snf, addr, -+ datcache, oobcache, oobwrlen, NULL, raw); -+ else -+ ret = mtk_snand_write_page(msm->snf, addr, datcache, -+ oobcache, raw); -+ -+ if (ret) -+ return ret; -+ -+ addr += mtd->writesize; -+ } -+ -+ return 0; -+} -+ -+static int mtk_snand_mtd_write_oob(struct mtd_info *mtd, loff_t to, -+ struct mtd_oob_ops *ops) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ uint32_t maxooblen; -+ -+ if (!ops->oobbuf && !ops->datbuf) { -+ if (ops->ooblen || ops->len) -+ return -EINVAL; -+ -+ return 0; -+ } -+ -+ switch (ops->mode) { -+ case MTD_OPS_PLACE_OOB: -+ case MTD_OPS_AUTO_OOB: -+ case MTD_OPS_RAW: -+ break; -+ default: -+ pr_debug("%s: unsupported oob mode: %u\n", __func__, ops->mode); -+ return -EINVAL; -+ } -+ -+ maxooblen = mtd_oobavail(mtd, ops); -+ -+ /* Do not allow write past end of device */ -+ if (ops->datbuf && (to + ops->len) > mtd->size) { -+ pr_debug("%s: attempt to write beyond end of device\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ if (unlikely(ops->ooboffs >= maxooblen)) { -+ pr_debug("%s: attempt to start write outside oob\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ if (unlikely(to >= mtd->size || -+ ops->ooboffs + ops->ooblen > ((mtd->size >> mtd->writesize_shift) - -+ (to >> mtd->writesize_shift)) * maxooblen)) { -+ pr_debug("%s: attempt to write beyond end of device\n", -+ __func__); -+ return -EINVAL; -+ } -+ -+ return mtk_snand_mtd_write_data(msm, to, ops); -+} -+ -+static int mtk_snand_mtd_read(struct mtd_info *mtd, loff_t from, size_t len, -+ size_t *retlen, u_char *buf) -+{ -+ struct mtd_oob_ops ops = { -+ .mode = MTD_OPS_PLACE_OOB, -+ .datbuf = buf, -+ .len = len, -+ }; -+ int ret; -+ -+ ret = mtk_snand_mtd_read_oob(mtd, from, &ops); -+ -+ if (retlen) -+ *retlen = ops.retlen; -+ -+ return ret; -+} -+ -+static int mtk_snand_mtd_write(struct mtd_info *mtd, loff_t to, size_t len, -+ size_t *retlen, const u_char *buf) -+{ -+ struct mtd_oob_ops ops = { -+ .mode = MTD_OPS_PLACE_OOB, -+ .datbuf = (void *)buf, -+ .len = len, -+ }; -+ int ret; -+ -+ ret = mtk_snand_mtd_write_oob(mtd, to, &ops); -+ -+ if (retlen) -+ *retlen = ops.retlen; -+ -+ return ret; -+} -+ -+static int mtk_snand_mtd_block_isbad(struct mtd_info *mtd, loff_t offs) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ -+ return mtk_snand_block_isbad(msm->snf, offs); -+} -+ -+static int mtk_snand_mtd_block_markbad(struct mtd_info *mtd, loff_t offs) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ -+ return mtk_snand_block_markbad(msm->snf, offs); -+} -+ -+static int mtk_snand_ooblayout_ecc(struct mtd_info *mtd, int section, -+ struct mtd_oob_region *oobecc) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ -+ if (section) -+ return -ERANGE; -+ -+ oobecc->offset = msm->cinfo.fdm_size * msm->cinfo.num_sectors; -+ oobecc->length = mtd->oobsize - oobecc->offset; -+ -+ return 0; -+} -+ -+static int mtk_snand_ooblayout_free(struct mtd_info *mtd, int section, -+ struct mtd_oob_region *oobfree) -+{ -+ struct mtk_snand_mtd *msm = mtd_to_msm(mtd); -+ -+ if (section >= msm->cinfo.num_sectors) -+ return -ERANGE; -+ -+ oobfree->length = msm->cinfo.fdm_size - 1; -+ oobfree->offset = section * msm->cinfo.fdm_size + 1; -+ -+ return 0; -+} -+ -+static const struct mtd_ooblayout_ops mtk_snand_ooblayout = { -+ .ecc = mtk_snand_ooblayout_ecc, -+ .rfree = mtk_snand_ooblayout_free, -+}; -+ -+static int mtk_snand_mtd_probe(struct udevice *dev) -+{ -+ struct mtk_snand_mtd *msm = dev_get_priv(dev); -+ struct mtd_info *mtd = dev_get_uclass_priv(dev); -+ struct mtk_snand_platdata mtk_snand_pdata = {}; -+ size_t namelen; -+ fdt_addr_t base; -+ int ret; -+ -+ base = dev_read_addr_name(dev, "nfi"); -+ if (base == FDT_ADDR_T_NONE) -+ return -EINVAL; -+ mtk_snand_pdata.nfi_base = map_sysmem(base, 0); -+ -+ base = dev_read_addr_name(dev, "ecc"); -+ if (base == FDT_ADDR_T_NONE) -+ return -EINVAL; -+ mtk_snand_pdata.ecc_base = map_sysmem(base, 0); -+ -+ mtk_snand_pdata.soc = dev_get_driver_data(dev); -+ mtk_snand_pdata.quad_spi = dev_read_bool(dev, "quad-spi"); -+ -+ ret = mtk_snand_init(NULL, &mtk_snand_pdata, &msm->snf); -+ if (ret) -+ return ret; -+ -+ mtk_snand_get_chip_info(msm->snf, &msm->cinfo); -+ -+ msm->page_cache = malloc(msm->cinfo.pagesize + msm->cinfo.sparesize); -+ if (!msm->page_cache) { -+ printf("%s: failed to allocate memory for page cache\n", -+ __func__); -+ ret = -ENOMEM; -+ goto errout1; -+ } -+ -+ namelen = sizeof(snand_mtd_name_prefix) + 12; -+ -+ mtd->name = malloc(namelen); -+ if (!mtd->name) { -+ printf("%s: failed to allocate memory for MTD name\n", -+ __func__); -+ ret = -ENOMEM; -+ goto errout2; -+ } -+ -+ msm->dev = dev; -+ -+ snprintf(mtd->name, namelen, "%s%u", snand_mtd_name_prefix, snandidx++); -+ -+ mtd->priv = msm; -+ mtd->dev = dev; -+ mtd->type = MTD_NANDFLASH; -+ mtd->flags = MTD_CAP_NANDFLASH; -+ -+ mtd->size = msm->cinfo.chipsize; -+ mtd->erasesize = msm->cinfo.blocksize; -+ mtd->writesize = msm->cinfo.pagesize; -+ mtd->writebufsize = mtd->writesize; -+ mtd->oobsize = msm->cinfo.sparesize; -+ mtd->oobavail = msm->cinfo.num_sectors * (msm->cinfo.fdm_size - 1); -+ -+ mtd->ooblayout = &mtk_snand_ooblayout; -+ -+ mtd->ecc_strength = msm->cinfo.ecc_strength * msm->cinfo.num_sectors; -+ mtd->bitflip_threshold = (mtd->ecc_strength * 3) / 4; -+ mtd->ecc_step_size = msm->cinfo.sector_size; -+ -+ mtd->_read = mtk_snand_mtd_read; -+ mtd->_write = mtk_snand_mtd_write; -+ mtd->_erase = mtk_snand_mtd_erase; -+ mtd->_read_oob = mtk_snand_mtd_read_oob; -+ mtd->_write_oob = mtk_snand_mtd_write_oob; -+ mtd->_block_isbad = mtk_snand_mtd_block_isbad; -+ mtd->_block_markbad = mtk_snand_mtd_block_markbad; -+ -+ ret = add_mtd_device(mtd); -+ if (ret) { -+ printf("%s: failed to add SPI-NAND MTD device\n", __func__); -+ ret = -ENODEV; -+ goto errout3; -+ } -+ -+ printf("SPI-NAND: %s (%lluMB)\n", msm->cinfo.model, -+ msm->cinfo.chipsize >> 20); -+ -+ return 0; -+ -+errout3: -+ free(mtd->name); -+ -+errout2: -+ free(msm->page_cache); -+ -+errout1: -+ mtk_snand_cleanup(msm->snf); -+ -+ return ret; -+} -+ -+static const struct udevice_id mtk_snand_ids[] = { -+ { .compatible = "mediatek,mt7622-snand", .data = SNAND_SOC_MT7622 }, -+ { .compatible = "mediatek,mt7629-snand", .data = SNAND_SOC_MT7629 }, -+ { .compatible = "mediatek,mt7986-snand", .data = SNAND_SOC_MT7986 }, -+ { /* sentinel */ }, -+}; -+ -+U_BOOT_DRIVER(spinand) = { -+ .name = "mtk-snand", -+ .id = UCLASS_MTD, -+ .of_match = mtk_snand_ids, -+ .priv_auto = sizeof(struct mtk_snand_mtd), -+ .probe = mtk_snand_mtd_probe, -+}; ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-os.c -@@ -0,0 +1,39 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include "mtk-snand-def.h" -+ -+int mtk_snand_log(struct mtk_snand_plat_dev *pdev, -+ enum mtk_snand_log_category cat, const char *fmt, ...) -+{ -+ const char *catname = ""; -+ va_list ap; -+ int ret; -+ -+ switch (cat) { -+ case SNAND_LOG_NFI: -+ catname = "NFI: "; -+ break; -+ case SNAND_LOG_SNFI: -+ catname = "SNFI: "; -+ break; -+ case SNAND_LOG_ECC: -+ catname = "ECC: "; -+ break; -+ default: -+ break; -+ } -+ -+ puts("SPI-NAND: "); -+ puts(catname); -+ -+ va_start(ap, fmt); -+ ret = vprintf(fmt, ap); -+ va_end(ap); -+ -+ return ret; -+} ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-os.h -@@ -0,0 +1,120 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#ifndef _MTK_SNAND_OS_H_ -+#define _MTK_SNAND_OS_H_ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifndef ARCH_DMA_MINALIGN -+#define ARCH_DMA_MINALIGN 64 -+#endif -+ -+struct mtk_snand_plat_dev { -+ ulong unused; -+}; -+ -+/* Polling helpers */ -+#define read16_poll_timeout(addr, val, cond, sleep_us, timeout_us) \ -+ readw_poll_timeout((addr), (val), (cond), (timeout_us)) -+ -+#define read32_poll_timeout(addr, val, cond, sleep_us, timeout_us) \ -+ readl_poll_timeout((addr), (val), (cond), (timeout_us)) -+ -+/* Timer helpers */ -+typedef uint64_t mtk_snand_time_t; -+ -+static inline mtk_snand_time_t timer_get_ticks(void) -+{ -+ return get_ticks(); -+} -+ -+static inline mtk_snand_time_t timer_time_to_tick(uint32_t timeout_us) -+{ -+ return usec_to_tick(timeout_us); -+} -+ -+static inline bool timer_is_timeout(mtk_snand_time_t start_tick, -+ mtk_snand_time_t timeout_tick) -+{ -+ return get_ticks() - start_tick > timeout_tick; -+} -+ -+/* Memory helpers */ -+static inline void *generic_mem_alloc(struct mtk_snand_plat_dev *pdev, -+ size_t size) -+{ -+ return calloc(1, size); -+} -+ -+static inline void generic_mem_free(struct mtk_snand_plat_dev *pdev, void *ptr) -+{ -+ free(ptr); -+} -+ -+static inline void *dma_mem_alloc(struct mtk_snand_plat_dev *pdev, size_t size) -+{ -+ return memalign(ARCH_DMA_MINALIGN, size); -+} -+ -+static inline void dma_mem_free(struct mtk_snand_plat_dev *pdev, void *ptr) -+{ -+ free(ptr); -+} -+ -+static inline int dma_mem_map(struct mtk_snand_plat_dev *pdev, void *vaddr, -+ uintptr_t *dma_addr, size_t size, bool to_device) -+{ -+ size_t cachelen = roundup(size, ARCH_DMA_MINALIGN); -+ uintptr_t endaddr = (uintptr_t)vaddr + cachelen; -+ -+ if (to_device) -+ flush_dcache_range((uintptr_t)vaddr, endaddr); -+ else -+ invalidate_dcache_range((uintptr_t)vaddr, endaddr); -+ -+ *dma_addr = (uintptr_t)vaddr; -+ -+ return 0; -+} -+ -+static inline void dma_mem_unmap(struct mtk_snand_plat_dev *pdev, -+ uintptr_t dma_addr, size_t size, -+ bool to_device) -+{ -+} -+ -+/* Interrupt helpers */ -+static inline void irq_completion_done(struct mtk_snand_plat_dev *pdev) -+{ -+} -+ -+static inline void irq_completion_init(struct mtk_snand_plat_dev *pdev) -+{ -+} -+ -+static inline int irq_completion_wait(struct mtk_snand_plat_dev *pdev, -+ void __iomem *reg, uint32_t bit, -+ uint32_t timeout_us) -+{ -+ uint32_t val; -+ -+ return read32_poll_timeout(reg, val, val & bit, 0, timeout_us); -+} -+ -+#endif /* _MTK_SNAND_OS_H_ */ ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand.c -@@ -0,0 +1,1776 @@ -+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include "mtk-snand-def.h" -+ -+/* NFI registers */ -+#define NFI_CNFG 0x000 -+#define CNFG_OP_MODE_S 12 -+#define CNFG_OP_MODE_CUST 6 -+#define CNFG_OP_MODE_PROGRAM 3 -+#define CNFG_AUTO_FMT_EN BIT(9) -+#define CNFG_HW_ECC_EN BIT(8) -+#define CNFG_DMA_BURST_EN BIT(2) -+#define CNFG_READ_MODE BIT(1) -+#define CNFG_DMA_MODE BIT(0) -+ -+#define NFI_PAGEFMT 0x0004 -+#define NFI_SPARE_SIZE_LS_S 16 -+#define NFI_FDM_ECC_NUM_S 12 -+#define NFI_FDM_NUM_S 8 -+#define NFI_SPARE_SIZE_S 4 -+#define NFI_SEC_SEL_512 BIT(2) -+#define NFI_PAGE_SIZE_S 0 -+#define NFI_PAGE_SIZE_512_2K 0 -+#define NFI_PAGE_SIZE_2K_4K 1 -+#define NFI_PAGE_SIZE_4K_8K 2 -+#define NFI_PAGE_SIZE_8K_16K 3 -+ -+#define NFI_CON 0x008 -+#define CON_SEC_NUM_S 12 -+#define CON_BWR BIT(9) -+#define CON_BRD BIT(8) -+#define CON_NFI_RST BIT(1) -+#define CON_FIFO_FLUSH BIT(0) -+ -+#define NFI_INTR_EN 0x010 -+#define NFI_INTR_STA 0x014 -+#define NFI_IRQ_INTR_EN BIT(31) -+#define NFI_IRQ_CUS_READ BIT(8) -+#define NFI_IRQ_CUS_PG BIT(7) -+ -+#define NFI_CMD 0x020 -+ -+#define NFI_STRDATA 0x040 -+#define STR_DATA BIT(0) -+ -+#define NFI_STA 0x060 -+#define NFI_NAND_FSM GENMASK(28, 24) -+#define NFI_FSM GENMASK(19, 16) -+#define READ_EMPTY BIT(12) -+ -+#define NFI_FIFOSTA 0x064 -+#define FIFO_WR_REMAIN_S 8 -+#define FIFO_RD_REMAIN_S 0 -+ -+#define NFI_STRADDR 0x080 -+ -+#define NFI_FDM0L 0x0a0 -+#define NFI_FDM0M 0x0a4 -+#define NFI_FDML(n) (NFI_FDM0L + (n) * 8) -+#define NFI_FDMM(n) (NFI_FDM0M + (n) * 8) -+ -+#define NFI_DEBUG_CON1 0x220 -+#define WBUF_EN BIT(2) -+ -+#define NFI_MASTERSTA 0x224 -+#define MAS_ADDR GENMASK(11, 9) -+#define MAS_RD GENMASK(8, 6) -+#define MAS_WR GENMASK(5, 3) -+#define MAS_RDDLY GENMASK(2, 0) -+#define NFI_MASTERSTA_MASK_7622 (MAS_ADDR | MAS_RD | MAS_WR | MAS_RDDLY) -+#define AHB_BUS_BUSY BIT(1) -+#define BUS_BUSY BIT(0) -+#define NFI_MASTERSTA_MASK_7986 (AHB_BUS_BUSY | BUS_BUSY) -+ -+/* SNFI registers */ -+#define SNF_MAC_CTL 0x500 -+#define MAC_XIO_SEL BIT(4) -+#define SF_MAC_EN BIT(3) -+#define SF_TRIG BIT(2) -+#define WIP_READY BIT(1) -+#define WIP BIT(0) -+ -+#define SNF_MAC_OUTL 0x504 -+#define SNF_MAC_INL 0x508 -+ -+#define SNF_RD_CTL2 0x510 -+#define DATA_READ_DUMMY_S 8 -+#define DATA_READ_CMD_S 0 -+ -+#define SNF_RD_CTL3 0x514 -+ -+#define SNF_PG_CTL1 0x524 -+#define PG_LOAD_CMD_S 8 -+ -+#define SNF_PG_CTL2 0x528 -+ -+#define SNF_MISC_CTL 0x538 -+#define SW_RST BIT(28) -+#define FIFO_RD_LTC_S 25 -+#define PG_LOAD_X4_EN BIT(20) -+#define DATA_READ_MODE_S 16 -+#define DATA_READ_MODE GENMASK(18, 16) -+#define DATA_READ_MODE_X1 0 -+#define DATA_READ_MODE_X2 1 -+#define DATA_READ_MODE_X4 2 -+#define DATA_READ_MODE_DUAL 5 -+#define DATA_READ_MODE_QUAD 6 -+#define PG_LOAD_CUSTOM_EN BIT(7) -+#define DATARD_CUSTOM_EN BIT(6) -+#define CS_DESELECT_CYC_S 0 -+ -+#define SNF_MISC_CTL2 0x53c -+#define PROGRAM_LOAD_BYTE_NUM_S 16 -+#define READ_DATA_BYTE_NUM_S 11 -+ -+#define SNF_DLY_CTL3 0x548 -+#define SFCK_SAM_DLY_S 0 -+ -+#define SNF_STA_CTL1 0x550 -+#define CUS_PG_DONE BIT(28) -+#define CUS_READ_DONE BIT(27) -+#define SPI_STATE_S 0 -+#define SPI_STATE GENMASK(3, 0) -+ -+#define SNF_CFG 0x55c -+#define SPI_MODE BIT(0) -+ -+#define SNF_GPRAM 0x800 -+#define SNF_GPRAM_SIZE 0xa0 -+ -+#define SNFI_POLL_INTERVAL 1000000 -+ -+static const uint8_t mt7622_spare_sizes[] = { 16, 26, 27, 28 }; -+ -+static const uint8_t mt7986_spare_sizes[] = { -+ 16, 26, 27, 28, 32, 36, 40, 44, 48, 49, 50, 51, 52, 62, 61, 63, 64, -+ 67, 74 -+}; -+ -+static const struct mtk_snand_soc_data mtk_snand_socs[__SNAND_SOC_MAX] = { -+ [SNAND_SOC_MT7622] = { -+ .sector_size = 512, -+ .max_sectors = 8, -+ .fdm_size = 8, -+ .fdm_ecc_size = 1, -+ .fifo_size = 32, -+ .bbm_swap = false, -+ .empty_page_check = false, -+ .mastersta_mask = NFI_MASTERSTA_MASK_7622, -+ .spare_sizes = mt7622_spare_sizes, -+ .num_spare_size = ARRAY_SIZE(mt7622_spare_sizes) -+ }, -+ [SNAND_SOC_MT7629] = { -+ .sector_size = 512, -+ .max_sectors = 8, -+ .fdm_size = 8, -+ .fdm_ecc_size = 1, -+ .fifo_size = 32, -+ .bbm_swap = true, -+ .empty_page_check = false, -+ .mastersta_mask = NFI_MASTERSTA_MASK_7622, -+ .spare_sizes = mt7622_spare_sizes, -+ .num_spare_size = ARRAY_SIZE(mt7622_spare_sizes) -+ }, -+ [SNAND_SOC_MT7986] = { -+ .sector_size = 1024, -+ .max_sectors = 16, -+ .fdm_size = 8, -+ .fdm_ecc_size = 1, -+ .fifo_size = 64, -+ .bbm_swap = true, -+ .empty_page_check = true, -+ .mastersta_mask = NFI_MASTERSTA_MASK_7986, -+ .spare_sizes = mt7986_spare_sizes, -+ .num_spare_size = ARRAY_SIZE(mt7986_spare_sizes) -+ }, -+}; -+ -+static inline uint32_t nfi_read32(struct mtk_snand *snf, uint32_t reg) -+{ -+ return readl(snf->nfi_base + reg); -+} -+ -+static inline void nfi_write32(struct mtk_snand *snf, uint32_t reg, -+ uint32_t val) -+{ -+ writel(val, snf->nfi_base + reg); -+} -+ -+static inline void nfi_write16(struct mtk_snand *snf, uint32_t reg, -+ uint16_t val) -+{ -+ writew(val, snf->nfi_base + reg); -+} -+ -+static inline void nfi_rmw32(struct mtk_snand *snf, uint32_t reg, uint32_t clr, -+ uint32_t set) -+{ -+ uint32_t val; -+ -+ val = readl(snf->nfi_base + reg); -+ val &= ~clr; -+ val |= set; -+ writel(val, snf->nfi_base + reg); -+} -+ -+static void nfi_write_data(struct mtk_snand *snf, uint32_t reg, -+ const uint8_t *data, uint32_t len) -+{ -+ uint32_t i, val = 0, es = sizeof(uint32_t); -+ -+ for (i = reg; i < reg + len; i++) { -+ val |= ((uint32_t)*data++) << (8 * (i % es)); -+ -+ if (i % es == es - 1 || i == reg + len - 1) { -+ nfi_write32(snf, i & ~(es - 1), val); -+ val = 0; -+ } -+ } -+} -+ -+static void nfi_read_data(struct mtk_snand *snf, uint32_t reg, uint8_t *data, -+ uint32_t len) -+{ -+ uint32_t i, val = 0, es = sizeof(uint32_t); -+ -+ for (i = reg; i < reg + len; i++) { -+ if (i == reg || i % es == 0) -+ val = nfi_read32(snf, i & ~(es - 1)); -+ -+ *data++ = (uint8_t)(val >> (8 * (i % es))); -+ } -+} -+ -+static inline void do_bm_swap(uint8_t *bm1, uint8_t *bm2) -+{ -+ uint8_t tmp = *bm1; -+ *bm1 = *bm2; -+ *bm2 = tmp; -+} -+ -+static void mtk_snand_bm_swap_raw(struct mtk_snand *snf) -+{ -+ uint32_t fdm_bbm_pos; -+ -+ if (!snf->nfi_soc->bbm_swap || snf->ecc_steps == 1) -+ return; -+ -+ fdm_bbm_pos = (snf->ecc_steps - 1) * snf->raw_sector_size + -+ snf->nfi_soc->sector_size; -+ do_bm_swap(&snf->page_cache[fdm_bbm_pos], -+ &snf->page_cache[snf->writesize]); -+} -+ -+static void mtk_snand_bm_swap(struct mtk_snand *snf) -+{ -+ uint32_t buf_bbm_pos, fdm_bbm_pos; -+ -+ if (!snf->nfi_soc->bbm_swap || snf->ecc_steps == 1) -+ return; -+ -+ buf_bbm_pos = snf->writesize - -+ (snf->ecc_steps - 1) * snf->spare_per_sector; -+ fdm_bbm_pos = snf->writesize + -+ (snf->ecc_steps - 1) * snf->nfi_soc->fdm_size; -+ do_bm_swap(&snf->page_cache[fdm_bbm_pos], -+ &snf->page_cache[buf_bbm_pos]); -+} -+ -+static void mtk_snand_fdm_bm_swap_raw(struct mtk_snand *snf) -+{ -+ uint32_t fdm_bbm_pos1, fdm_bbm_pos2; -+ -+ if (!snf->nfi_soc->bbm_swap || snf->ecc_steps == 1) -+ return; -+ -+ fdm_bbm_pos1 = snf->nfi_soc->sector_size; -+ fdm_bbm_pos2 = (snf->ecc_steps - 1) * snf->raw_sector_size + -+ snf->nfi_soc->sector_size; -+ do_bm_swap(&snf->page_cache[fdm_bbm_pos1], -+ &snf->page_cache[fdm_bbm_pos2]); -+} -+ -+static void mtk_snand_fdm_bm_swap(struct mtk_snand *snf) -+{ -+ uint32_t fdm_bbm_pos1, fdm_bbm_pos2; -+ -+ if (!snf->nfi_soc->bbm_swap || snf->ecc_steps == 1) -+ return; -+ -+ fdm_bbm_pos1 = snf->writesize; -+ fdm_bbm_pos2 = snf->writesize + -+ (snf->ecc_steps - 1) * snf->nfi_soc->fdm_size; -+ do_bm_swap(&snf->page_cache[fdm_bbm_pos1], -+ &snf->page_cache[fdm_bbm_pos2]); -+} -+ -+static int mtk_nfi_reset(struct mtk_snand *snf) -+{ -+ uint32_t val, fifo_mask; -+ int ret; -+ -+ nfi_write32(snf, NFI_CON, CON_FIFO_FLUSH | CON_NFI_RST); -+ -+ ret = read16_poll_timeout(snf->nfi_base + NFI_MASTERSTA, val, -+ !(val & snf->nfi_soc->mastersta_mask), 0, -+ SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_nfi(snf->pdev, -+ "NFI master is still busy after reset\n"); -+ return ret; -+ } -+ -+ ret = read32_poll_timeout(snf->nfi_base + NFI_STA, val, -+ !(val & (NFI_FSM | NFI_NAND_FSM)), 0, -+ SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_nfi(snf->pdev, "Failed to reset NFI\n"); -+ return ret; -+ } -+ -+ fifo_mask = ((snf->nfi_soc->fifo_size - 1) << FIFO_RD_REMAIN_S) | -+ ((snf->nfi_soc->fifo_size - 1) << FIFO_WR_REMAIN_S); -+ ret = read16_poll_timeout(snf->nfi_base + NFI_FIFOSTA, val, -+ !(val & fifo_mask), 0, SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_nfi(snf->pdev, "NFI FIFOs are not empty\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int mtk_snand_mac_reset(struct mtk_snand *snf) -+{ -+ int ret; -+ uint32_t val; -+ -+ nfi_rmw32(snf, SNF_MISC_CTL, 0, SW_RST); -+ -+ ret = read32_poll_timeout(snf->nfi_base + SNF_STA_CTL1, val, -+ !(val & SPI_STATE), 0, SNFI_POLL_INTERVAL); -+ if (ret) -+ snand_log_snfi(snf->pdev, "Failed to reset SNFI MAC\n"); -+ -+ nfi_write32(snf, SNF_MISC_CTL, (2 << FIFO_RD_LTC_S) | -+ (10 << CS_DESELECT_CYC_S)); -+ -+ return ret; -+} -+ -+static int mtk_snand_mac_trigger(struct mtk_snand *snf, uint32_t outlen, -+ uint32_t inlen) -+{ -+ int ret; -+ uint32_t val; -+ -+ nfi_write32(snf, SNF_MAC_CTL, SF_MAC_EN); -+ nfi_write32(snf, SNF_MAC_OUTL, outlen); -+ nfi_write32(snf, SNF_MAC_INL, inlen); -+ -+ nfi_write32(snf, SNF_MAC_CTL, SF_MAC_EN | SF_TRIG); -+ -+ ret = read32_poll_timeout(snf->nfi_base + SNF_MAC_CTL, val, -+ val & WIP_READY, 0, SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_snfi(snf->pdev, "Timed out waiting for WIP_READY\n"); -+ goto cleanup; -+ } -+ -+ ret = read32_poll_timeout(snf->nfi_base + SNF_MAC_CTL, val, -+ !(val & WIP), 0, SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_snfi(snf->pdev, -+ "Timed out waiting for WIP cleared\n"); -+ } -+ -+cleanup: -+ nfi_write32(snf, SNF_MAC_CTL, 0); -+ -+ return ret; -+} -+ -+int mtk_snand_mac_io(struct mtk_snand *snf, const uint8_t *out, uint32_t outlen, -+ uint8_t *in, uint32_t inlen) -+{ -+ int ret; -+ -+ if (outlen + inlen > SNF_GPRAM_SIZE) -+ return -EINVAL; -+ -+ mtk_snand_mac_reset(snf); -+ -+ nfi_write_data(snf, SNF_GPRAM, out, outlen); -+ -+ ret = mtk_snand_mac_trigger(snf, outlen, inlen); -+ if (ret) -+ return ret; -+ -+ if (!inlen) -+ return 0; -+ -+ nfi_read_data(snf, SNF_GPRAM + outlen, in, inlen); -+ -+ return 0; -+} -+ -+static int mtk_snand_get_feature(struct mtk_snand *snf, uint32_t addr) -+{ -+ uint8_t op[2], val; -+ int ret; -+ -+ op[0] = SNAND_CMD_GET_FEATURE; -+ op[1] = (uint8_t)addr; -+ -+ ret = mtk_snand_mac_io(snf, op, sizeof(op), &val, 1); -+ if (ret) -+ return ret; -+ -+ return val; -+} -+ -+int mtk_snand_set_feature(struct mtk_snand *snf, uint32_t addr, uint32_t val) -+{ -+ uint8_t op[3]; -+ -+ op[0] = SNAND_CMD_SET_FEATURE; -+ op[1] = (uint8_t)addr; -+ op[2] = (uint8_t)val; -+ -+ return mtk_snand_mac_io(snf, op, sizeof(op), NULL, 0); -+} -+ -+static int mtk_snand_poll_status(struct mtk_snand *snf, uint32_t wait_us) -+{ -+ int val; -+ mtk_snand_time_t time_start, tmo; -+ -+ time_start = timer_get_ticks(); -+ tmo = timer_time_to_tick(wait_us); -+ -+ do { -+ val = mtk_snand_get_feature(snf, SNAND_FEATURE_STATUS_ADDR); -+ if (!(val & SNAND_STATUS_OIP)) -+ return val & (SNAND_STATUS_ERASE_FAIL | -+ SNAND_STATUS_PROGRAM_FAIL); -+ } while (!timer_is_timeout(time_start, tmo)); -+ -+ return -ETIMEDOUT; -+} -+ -+int mtk_snand_chip_reset(struct mtk_snand *snf) -+{ -+ uint8_t op = SNAND_CMD_RESET; -+ int ret; -+ -+ ret = mtk_snand_mac_io(snf, &op, 1, NULL, 0); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_poll_status(snf, SNFI_POLL_INTERVAL); -+ if (ret < 0) -+ return ret; -+ -+ return 0; -+} -+ -+static int mtk_snand_config_feature(struct mtk_snand *snf, uint8_t clr, -+ uint8_t set) -+{ -+ int val, newval; -+ int ret; -+ -+ val = mtk_snand_get_feature(snf, SNAND_FEATURE_CONFIG_ADDR); -+ if (val < 0) { -+ snand_log_chip(snf->pdev, -+ "Failed to get configuration feature\n"); -+ return val; -+ } -+ -+ newval = (val & (~clr)) | set; -+ -+ if (newval == val) -+ return 0; -+ -+ ret = mtk_snand_set_feature(snf, SNAND_FEATURE_CONFIG_ADDR, -+ (uint8_t)newval); -+ if (val < 0) { -+ snand_log_chip(snf->pdev, -+ "Failed to set configuration feature\n"); -+ return ret; -+ } -+ -+ val = mtk_snand_get_feature(snf, SNAND_FEATURE_CONFIG_ADDR); -+ if (val < 0) { -+ snand_log_chip(snf->pdev, -+ "Failed to get configuration feature\n"); -+ return val; -+ } -+ -+ if (newval != val) -+ return -ENOTSUPP; -+ -+ return 0; -+} -+ -+static int mtk_snand_ondie_ecc_control(struct mtk_snand *snf, bool enable) -+{ -+ int ret; -+ -+ if (enable) -+ ret = mtk_snand_config_feature(snf, 0, SNAND_FEATURE_ECC_EN); -+ else -+ ret = mtk_snand_config_feature(snf, SNAND_FEATURE_ECC_EN, 0); -+ -+ if (ret) { -+ snand_log_chip(snf->pdev, "Failed to %s On-Die ECC engine\n", -+ enable ? "enable" : "disable"); -+ } -+ -+ return ret; -+} -+ -+static int mtk_snand_qspi_control(struct mtk_snand *snf, bool enable) -+{ -+ int ret; -+ -+ if (enable) { -+ ret = mtk_snand_config_feature(snf, 0, -+ SNAND_FEATURE_QUAD_ENABLE); -+ } else { -+ ret = mtk_snand_config_feature(snf, -+ SNAND_FEATURE_QUAD_ENABLE, 0); -+ } -+ -+ if (ret) { -+ snand_log_chip(snf->pdev, "Failed to %s quad spi\n", -+ enable ? "enable" : "disable"); -+ } -+ -+ return ret; -+} -+ -+static int mtk_snand_unlock(struct mtk_snand *snf) -+{ -+ int ret; -+ -+ ret = mtk_snand_set_feature(snf, SNAND_FEATURE_PROTECT_ADDR, 0); -+ if (ret) { -+ snand_log_chip(snf->pdev, "Failed to set protection feature\n"); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int mtk_snand_write_enable(struct mtk_snand *snf) -+{ -+ uint8_t op = SNAND_CMD_WRITE_ENABLE; -+ int ret, val; -+ -+ ret = mtk_snand_mac_io(snf, &op, 1, NULL, 0); -+ if (ret) -+ return ret; -+ -+ val = mtk_snand_get_feature(snf, SNAND_FEATURE_STATUS_ADDR); -+ if (val < 0) -+ return ret; -+ -+ if (val & SNAND_STATUS_WEL) -+ return 0; -+ -+ snand_log_chip(snf->pdev, "Failed to send write-enable command\n"); -+ -+ return -ENOTSUPP; -+} -+ -+static int mtk_snand_select_die(struct mtk_snand *snf, uint32_t dieidx) -+{ -+ if (!snf->select_die) -+ return 0; -+ -+ return snf->select_die(snf, dieidx); -+} -+ -+static uint64_t mtk_snand_select_die_address(struct mtk_snand *snf, -+ uint64_t addr) -+{ -+ uint32_t dieidx; -+ -+ if (!snf->select_die) -+ return addr; -+ -+ dieidx = addr >> snf->die_shift; -+ -+ mtk_snand_select_die(snf, dieidx); -+ -+ return addr & snf->die_mask; -+} -+ -+static uint32_t mtk_snand_get_plane_address(struct mtk_snand *snf, -+ uint32_t page) -+{ -+ uint32_t pages_per_block; -+ -+ pages_per_block = 1 << (snf->erasesize_shift - snf->writesize_shift); -+ -+ if (page & pages_per_block) -+ return 1 << (snf->writesize_shift + 1); -+ -+ return 0; -+} -+ -+static int mtk_snand_page_op(struct mtk_snand *snf, uint32_t page, uint8_t cmd) -+{ -+ uint8_t op[4]; -+ -+ op[0] = cmd; -+ op[1] = (page >> 16) & 0xff; -+ op[2] = (page >> 8) & 0xff; -+ op[3] = page & 0xff; -+ -+ return mtk_snand_mac_io(snf, op, sizeof(op), NULL, 0); -+} -+ -+static void mtk_snand_read_fdm(struct mtk_snand *snf, uint8_t *buf) -+{ -+ uint32_t vall, valm; -+ uint8_t *oobptr = buf; -+ int i, j; -+ -+ for (i = 0; i < snf->ecc_steps; i++) { -+ vall = nfi_read32(snf, NFI_FDML(i)); -+ valm = nfi_read32(snf, NFI_FDMM(i)); -+ -+ for (j = 0; j < snf->nfi_soc->fdm_size; j++) -+ oobptr[j] = (j >= 4 ? valm : vall) >> ((j % 4) * 8); -+ -+ oobptr += snf->nfi_soc->fdm_size; -+ } -+} -+ -+static int mtk_snand_read_cache(struct mtk_snand *snf, uint32_t page, bool raw) -+{ -+ uint32_t coladdr, rwbytes, mode, len; -+ uintptr_t dma_addr; -+ int ret; -+ -+ /* Column address with plane bit */ -+ coladdr = mtk_snand_get_plane_address(snf, page); -+ -+ mtk_snand_mac_reset(snf); -+ mtk_nfi_reset(snf); -+ -+ /* Command and dummy cycles */ -+ nfi_write32(snf, SNF_RD_CTL2, -+ ((uint32_t)snf->dummy_rfc << DATA_READ_DUMMY_S) | -+ (snf->opcode_rfc << DATA_READ_CMD_S)); -+ -+ /* Column address */ -+ nfi_write32(snf, SNF_RD_CTL3, coladdr); -+ -+ /* Set read mode */ -+ mode = (uint32_t)snf->mode_rfc << DATA_READ_MODE_S; -+ nfi_rmw32(snf, SNF_MISC_CTL, DATA_READ_MODE, mode | DATARD_CUSTOM_EN); -+ -+ /* Set bytes to read */ -+ rwbytes = snf->ecc_steps * snf->raw_sector_size; -+ nfi_write32(snf, SNF_MISC_CTL2, (rwbytes << PROGRAM_LOAD_BYTE_NUM_S) | -+ rwbytes); -+ -+ /* NFI read prepare */ -+ mode = raw ? 0 : CNFG_HW_ECC_EN | CNFG_AUTO_FMT_EN; -+ nfi_write16(snf, NFI_CNFG, (CNFG_OP_MODE_CUST << CNFG_OP_MODE_S) | -+ CNFG_DMA_BURST_EN | CNFG_READ_MODE | CNFG_DMA_MODE | mode); -+ -+ nfi_write32(snf, NFI_CON, (snf->ecc_steps << CON_SEC_NUM_S)); -+ -+ /* Prepare for DMA read */ -+ len = snf->writesize + snf->oobsize; -+ ret = dma_mem_map(snf->pdev, snf->page_cache, &dma_addr, len, false); -+ if (ret) { -+ snand_log_nfi(snf->pdev, -+ "DMA map from device failed with %d\n", ret); -+ return ret; -+ } -+ -+ nfi_write32(snf, NFI_STRADDR, (uint32_t)dma_addr); -+ -+ if (!raw) -+ mtk_snand_ecc_decoder_start(snf); -+ -+ /* Prepare for custom read interrupt */ -+ nfi_write32(snf, NFI_INTR_EN, NFI_IRQ_INTR_EN | NFI_IRQ_CUS_READ); -+ irq_completion_init(snf->pdev); -+ -+ /* Trigger NFI into custom mode */ -+ nfi_write16(snf, NFI_CMD, NFI_CMD_DUMMY_READ); -+ -+ /* Start DMA read */ -+ nfi_rmw32(snf, NFI_CON, 0, CON_BRD); -+ nfi_write16(snf, NFI_STRDATA, STR_DATA); -+ -+ /* Wait for operation finished */ -+ ret = irq_completion_wait(snf->pdev, snf->nfi_base + SNF_STA_CTL1, -+ CUS_READ_DONE, SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_nfi(snf->pdev, -+ "DMA timed out for reading from cache\n"); -+ goto cleanup; -+ } -+ -+ if (!raw) { -+ ret = mtk_ecc_wait_decoder_done(snf); -+ if (ret) -+ goto cleanup; -+ -+ mtk_snand_read_fdm(snf, snf->page_cache + snf->writesize); -+ -+ /* -+ * For new IPs, ecc error may occur on empty pages. -+ * Use an specific indication bit to check empty page. -+ */ -+ if (snf->nfi_soc->empty_page_check && -+ (nfi_read32(snf, NFI_STA) & READ_EMPTY)) -+ ret = 0; -+ else -+ ret = mtk_ecc_check_decode_error(snf, page); -+ -+ mtk_snand_ecc_decoder_stop(snf); -+ } -+ -+cleanup: -+ /* DMA cleanup */ -+ dma_mem_unmap(snf->pdev, dma_addr, len, false); -+ -+ /* Stop read */ -+ nfi_write32(snf, NFI_CON, 0); -+ -+ /* Clear SNF done flag */ -+ nfi_rmw32(snf, SNF_STA_CTL1, 0, CUS_READ_DONE); -+ nfi_write32(snf, SNF_STA_CTL1, 0); -+ -+ /* Disable interrupt */ -+ nfi_read32(snf, NFI_INTR_STA); -+ nfi_write32(snf, NFI_INTR_EN, 0); -+ -+ nfi_rmw32(snf, SNF_MISC_CTL, DATARD_CUSTOM_EN, 0); -+ -+ return ret; -+} -+ -+static void mtk_snand_from_raw_page(struct mtk_snand *snf, void *buf, void *oob) -+{ -+ uint32_t i, ecc_bytes = snf->spare_per_sector - snf->nfi_soc->fdm_size; -+ uint8_t *eccptr = oob + snf->ecc_steps * snf->nfi_soc->fdm_size; -+ uint8_t *bufptr = buf, *oobptr = oob, *raw_sector; -+ -+ for (i = 0; i < snf->ecc_steps; i++) { -+ raw_sector = snf->page_cache + i * snf->raw_sector_size; -+ -+ if (buf) { -+ memcpy(bufptr, raw_sector, snf->nfi_soc->sector_size); -+ bufptr += snf->nfi_soc->sector_size; -+ } -+ -+ raw_sector += snf->nfi_soc->sector_size; -+ -+ if (oob) { -+ memcpy(oobptr, raw_sector, snf->nfi_soc->fdm_size); -+ oobptr += snf->nfi_soc->fdm_size; -+ raw_sector += snf->nfi_soc->fdm_size; -+ -+ memcpy(eccptr, raw_sector, ecc_bytes); -+ eccptr += ecc_bytes; -+ } -+ } -+} -+ -+static int mtk_snand_do_read_page(struct mtk_snand *snf, uint64_t addr, -+ void *buf, void *oob, bool raw, bool format) -+{ -+ uint64_t die_addr; -+ uint32_t page; -+ int ret; -+ -+ die_addr = mtk_snand_select_die_address(snf, addr); -+ page = die_addr >> snf->writesize_shift; -+ -+ ret = mtk_snand_page_op(snf, page, SNAND_CMD_READ_TO_CACHE); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_poll_status(snf, SNFI_POLL_INTERVAL); -+ if (ret < 0) { -+ snand_log_chip(snf->pdev, "Read to cache command timed out\n"); -+ return ret; -+ } -+ -+ ret = mtk_snand_read_cache(snf, page, raw); -+ if (ret < 0 && ret != -EBADMSG) -+ return ret; -+ -+ if (raw) { -+ if (format) { -+ mtk_snand_bm_swap_raw(snf); -+ mtk_snand_fdm_bm_swap_raw(snf); -+ mtk_snand_from_raw_page(snf, buf, oob); -+ } else { -+ if (buf) -+ memcpy(buf, snf->page_cache, snf->writesize); -+ -+ if (oob) { -+ memset(oob, 0xff, snf->oobsize); -+ memcpy(oob, snf->page_cache + snf->writesize, -+ snf->ecc_steps * snf->spare_per_sector); -+ } -+ } -+ } else { -+ mtk_snand_bm_swap(snf); -+ mtk_snand_fdm_bm_swap(snf); -+ -+ if (buf) -+ memcpy(buf, snf->page_cache, snf->writesize); -+ -+ if (oob) { -+ memset(oob, 0xff, snf->oobsize); -+ memcpy(oob, snf->page_cache + snf->writesize, -+ snf->ecc_steps * snf->nfi_soc->fdm_size); -+ } -+ } -+ -+ return ret; -+} -+ -+int mtk_snand_read_page(struct mtk_snand *snf, uint64_t addr, void *buf, -+ void *oob, bool raw) -+{ -+ if (!snf || (!buf && !oob)) -+ return -EINVAL; -+ -+ if (addr >= snf->size) -+ return -EINVAL; -+ -+ return mtk_snand_do_read_page(snf, addr, buf, oob, raw, true); -+} -+ -+static void mtk_snand_write_fdm(struct mtk_snand *snf, const uint8_t *buf) -+{ -+ uint32_t vall, valm, fdm_size = snf->nfi_soc->fdm_size; -+ const uint8_t *oobptr = buf; -+ int i, j; -+ -+ for (i = 0; i < snf->ecc_steps; i++) { -+ vall = 0; -+ valm = 0; -+ -+ for (j = 0; j < 8; j++) { -+ if (j < 4) -+ vall |= (j < fdm_size ? oobptr[j] : 0xff) -+ << (j * 8); -+ else -+ valm |= (j < fdm_size ? oobptr[j] : 0xff) -+ << ((j - 4) * 8); -+ } -+ -+ nfi_write32(snf, NFI_FDML(i), vall); -+ nfi_write32(snf, NFI_FDMM(i), valm); -+ -+ oobptr += fdm_size; -+ } -+} -+ -+static int mtk_snand_program_load(struct mtk_snand *snf, uint32_t page, -+ bool raw) -+{ -+ uint32_t coladdr, rwbytes, mode, len; -+ uintptr_t dma_addr; -+ int ret; -+ -+ /* Column address with plane bit */ -+ coladdr = mtk_snand_get_plane_address(snf, page); -+ -+ mtk_snand_mac_reset(snf); -+ mtk_nfi_reset(snf); -+ -+ /* Write FDM registers if necessary */ -+ if (!raw) -+ mtk_snand_write_fdm(snf, snf->page_cache + snf->writesize); -+ -+ /* Command */ -+ nfi_write32(snf, SNF_PG_CTL1, (snf->opcode_pl << PG_LOAD_CMD_S)); -+ -+ /* Column address */ -+ nfi_write32(snf, SNF_PG_CTL2, coladdr); -+ -+ /* Set write mode */ -+ mode = snf->mode_pl ? PG_LOAD_X4_EN : 0; -+ nfi_rmw32(snf, SNF_MISC_CTL, PG_LOAD_X4_EN, mode | PG_LOAD_CUSTOM_EN); -+ -+ /* Set bytes to write */ -+ rwbytes = snf->ecc_steps * snf->raw_sector_size; -+ nfi_write32(snf, SNF_MISC_CTL2, (rwbytes << PROGRAM_LOAD_BYTE_NUM_S) | -+ rwbytes); -+ -+ /* NFI write prepare */ -+ mode = raw ? 0 : CNFG_HW_ECC_EN | CNFG_AUTO_FMT_EN; -+ nfi_write16(snf, NFI_CNFG, (CNFG_OP_MODE_PROGRAM << CNFG_OP_MODE_S) | -+ CNFG_DMA_BURST_EN | CNFG_DMA_MODE | mode); -+ -+ nfi_write32(snf, NFI_CON, (snf->ecc_steps << CON_SEC_NUM_S)); -+ -+ /* Prepare for DMA write */ -+ len = snf->writesize + snf->oobsize; -+ ret = dma_mem_map(snf->pdev, snf->page_cache, &dma_addr, len, true); -+ if (ret) { -+ snand_log_nfi(snf->pdev, -+ "DMA map to device failed with %d\n", ret); -+ return ret; -+ } -+ -+ nfi_write32(snf, NFI_STRADDR, (uint32_t)dma_addr); -+ -+ if (!raw) -+ mtk_snand_ecc_encoder_start(snf); -+ -+ /* Prepare for custom write interrupt */ -+ nfi_write32(snf, NFI_INTR_EN, NFI_IRQ_INTR_EN | NFI_IRQ_CUS_PG); -+ irq_completion_init(snf->pdev); -+ -+ /* Trigger NFI into custom mode */ -+ nfi_write16(snf, NFI_CMD, NFI_CMD_DUMMY_WRITE); -+ -+ /* Start DMA write */ -+ nfi_rmw32(snf, NFI_CON, 0, CON_BWR); -+ nfi_write16(snf, NFI_STRDATA, STR_DATA); -+ -+ /* Wait for operation finished */ -+ ret = irq_completion_wait(snf->pdev, snf->nfi_base + SNF_STA_CTL1, -+ CUS_PG_DONE, SNFI_POLL_INTERVAL); -+ if (ret) { -+ snand_log_nfi(snf->pdev, -+ "DMA timed out for program load\n"); -+ goto cleanup; -+ } -+ -+ if (!raw) -+ mtk_snand_ecc_encoder_stop(snf); -+ -+cleanup: -+ /* DMA cleanup */ -+ dma_mem_unmap(snf->pdev, dma_addr, len, true); -+ -+ /* Stop write */ -+ nfi_write16(snf, NFI_CON, 0); -+ -+ /* Clear SNF done flag */ -+ nfi_rmw32(snf, SNF_STA_CTL1, 0, CUS_PG_DONE); -+ nfi_write32(snf, SNF_STA_CTL1, 0); -+ -+ /* Disable interrupt */ -+ nfi_read32(snf, NFI_INTR_STA); -+ nfi_write32(snf, NFI_INTR_EN, 0); -+ -+ nfi_rmw32(snf, SNF_MISC_CTL, PG_LOAD_CUSTOM_EN, 0); -+ -+ return ret; -+} -+ -+static void mtk_snand_to_raw_page(struct mtk_snand *snf, -+ const void *buf, const void *oob, -+ bool empty_ecc) -+{ -+ uint32_t i, ecc_bytes = snf->spare_per_sector - snf->nfi_soc->fdm_size; -+ const uint8_t *eccptr = oob + snf->ecc_steps * snf->nfi_soc->fdm_size; -+ const uint8_t *bufptr = buf, *oobptr = oob; -+ uint8_t *raw_sector; -+ -+ memset(snf->page_cache, 0xff, snf->writesize + snf->oobsize); -+ for (i = 0; i < snf->ecc_steps; i++) { -+ raw_sector = snf->page_cache + i * snf->raw_sector_size; -+ -+ if (buf) { -+ memcpy(raw_sector, bufptr, snf->nfi_soc->sector_size); -+ bufptr += snf->nfi_soc->sector_size; -+ } -+ -+ raw_sector += snf->nfi_soc->sector_size; -+ -+ if (oob) { -+ memcpy(raw_sector, oobptr, snf->nfi_soc->fdm_size); -+ oobptr += snf->nfi_soc->fdm_size; -+ raw_sector += snf->nfi_soc->fdm_size; -+ -+ if (empty_ecc) -+ memset(raw_sector, 0xff, ecc_bytes); -+ else -+ memcpy(raw_sector, eccptr, ecc_bytes); -+ eccptr += ecc_bytes; -+ } -+ } -+} -+ -+static bool mtk_snand_is_empty_page(struct mtk_snand *snf, const void *buf, -+ const void *oob) -+{ -+ const uint8_t *p = buf; -+ uint32_t i, j; -+ -+ if (buf) { -+ for (i = 0; i < snf->writesize; i++) { -+ if (p[i] != 0xff) -+ return false; -+ } -+ } -+ -+ if (oob) { -+ for (j = 0; j < snf->ecc_steps; j++) { -+ p = oob + j * snf->nfi_soc->fdm_size; -+ -+ for (i = 0; i < snf->nfi_soc->fdm_ecc_size; i++) { -+ if (p[i] != 0xff) -+ return false; -+ } -+ } -+ } -+ -+ return true; -+} -+ -+static int mtk_snand_do_write_page(struct mtk_snand *snf, uint64_t addr, -+ const void *buf, const void *oob, -+ bool raw, bool format) -+{ -+ uint64_t die_addr; -+ bool empty_ecc = false; -+ uint32_t page; -+ int ret; -+ -+ die_addr = mtk_snand_select_die_address(snf, addr); -+ page = die_addr >> snf->writesize_shift; -+ -+ if (!raw && mtk_snand_is_empty_page(snf, buf, oob)) { -+ /* -+ * If the data in the page to be ecc-ed is full 0xff, -+ * change to raw write mode -+ */ -+ raw = true; -+ format = true; -+ -+ /* fill ecc parity code region with 0xff */ -+ empty_ecc = true; -+ } -+ -+ if (raw) { -+ if (format) { -+ mtk_snand_to_raw_page(snf, buf, oob, empty_ecc); -+ mtk_snand_fdm_bm_swap_raw(snf); -+ mtk_snand_bm_swap_raw(snf); -+ } else { -+ memset(snf->page_cache, 0xff, -+ snf->writesize + snf->oobsize); -+ -+ if (buf) -+ memcpy(snf->page_cache, buf, snf->writesize); -+ -+ if (oob) { -+ memcpy(snf->page_cache + snf->writesize, oob, -+ snf->ecc_steps * snf->spare_per_sector); -+ } -+ } -+ } else { -+ memset(snf->page_cache, 0xff, snf->writesize + snf->oobsize); -+ if (buf) -+ memcpy(snf->page_cache, buf, snf->writesize); -+ -+ if (oob) { -+ memcpy(snf->page_cache + snf->writesize, oob, -+ snf->ecc_steps * snf->nfi_soc->fdm_size); -+ } -+ -+ mtk_snand_fdm_bm_swap(snf); -+ mtk_snand_bm_swap(snf); -+ } -+ -+ ret = mtk_snand_write_enable(snf); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_program_load(snf, page, raw); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_page_op(snf, page, SNAND_CMD_PROGRAM_EXECUTE); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_poll_status(snf, SNFI_POLL_INTERVAL); -+ if (ret < 0) { -+ snand_log_chip(snf->pdev, -+ "Page program command timed out on page %u\n", -+ page); -+ return ret; -+ } -+ -+ if (ret & SNAND_STATUS_PROGRAM_FAIL) { -+ snand_log_chip(snf->pdev, -+ "Page program failed on page %u\n", page); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+int mtk_snand_write_page(struct mtk_snand *snf, uint64_t addr, const void *buf, -+ const void *oob, bool raw) -+{ -+ if (!snf || (!buf && !oob)) -+ return -EINVAL; -+ -+ if (addr >= snf->size) -+ return -EINVAL; -+ -+ return mtk_snand_do_write_page(snf, addr, buf, oob, raw, true); -+} -+ -+int mtk_snand_erase_block(struct mtk_snand *snf, uint64_t addr) -+{ -+ uint64_t die_addr; -+ uint32_t page, block; -+ int ret; -+ -+ if (!snf) -+ return -EINVAL; -+ -+ if (addr >= snf->size) -+ return -EINVAL; -+ -+ die_addr = mtk_snand_select_die_address(snf, addr); -+ block = die_addr >> snf->erasesize_shift; -+ page = block << (snf->erasesize_shift - snf->writesize_shift); -+ -+ ret = mtk_snand_write_enable(snf); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_page_op(snf, page, SNAND_CMD_BLOCK_ERASE); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_poll_status(snf, SNFI_POLL_INTERVAL); -+ if (ret < 0) { -+ snand_log_chip(snf->pdev, -+ "Block erase command timed out on block %u\n", -+ block); -+ return ret; -+ } -+ -+ if (ret & SNAND_STATUS_ERASE_FAIL) { -+ snand_log_chip(snf->pdev, -+ "Block erase failed on block %u\n", block); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static int mtk_snand_block_isbad_std(struct mtk_snand *snf, uint64_t addr) -+{ -+ int ret; -+ -+ ret = mtk_snand_do_read_page(snf, addr, NULL, snf->buf_cache, true, -+ false); -+ if (ret && ret != -EBADMSG) -+ return ret; -+ -+ return snf->buf_cache[0] != 0xff; -+} -+ -+static int mtk_snand_block_isbad_mtk(struct mtk_snand *snf, uint64_t addr) -+{ -+ int ret; -+ -+ ret = mtk_snand_do_read_page(snf, addr, NULL, snf->buf_cache, true, -+ true); -+ if (ret && ret != -EBADMSG) -+ return ret; -+ -+ return snf->buf_cache[0] != 0xff; -+} -+ -+int mtk_snand_block_isbad(struct mtk_snand *snf, uint64_t addr) -+{ -+ if (!snf) -+ return -EINVAL; -+ -+ if (addr >= snf->size) -+ return -EINVAL; -+ -+ addr &= ~snf->erasesize_mask; -+ -+ if (snf->nfi_soc->bbm_swap) -+ return mtk_snand_block_isbad_std(snf, addr); -+ -+ return mtk_snand_block_isbad_mtk(snf, addr); -+} -+ -+static int mtk_snand_block_markbad_std(struct mtk_snand *snf, uint64_t addr) -+{ -+ /* Standard BBM position */ -+ memset(snf->buf_cache, 0xff, snf->oobsize); -+ snf->buf_cache[0] = 0; -+ -+ return mtk_snand_do_write_page(snf, addr, NULL, snf->buf_cache, true, -+ false); -+} -+ -+static int mtk_snand_block_markbad_mtk(struct mtk_snand *snf, uint64_t addr) -+{ -+ /* Write the whole page with zeros */ -+ memset(snf->buf_cache, 0, snf->writesize + snf->oobsize); -+ -+ return mtk_snand_do_write_page(snf, addr, snf->buf_cache, -+ snf->buf_cache + snf->writesize, true, -+ true); -+} -+ -+int mtk_snand_block_markbad(struct mtk_snand *snf, uint64_t addr) -+{ -+ if (!snf) -+ return -EINVAL; -+ -+ if (addr >= snf->size) -+ return -EINVAL; -+ -+ addr &= ~snf->erasesize_mask; -+ -+ if (snf->nfi_soc->bbm_swap) -+ return mtk_snand_block_markbad_std(snf, addr); -+ -+ return mtk_snand_block_markbad_mtk(snf, addr); -+} -+ -+int mtk_snand_fill_oob(struct mtk_snand *snf, uint8_t *oobraw, -+ const uint8_t *oobbuf, size_t ooblen) -+{ -+ size_t len = ooblen, sect_fdm_len; -+ const uint8_t *oob = oobbuf; -+ uint32_t step = 0; -+ -+ if (!snf || !oobraw || !oob) -+ return -EINVAL; -+ -+ while (len && step < snf->ecc_steps) { -+ sect_fdm_len = snf->nfi_soc->fdm_size - 1; -+ if (sect_fdm_len > len) -+ sect_fdm_len = len; -+ -+ memcpy(oobraw + step * snf->nfi_soc->fdm_size + 1, oob, -+ sect_fdm_len); -+ -+ len -= sect_fdm_len; -+ oob += sect_fdm_len; -+ step++; -+ } -+ -+ return len; -+} -+ -+int mtk_snand_transfer_oob(struct mtk_snand *snf, uint8_t *oobbuf, -+ size_t ooblen, const uint8_t *oobraw) -+{ -+ size_t len = ooblen, sect_fdm_len; -+ uint8_t *oob = oobbuf; -+ uint32_t step = 0; -+ -+ if (!snf || !oobraw || !oob) -+ return -EINVAL; -+ -+ while (len && step < snf->ecc_steps) { -+ sect_fdm_len = snf->nfi_soc->fdm_size - 1; -+ if (sect_fdm_len > len) -+ sect_fdm_len = len; -+ -+ memcpy(oob, oobraw + step * snf->nfi_soc->fdm_size + 1, -+ sect_fdm_len); -+ -+ len -= sect_fdm_len; -+ oob += sect_fdm_len; -+ step++; -+ } -+ -+ return len; -+} -+ -+int mtk_snand_read_page_auto_oob(struct mtk_snand *snf, uint64_t addr, -+ void *buf, void *oob, size_t ooblen, -+ size_t *actualooblen, bool raw) -+{ -+ int ret, oobremain; -+ -+ if (!snf) -+ return -EINVAL; -+ -+ if (!oob) -+ return mtk_snand_read_page(snf, addr, buf, NULL, raw); -+ -+ ret = mtk_snand_read_page(snf, addr, buf, snf->buf_cache, raw); -+ if (ret && ret != -EBADMSG) { -+ if (actualooblen) -+ *actualooblen = 0; -+ return ret; -+ } -+ -+ oobremain = mtk_snand_transfer_oob(snf, oob, ooblen, snf->buf_cache); -+ if (actualooblen) -+ *actualooblen = ooblen - oobremain; -+ -+ return ret; -+} -+ -+int mtk_snand_write_page_auto_oob(struct mtk_snand *snf, uint64_t addr, -+ const void *buf, const void *oob, -+ size_t ooblen, size_t *actualooblen, bool raw) -+{ -+ int oobremain; -+ -+ if (!snf) -+ return -EINVAL; -+ -+ if (!oob) -+ return mtk_snand_write_page(snf, addr, buf, NULL, raw); -+ -+ memset(snf->buf_cache, 0xff, snf->oobsize); -+ oobremain = mtk_snand_fill_oob(snf, snf->buf_cache, oob, ooblen); -+ if (actualooblen) -+ *actualooblen = ooblen - oobremain; -+ -+ return mtk_snand_write_page(snf, addr, buf, snf->buf_cache, raw); -+} -+ -+int mtk_snand_get_chip_info(struct mtk_snand *snf, -+ struct mtk_snand_chip_info *info) -+{ -+ if (!snf || !info) -+ return -EINVAL; -+ -+ info->model = snf->model; -+ info->chipsize = snf->size; -+ info->blocksize = snf->erasesize; -+ info->pagesize = snf->writesize; -+ info->sparesize = snf->oobsize; -+ info->spare_per_sector = snf->spare_per_sector; -+ info->fdm_size = snf->nfi_soc->fdm_size; -+ info->fdm_ecc_size = snf->nfi_soc->fdm_ecc_size; -+ info->num_sectors = snf->ecc_steps; -+ info->sector_size = snf->nfi_soc->sector_size; -+ info->ecc_strength = snf->ecc_strength; -+ info->ecc_bytes = snf->ecc_bytes; -+ -+ return 0; -+} -+ -+int mtk_snand_irq_process(struct mtk_snand *snf) -+{ -+ uint32_t sta, ien; -+ -+ if (!snf) -+ return -EINVAL; -+ -+ sta = nfi_read32(snf, NFI_INTR_STA); -+ ien = nfi_read32(snf, NFI_INTR_EN); -+ -+ if (!(sta & ien)) -+ return 0; -+ -+ nfi_write32(snf, NFI_INTR_EN, 0); -+ irq_completion_done(snf->pdev); -+ -+ return 1; -+} -+ -+static int mtk_snand_select_spare_per_sector(struct mtk_snand *snf) -+{ -+ uint32_t spare_per_step = snf->oobsize / snf->ecc_steps; -+ int i, mul = 1; -+ -+ /* -+ * If we're using the 1KB sector size, HW will automatically -+ * double the spare size. So we should only use half of the value. -+ */ -+ if (snf->nfi_soc->sector_size == 1024) -+ mul = 2; -+ -+ spare_per_step /= mul; -+ -+ for (i = snf->nfi_soc->num_spare_size - 1; i >= 0; i--) { -+ if (snf->nfi_soc->spare_sizes[i] <= spare_per_step) { -+ snf->spare_per_sector = snf->nfi_soc->spare_sizes[i]; -+ snf->spare_per_sector *= mul; -+ return i; -+ } -+ } -+ -+ snand_log_nfi(snf->pdev, -+ "Page size %u+%u is not supported\n", snf->writesize, -+ snf->oobsize); -+ -+ return -1; -+} -+ -+static int mtk_snand_pagefmt_setup(struct mtk_snand *snf) -+{ -+ uint32_t spare_size_idx, spare_size_shift, pagesize_idx; -+ uint32_t sector_size_512; -+ -+ if (snf->nfi_soc->sector_size == 512) { -+ sector_size_512 = NFI_SEC_SEL_512; -+ spare_size_shift = NFI_SPARE_SIZE_S; -+ } else { -+ sector_size_512 = 0; -+ spare_size_shift = NFI_SPARE_SIZE_LS_S; -+ } -+ -+ switch (snf->writesize) { -+ case SZ_512: -+ pagesize_idx = NFI_PAGE_SIZE_512_2K; -+ break; -+ case SZ_2K: -+ if (snf->nfi_soc->sector_size == 512) -+ pagesize_idx = NFI_PAGE_SIZE_2K_4K; -+ else -+ pagesize_idx = NFI_PAGE_SIZE_512_2K; -+ break; -+ case SZ_4K: -+ if (snf->nfi_soc->sector_size == 512) -+ pagesize_idx = NFI_PAGE_SIZE_4K_8K; -+ else -+ pagesize_idx = NFI_PAGE_SIZE_2K_4K; -+ break; -+ case SZ_8K: -+ if (snf->nfi_soc->sector_size == 512) -+ pagesize_idx = NFI_PAGE_SIZE_8K_16K; -+ else -+ pagesize_idx = NFI_PAGE_SIZE_4K_8K; -+ break; -+ case SZ_16K: -+ pagesize_idx = NFI_PAGE_SIZE_8K_16K; -+ break; -+ default: -+ snand_log_nfi(snf->pdev, "Page size %u is not supported\n", -+ snf->writesize); -+ return -ENOTSUPP; -+ } -+ -+ spare_size_idx = mtk_snand_select_spare_per_sector(snf); -+ if (unlikely(spare_size_idx < 0)) -+ return -ENOTSUPP; -+ -+ snf->raw_sector_size = snf->nfi_soc->sector_size + -+ snf->spare_per_sector; -+ -+ /* Setup page format */ -+ nfi_write32(snf, NFI_PAGEFMT, -+ (snf->nfi_soc->fdm_ecc_size << NFI_FDM_ECC_NUM_S) | -+ (snf->nfi_soc->fdm_size << NFI_FDM_NUM_S) | -+ (spare_size_idx << spare_size_shift) | -+ (pagesize_idx << NFI_PAGE_SIZE_S) | -+ sector_size_512); -+ -+ return 0; -+} -+ -+static enum snand_flash_io mtk_snand_select_opcode(struct mtk_snand *snf, -+ uint32_t snfi_caps, uint8_t *opcode, -+ uint8_t *dummy, -+ const struct snand_io_cap *op_cap) -+{ -+ uint32_t i, caps; -+ -+ caps = snfi_caps & op_cap->caps; -+ -+ i = fls(caps); -+ if (i > 0) { -+ *opcode = op_cap->opcodes[i - 1].opcode; -+ if (dummy) -+ *dummy = op_cap->opcodes[i - 1].dummy; -+ return i - 1; -+ } -+ -+ return __SNAND_IO_MAX; -+} -+ -+static int mtk_snand_select_opcode_rfc(struct mtk_snand *snf, -+ uint32_t snfi_caps, -+ const struct snand_io_cap *op_cap) -+{ -+ enum snand_flash_io idx; -+ -+ static const uint8_t rfc_modes[__SNAND_IO_MAX] = { -+ [SNAND_IO_1_1_1] = DATA_READ_MODE_X1, -+ [SNAND_IO_1_1_2] = DATA_READ_MODE_X2, -+ [SNAND_IO_1_2_2] = DATA_READ_MODE_DUAL, -+ [SNAND_IO_1_1_4] = DATA_READ_MODE_X4, -+ [SNAND_IO_1_4_4] = DATA_READ_MODE_QUAD, -+ }; -+ -+ idx = mtk_snand_select_opcode(snf, snfi_caps, &snf->opcode_rfc, -+ &snf->dummy_rfc, op_cap); -+ if (idx >= __SNAND_IO_MAX) { -+ snand_log_snfi(snf->pdev, -+ "No capable opcode for read from cache\n"); -+ return -ENOTSUPP; -+ } -+ -+ snf->mode_rfc = rfc_modes[idx]; -+ -+ if (idx == SNAND_IO_1_1_4 || idx == SNAND_IO_1_4_4) -+ snf->quad_spi_op = true; -+ -+ return 0; -+} -+ -+static int mtk_snand_select_opcode_pl(struct mtk_snand *snf, uint32_t snfi_caps, -+ const struct snand_io_cap *op_cap) -+{ -+ enum snand_flash_io idx; -+ -+ static const uint8_t pl_modes[__SNAND_IO_MAX] = { -+ [SNAND_IO_1_1_1] = 0, -+ [SNAND_IO_1_1_4] = 1, -+ }; -+ -+ idx = mtk_snand_select_opcode(snf, snfi_caps, &snf->opcode_pl, -+ NULL, op_cap); -+ if (idx >= __SNAND_IO_MAX) { -+ snand_log_snfi(snf->pdev, -+ "No capable opcode for program load\n"); -+ return -ENOTSUPP; -+ } -+ -+ snf->mode_pl = pl_modes[idx]; -+ -+ if (idx == SNAND_IO_1_1_4) -+ snf->quad_spi_op = true; -+ -+ return 0; -+} -+ -+static int mtk_snand_setup(struct mtk_snand *snf, -+ const struct snand_flash_info *snand_info) -+{ -+ const struct snand_mem_org *memorg = &snand_info->memorg; -+ uint32_t i, msg_size, snfi_caps; -+ int ret; -+ -+ /* Calculate flash memory organization */ -+ snf->model = snand_info->model; -+ snf->writesize = memorg->pagesize; -+ snf->oobsize = memorg->sparesize; -+ snf->erasesize = snf->writesize * memorg->pages_per_block; -+ snf->die_size = (uint64_t)snf->erasesize * memorg->blocks_per_die; -+ snf->size = snf->die_size * memorg->ndies; -+ snf->num_dies = memorg->ndies; -+ -+ snf->writesize_mask = snf->writesize - 1; -+ snf->erasesize_mask = snf->erasesize - 1; -+ snf->die_mask = snf->die_size - 1; -+ -+ snf->writesize_shift = ffs(snf->writesize) - 1; -+ snf->erasesize_shift = ffs(snf->erasesize) - 1; -+ snf->die_shift = mtk_snand_ffs64(snf->die_size) - 1; -+ -+ snf->select_die = snand_info->select_die; -+ -+ /* Determine opcodes for read from cache/program load */ -+ snfi_caps = SPI_IO_1_1_1 | SPI_IO_1_1_2 | SPI_IO_1_2_2; -+ if (snf->snfi_quad_spi) -+ snfi_caps |= SPI_IO_1_1_4 | SPI_IO_1_4_4; -+ -+ ret = mtk_snand_select_opcode_rfc(snf, snfi_caps, snand_info->cap_rd); -+ if (ret) -+ return ret; -+ -+ ret = mtk_snand_select_opcode_pl(snf, snfi_caps, snand_info->cap_pl); -+ if (ret) -+ return ret; -+ -+ /* ECC and page format */ -+ snf->ecc_steps = snf->writesize / snf->nfi_soc->sector_size; -+ if (snf->ecc_steps > snf->nfi_soc->max_sectors) { -+ snand_log_nfi(snf->pdev, "Page size %u is not supported\n", -+ snf->writesize); -+ return -ENOTSUPP; -+ } -+ -+ ret = mtk_snand_pagefmt_setup(snf); -+ if (ret) -+ return ret; -+ -+ msg_size = snf->nfi_soc->sector_size + snf->nfi_soc->fdm_ecc_size; -+ ret = mtk_ecc_setup(snf, snf->nfi_base + NFI_FDM0L, -+ snf->spare_per_sector - snf->nfi_soc->fdm_size, -+ msg_size); -+ if (ret) -+ return ret; -+ -+ nfi_write16(snf, NFI_CNFG, 0); -+ -+ /* Tuning options */ -+ nfi_write16(snf, NFI_DEBUG_CON1, WBUF_EN); -+ nfi_write32(snf, SNF_DLY_CTL3, (40 << SFCK_SAM_DLY_S)); -+ -+ /* Interrupts */ -+ nfi_read32(snf, NFI_INTR_STA); -+ nfi_write32(snf, NFI_INTR_EN, 0); -+ -+ /* Clear SNF done flag */ -+ nfi_rmw32(snf, SNF_STA_CTL1, 0, CUS_READ_DONE | CUS_PG_DONE); -+ nfi_write32(snf, SNF_STA_CTL1, 0); -+ -+ /* Initialization on all dies */ -+ for (i = 0; i < snf->num_dies; i++) { -+ mtk_snand_select_die(snf, i); -+ -+ /* Disable On-Die ECC engine */ -+ ret = mtk_snand_ondie_ecc_control(snf, false); -+ if (ret) -+ return ret; -+ -+ /* Disable block protection */ -+ mtk_snand_unlock(snf); -+ -+ /* Enable/disable quad-spi */ -+ mtk_snand_qspi_control(snf, snf->quad_spi_op); -+ } -+ -+ mtk_snand_select_die(snf, 0); -+ -+ return 0; -+} -+ -+static int mtk_snand_id_probe(struct mtk_snand *snf, -+ const struct snand_flash_info **snand_info) -+{ -+ uint8_t id[4], op[2]; -+ int ret; -+ -+ /* Read SPI-NAND JEDEC ID, OP + dummy/addr + ID */ -+ op[0] = SNAND_CMD_READID; -+ op[1] = 0; -+ ret = mtk_snand_mac_io(snf, op, 2, id, sizeof(id)); -+ if (ret) -+ return ret; -+ -+ *snand_info = snand_flash_id_lookup(SNAND_ID_DYMMY, id); -+ if (*snand_info) -+ return 0; -+ -+ /* Read SPI-NAND JEDEC ID, OP + ID */ -+ op[0] = SNAND_CMD_READID; -+ ret = mtk_snand_mac_io(snf, op, 1, id, sizeof(id)); -+ if (ret) -+ return ret; -+ -+ *snand_info = snand_flash_id_lookup(SNAND_ID_DYMMY, id); -+ if (*snand_info) -+ return 0; -+ -+ snand_log_chip(snf->pdev, -+ "Unrecognized SPI-NAND ID: %02x %02x %02x %02x\n", -+ id[0], id[1], id[2], id[3]); -+ -+ return -EINVAL; -+} -+ -+int mtk_snand_init(void *dev, const struct mtk_snand_platdata *pdata, -+ struct mtk_snand **psnf) -+{ -+ const struct snand_flash_info *snand_info; -+ struct mtk_snand tmpsnf, *snf; -+ uint32_t rawpage_size; -+ int ret; -+ -+ if (!pdata || !psnf) -+ return -EINVAL; -+ -+ if (pdata->soc >= __SNAND_SOC_MAX) { -+ snand_log_chip(dev, "Invalid SOC %u for MTK-SNAND\n", -+ pdata->soc); -+ return -EINVAL; -+ } -+ -+ /* Dummy instance only for initial reset and id probe */ -+ tmpsnf.nfi_base = pdata->nfi_base; -+ tmpsnf.ecc_base = pdata->ecc_base; -+ tmpsnf.soc = pdata->soc; -+ tmpsnf.nfi_soc = &mtk_snand_socs[pdata->soc]; -+ tmpsnf.pdev = dev; -+ -+ /* Switch to SNFI mode */ -+ writel(SPI_MODE, tmpsnf.nfi_base + SNF_CFG); -+ -+ /* Reset SNFI & NFI */ -+ mtk_snand_mac_reset(&tmpsnf); -+ mtk_nfi_reset(&tmpsnf); -+ -+ /* Reset SPI-NAND chip */ -+ ret = mtk_snand_chip_reset(&tmpsnf); -+ if (ret) { -+ snand_log_chip(dev, "Failed to reset SPI-NAND chip\n"); -+ return ret; -+ } -+ -+ /* Probe SPI-NAND flash by JEDEC ID */ -+ ret = mtk_snand_id_probe(&tmpsnf, &snand_info); -+ if (ret) -+ return ret; -+ -+ rawpage_size = snand_info->memorg.pagesize + -+ snand_info->memorg.sparesize; -+ -+ /* Allocate memory for instance and cache */ -+ snf = generic_mem_alloc(dev, sizeof(*snf) + rawpage_size); -+ if (!snf) { -+ snand_log_chip(dev, "Failed to allocate memory for instance\n"); -+ return -ENOMEM; -+ } -+ -+ snf->buf_cache = (uint8_t *)((uintptr_t)snf + sizeof(*snf)); -+ -+ /* Allocate memory for DMA buffer */ -+ snf->page_cache = dma_mem_alloc(dev, rawpage_size); -+ if (!snf->page_cache) { -+ generic_mem_free(dev, snf); -+ snand_log_chip(dev, -+ "Failed to allocate memory for DMA buffer\n"); -+ return -ENOMEM; -+ } -+ -+ /* Fill up instance */ -+ snf->pdev = dev; -+ snf->nfi_base = pdata->nfi_base; -+ snf->ecc_base = pdata->ecc_base; -+ snf->soc = pdata->soc; -+ snf->nfi_soc = &mtk_snand_socs[pdata->soc]; -+ snf->snfi_quad_spi = pdata->quad_spi; -+ -+ /* Initialize SNFI & ECC engine */ -+ ret = mtk_snand_setup(snf, snand_info); -+ if (ret) { -+ dma_mem_free(dev, snf->page_cache); -+ generic_mem_free(dev, snf); -+ return ret; -+ } -+ -+ *psnf = snf; -+ -+ return 0; -+} -+ -+int mtk_snand_cleanup(struct mtk_snand *snf) -+{ -+ if (!snf) -+ return 0; -+ -+ dma_mem_free(snf->pdev, snf->page_cache); -+ generic_mem_free(snf->pdev, snf); -+ -+ return 0; -+} ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand.h -@@ -0,0 +1,77 @@ -+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#ifndef _MTK_SNAND_H_ -+#define _MTK_SNAND_H_ -+ -+#ifndef PRIVATE_MTK_SNAND_HEADER -+#include -+#include -+#include -+#endif -+ -+enum mtk_snand_soc { -+ SNAND_SOC_MT7622, -+ SNAND_SOC_MT7629, -+ SNAND_SOC_MT7986, -+ -+ __SNAND_SOC_MAX -+}; -+ -+struct mtk_snand_platdata { -+ void *nfi_base; -+ void *ecc_base; -+ enum mtk_snand_soc soc; -+ bool quad_spi; -+}; -+ -+struct mtk_snand_chip_info { -+ const char *model; -+ uint64_t chipsize; -+ uint32_t blocksize; -+ uint32_t pagesize; -+ uint32_t sparesize; -+ uint32_t spare_per_sector; -+ uint32_t fdm_size; -+ uint32_t fdm_ecc_size; -+ uint32_t num_sectors; -+ uint32_t sector_size; -+ uint32_t ecc_strength; -+ uint32_t ecc_bytes; -+}; -+ -+struct mtk_snand; -+struct snand_flash_info; -+ -+int mtk_snand_init(void *dev, const struct mtk_snand_platdata *pdata, -+ struct mtk_snand **psnf); -+int mtk_snand_cleanup(struct mtk_snand *snf); -+ -+int mtk_snand_chip_reset(struct mtk_snand *snf); -+int mtk_snand_read_page(struct mtk_snand *snf, uint64_t addr, void *buf, -+ void *oob, bool raw); -+int mtk_snand_write_page(struct mtk_snand *snf, uint64_t addr, const void *buf, -+ const void *oob, bool raw); -+int mtk_snand_erase_block(struct mtk_snand *snf, uint64_t addr); -+int mtk_snand_block_isbad(struct mtk_snand *snf, uint64_t addr); -+int mtk_snand_block_markbad(struct mtk_snand *snf, uint64_t addr); -+int mtk_snand_fill_oob(struct mtk_snand *snf, uint8_t *oobraw, -+ const uint8_t *oobbuf, size_t ooblen); -+int mtk_snand_transfer_oob(struct mtk_snand *snf, uint8_t *oobbuf, -+ size_t ooblen, const uint8_t *oobraw); -+int mtk_snand_read_page_auto_oob(struct mtk_snand *snf, uint64_t addr, -+ void *buf, void *oob, size_t ooblen, -+ size_t *actualooblen, bool raw); -+int mtk_snand_write_page_auto_oob(struct mtk_snand *snf, uint64_t addr, -+ const void *buf, const void *oob, -+ size_t ooblen, size_t *actualooblen, -+ bool raw); -+int mtk_snand_get_chip_info(struct mtk_snand *snf, -+ struct mtk_snand_chip_info *info); -+int mtk_snand_irq_process(struct mtk_snand *snf); -+ -+#endif /* _MTK_SNAND_H_ */ diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch deleted file mode 100644 index 4a06acc2..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-15-mtd-mtk-snand-add-support-for-SPL.patch +++ /dev/null @@ -1,174 +0,0 @@ -From b7fb0e0674db12bcf53df4b107a17c80758ee5d3 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Wed, 3 Mar 2021 08:57:29 +0800 -Subject: [PATCH 05/12] mtd: mtk-snand: add support for SPL - -Add support to initialize SPI-NAND in SPL. -Add implementation for SPL NAND loader. - -Signed-off-by: Weijie Gao ---- - drivers/mtd/mtk-snand/Kconfig | 6 ++ - drivers/mtd/mtk-snand/Makefile | 4 + - drivers/mtd/mtk-snand/mtk-snand-spl.c | 132 ++++++++++++++++++++++++++ - 3 files changed, 142 insertions(+) - create mode 100644 drivers/mtd/mtk-snand/mtk-snand-spl.c - ---- a/drivers/mtd/mtk-snand/Kconfig -+++ b/drivers/mtd/mtk-snand/Kconfig -@@ -19,3 +19,9 @@ config MTK_SPI_NAND_MTD - help - This option enables access to SPI-NAND flashes through the - MTD interface of MediaTek SPI NAND Flash Controller -+ -+config SPL_MTK_SPI_NAND -+ tristate "SPL support for MediaTek SPI NAND flash controller" -+ depends on MTK_SPI_NAND -+ help -+ This option enables access to SPI-NAND flashes in the SPL stage ---- a/drivers/mtd/mtk-snand/Makefile -+++ b/drivers/mtd/mtk-snand/Makefile -@@ -8,4 +8,8 @@ - obj-y += mtk-snand.o mtk-snand-ecc.o mtk-snand-ids.o mtk-snand-os.o - obj-$(CONFIG_MTK_SPI_NAND_MTD) += mtk-snand-mtd.o - -+ifdef CONFIG_SPL_BUILD -+obj-$(CONFIG_SPL_MTK_SPI_NAND) += mtk-snand-spl.o -+endif -+ - ccflags-y += -DPRIVATE_MTK_SNAND_HEADER ---- /dev/null -+++ b/drivers/mtd/mtk-snand/mtk-snand-spl.c -@@ -0,0 +1,132 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (C) 2020 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "mtk-snand.h" -+ -+static struct mtk_snand *snf; -+static struct mtk_snand_chip_info cinfo; -+static u32 oobavail; -+ -+static u8 *page_cache; -+ -+int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst) -+{ -+ u32 sizeremain = size, chunksize, leading; -+ uint32_t off = offs, writesize_mask = cinfo.pagesize - 1; -+ uint8_t *ptr = dst; -+ int ret; -+ -+ if (!snf) -+ return -ENODEV; -+ -+ while (sizeremain) { -+ WATCHDOG_RESET(); -+ -+ leading = off & writesize_mask; -+ chunksize = cinfo.pagesize - leading; -+ if (chunksize > sizeremain) -+ chunksize = sizeremain; -+ -+ if (chunksize == cinfo.pagesize) { -+ ret = mtk_snand_read_page(snf, off - leading, ptr, -+ NULL, false); -+ if (ret) -+ break; -+ } else { -+ ret = mtk_snand_read_page(snf, off - leading, -+ page_cache, NULL, false); -+ if (ret) -+ break; -+ -+ memcpy(ptr, page_cache + leading, chunksize); -+ } -+ -+ off += chunksize; -+ ptr += chunksize; -+ sizeremain -= chunksize; -+ } -+ -+ return ret; -+} -+ -+void nand_init(void) -+{ -+ struct mtk_snand_platdata mtk_snand_pdata = {}; -+ struct udevice *dev; -+ fdt_addr_t base; -+ int ret; -+ -+ ret = uclass_get_device_by_driver(UCLASS_MTD, DM_DRIVER_GET(mtk_snand), -+ &dev); -+ if (ret) { -+ printf("mtk-snand-spl: Device instance not found!\n"); -+ return; -+ } -+ -+ base = dev_read_addr_name(dev, "nfi"); -+ if (base == FDT_ADDR_T_NONE) { -+ printf("mtk-snand-spl: NFI base not set\n"); -+ return; -+ } -+ mtk_snand_pdata.nfi_base = map_sysmem(base, 0); -+ -+ base = dev_read_addr_name(dev, "ecc"); -+ if (base == FDT_ADDR_T_NONE) { -+ printf("mtk-snand-spl: ECC base not set\n"); -+ return; -+ } -+ mtk_snand_pdata.ecc_base = map_sysmem(base, 0); -+ -+ mtk_snand_pdata.soc = dev_get_driver_data(dev); -+ mtk_snand_pdata.quad_spi = dev_read_bool(dev, "quad-spi"); -+ -+ ret = mtk_snand_init(NULL, &mtk_snand_pdata, &snf); -+ if (ret) { -+ printf("mtk-snand-spl: failed to initialize SPI-NAND\n"); -+ return; -+ } -+ -+ mtk_snand_get_chip_info(snf, &cinfo); -+ -+ oobavail = cinfo.num_sectors * (cinfo.fdm_size - 1); -+ -+ printf("SPI-NAND: %s (%uMB)\n", cinfo.model, -+ (u32)(cinfo.chipsize >> 20)); -+ -+ page_cache = malloc(cinfo.pagesize + cinfo.sparesize); -+ if (!page_cache) { -+ mtk_snand_cleanup(snf); -+ printf("mtk-snand-spl: failed to allocate page cache\n"); -+ } -+} -+ -+void nand_deselect(void) -+{ -+ -+} -+ -+static const struct udevice_id mtk_snand_ids[] = { -+ { .compatible = "mediatek,mt7622-snand", .data = SNAND_SOC_MT7622 }, -+ { .compatible = "mediatek,mt7629-snand", .data = SNAND_SOC_MT7629 }, -+ { .compatible = "mediatek,mt7986-snand", .data = SNAND_SOC_MT7986 }, -+ { /* sentinel */ }, -+}; -+ -+U_BOOT_DRIVER(mtk_snand) = { -+ .name = "mtk-snand", -+ .id = UCLASS_MTD, -+ .of_match = mtk_snand_ids, -+ .flags = DM_FLAG_PRE_RELOC, -+}; diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch deleted file mode 100644 index d4f34606..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-16-env-add-support-for-generic-MTD-device.patch +++ /dev/null @@ -1,409 +0,0 @@ -From a26620ec83fa3077f0c261046e82091f7455736f Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Wed, 3 Mar 2021 10:11:32 +0800 -Subject: [PATCH 06/12] env: add support for generic MTD device - -Add an env driver for generic MTD device. - -Signed-off-by: Weijie Gao ---- - cmd/nvedit.c | 3 +- - env/Kconfig | 37 +++++- - env/Makefile | 1 + - env/env.c | 3 + - env/mtd.c | 256 +++++++++++++++++++++++++++++++++++++++++ - include/env_internal.h | 1 + - tools/Makefile | 1 + - 7 files changed, 299 insertions(+), 3 deletions(-) - create mode 100644 env/mtd.c - ---- a/cmd/nvedit.c -+++ b/cmd/nvedit.c -@@ -48,6 +48,7 @@ DECLARE_GLOBAL_DATA_PTR; - defined(CONFIG_ENV_IS_IN_MMC) || \ - defined(CONFIG_ENV_IS_IN_FAT) || \ - defined(CONFIG_ENV_IS_IN_EXT4) || \ -+ defined(CONFIG_ENV_IS_IN_MTD) || \ - defined(CONFIG_ENV_IS_IN_NAND) || \ - defined(CONFIG_ENV_IS_IN_NVRAM) || \ - defined(CONFIG_ENV_IS_IN_ONENAND) || \ -@@ -62,7 +63,7 @@ DECLARE_GLOBAL_DATA_PTR; - - #if !defined(ENV_IS_IN_DEVICE) && \ - !defined(CONFIG_ENV_IS_NOWHERE) --# error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|MMC|FAT|EXT4|\ -+# error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|MMC|FAT|EXT4|MTD|\ - NAND|NVRAM|ONENAND|SATA|SPI_FLASH|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE - #endif - ---- a/env/Kconfig -+++ b/env/Kconfig -@@ -19,7 +19,7 @@ config ENV_IS_NOWHERE - !ENV_IS_IN_MMC && !ENV_IS_IN_NAND && \ - !ENV_IS_IN_NVRAM && !ENV_IS_IN_ONENAND && \ - !ENV_IS_IN_REMOTE && !ENV_IS_IN_SPI_FLASH && \ -- !ENV_IS_IN_UBI -+ !ENV_IS_IN_UBI && !ENV_IS_IN_MTD - help - Define this if you don't want to or can't have an environment stored - on a storage medium. In this case the environment will still exist -@@ -208,6 +208,27 @@ config ENV_IS_IN_MMC - This value is also in units of bytes, but must also be aligned to - an MMC sector boundary. - -+config ENV_IS_IN_MTD -+ bool "Environment in a MTD device" -+ depends on !CHAIN_OF_TRUST -+ depends on MTD -+ help -+ Define this if you have a MTD device which you want to use for -+ the environment. -+ -+ - CONFIG_ENV_MTD_NAME: -+ - CONFIG_ENV_OFFSET: -+ - CONFIG_ENV_SIZE: -+ -+ These three #defines specify the MTD device where the environment -+ is stored, offset and size of the environment area within the MTD -+ device. CONFIG_ENV_OFFSET must be aligned to an erase block boundary. -+ -+ - CONFIG_ENV_SIZE_REDUND: -+ -+ This #define specify the maximum size allowed for read/write/erase -+ with skipped bad blocks starting from ENV_OFFSET. -+ - config ENV_IS_IN_NAND - bool "Environment in a NAND device" - depends on !CHAIN_OF_TRUST -@@ -535,10 +556,16 @@ config ENV_ADDR_REDUND - Offset from the start of the device (or partition) of the redundant - environment location. - -+config ENV_MTD_NAME -+ string "Name of the MTD device storing the environment" -+ depends on ENV_IS_IN_MTD -+ help -+ Name of the MTD device that stores the environment -+ - config ENV_OFFSET - hex "Environment offset" - depends on ENV_IS_IN_EEPROM || ENV_IS_IN_MMC || ENV_IS_IN_NAND || \ -- ENV_IS_IN_SPI_FLASH -+ ENV_IS_IN_SPI_FLASH || ENV_IS_IN_MTD - default 0x3f8000 if ARCH_ROCKCHIP && ENV_IS_IN_MMC - default 0x140000 if ARCH_ROCKCHIP && ENV_IS_IN_SPI_FLASH - default 0x88000 if ARCH_SUNXI -@@ -583,6 +610,12 @@ config ENV_SECT_SIZE - help - Size of the sector containing the environment. - -+config ENV_SIZE_REDUND -+ hex "Redundant environment size" -+ depends on ENV_IS_IN_MTD -+ help -+ The maximum size allowed for read/write/erase with skipped bad blocks. -+ - config ENV_UBI_PART - string "UBI partition name" - depends on ENV_IS_IN_UBI ---- a/env/Makefile -+++ b/env/Makefile -@@ -26,6 +26,7 @@ obj-$(CONFIG_$(SPL_TPL_)ENV_IS_NOWHERE) - obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_MMC) += mmc.o - obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_FAT) += fat.o - obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_EXT4) += ext4.o -+obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_MTD) += mtd.o - obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_NAND) += nand.o - obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_SPI_FLASH) += sf.o - obj-$(CONFIG_$(SPL_TPL_)ENV_IS_IN_FLASH) += flash.o ---- a/env/env.c -+++ b/env/env.c -@@ -69,6 +69,9 @@ static enum env_location env_locations[] - #ifdef CONFIG_ENV_IS_IN_MMC - ENVL_MMC, - #endif -+#ifdef CONFIG_ENV_IS_IN_MTD -+ ENVL_MTD, -+#endif - #ifdef CONFIG_ENV_IS_IN_NAND - ENVL_NAND, - #endif ---- /dev/null -+++ b/env/mtd.c -@@ -0,0 +1,256 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * Copyright (C) 2021 MediaTek Inc. All Rights Reserved. -+ * -+ * Author: Weijie Gao -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#if CONFIG_ENV_SIZE_REDUND < CONFIG_ENV_SIZE -+#undef CONFIG_ENV_SIZE_REDUND -+#define CONFIG_ENV_SIZE_REDUND CONFIG_ENV_SIZE -+#endif -+ -+#if defined(ENV_IS_EMBEDDED) -+env_t *env_ptr = &environment; -+#else /* ! ENV_IS_EMBEDDED */ -+env_t *env_ptr; -+#endif /* ENV_IS_EMBEDDED */ -+ -+DECLARE_GLOBAL_DATA_PTR; -+ -+static int env_mtd_init(void) -+{ -+#if defined(ENV_IS_EMBEDDED) -+ int crc1_ok = 0, crc2_ok = 0; -+ env_t *tmp_env1; -+ -+ tmp_env1 = env_ptr; -+ crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; -+ -+ if (!crc1_ok && !crc2_ok) { -+ gd->env_addr = 0; -+ gd->env_valid = ENV_INVALID; -+ -+ return 0; -+ } else if (crc1_ok && !crc2_ok) { -+ gd->env_valid = ENV_VALID; -+ } -+ -+ if (gd->env_valid == ENV_VALID) -+ env_ptr = tmp_env1; -+ -+ gd->env_addr = (ulong)env_ptr->data; -+ -+#else /* ENV_IS_EMBEDDED */ -+ gd->env_addr = (ulong)&default_environment[0]; -+ gd->env_valid = ENV_VALID; -+#endif /* ENV_IS_EMBEDDED */ -+ -+ return 0; -+} -+ -+static struct mtd_info *env_mtd_get_dev(void) -+{ -+ struct mtd_info *mtd; -+ -+ mtd_probe_devices(); -+ -+ mtd = get_mtd_device_nm(CONFIG_ENV_MTD_NAME); -+ if (IS_ERR(mtd) || !mtd) { -+ printf("MTD device '%s' not found\n", CONFIG_ENV_MTD_NAME); -+ return NULL; -+ } -+ -+ return mtd; -+} -+ -+static inline bool mtd_addr_is_block_aligned(struct mtd_info *mtd, u64 addr) -+{ -+ return (addr & mtd->erasesize_mask) == 0; -+} -+ -+static int mtd_io_skip_bad(struct mtd_info *mtd, bool read, loff_t offset, -+ size_t length, size_t redund, u8 *buffer) -+{ -+ struct mtd_oob_ops io_op = {}; -+ size_t remaining = length; -+ loff_t off, end; -+ int ret; -+ -+ io_op.mode = MTD_OPS_PLACE_OOB; -+ io_op.len = mtd->writesize; -+ io_op.datbuf = (void *)buffer; -+ -+ /* Search for the first good block after the given offset */ -+ off = offset; -+ end = (off + redund) | (mtd->erasesize - 1); -+ while (mtd_block_isbad(mtd, off) && off < end) -+ off += mtd->erasesize; -+ -+ /* Reached end position */ -+ if (off >= end) -+ return -EIO; -+ -+ /* Loop over the pages to do the actual read/write */ -+ while (remaining) { -+ /* Skip the block if it is bad */ -+ if (mtd_addr_is_block_aligned(mtd, off) && -+ mtd_block_isbad(mtd, off)) { -+ off += mtd->erasesize; -+ continue; -+ } -+ -+ if (read) -+ ret = mtd_read_oob(mtd, off, &io_op); -+ else -+ ret = mtd_write_oob(mtd, off, &io_op); -+ -+ if (ret) { -+ printf("Failure while %s at offset 0x%llx\n", -+ read ? "reading" : "writing", off); -+ break; -+ } -+ -+ off += io_op.retlen; -+ remaining -= io_op.retlen; -+ io_op.datbuf += io_op.retlen; -+ io_op.oobbuf += io_op.oobretlen; -+ -+ /* Reached end position */ -+ if (off >= end) -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+#ifdef CONFIG_CMD_SAVEENV -+static int mtd_erase_skip_bad(struct mtd_info *mtd, loff_t offset, -+ size_t length, size_t redund) -+{ -+ struct erase_info erase_op = {}; -+ loff_t end = (offset + redund) | (mtd->erasesize - 1); -+ int ret; -+ -+ erase_op.mtd = mtd; -+ erase_op.addr = offset; -+ erase_op.len = length; -+ -+ while (erase_op.len) { -+ ret = mtd_erase(mtd, &erase_op); -+ -+ /* Abort if its not a bad block error */ -+ if (ret != -EIO) -+ return ret; -+ -+ printf("Skipping bad block at 0x%08llx\n", erase_op.fail_addr); -+ -+ /* Skip bad block and continue behind it */ -+ erase_op.len -= erase_op.fail_addr - erase_op.addr; -+ erase_op.len -= mtd->erasesize; -+ erase_op.addr = erase_op.fail_addr + mtd->erasesize; -+ -+ /* Reached end position */ -+ if (erase_op.addr >= end) -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static int env_mtd_save(void) -+{ -+ ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1); -+ struct mtd_info *mtd; -+ int ret = 0; -+ -+ ret = env_export(env_new); -+ if (ret) -+ return ret; -+ -+ mtd = env_mtd_get_dev(); -+ if (!mtd) -+ return 1; -+ -+ printf("Erasing on MTD device '%s'... ", mtd->name); -+ -+ ret = mtd_erase_skip_bad(mtd, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, -+ CONFIG_ENV_SIZE_REDUND); -+ -+ puts(ret ? "FAILED\n" : "OK\n"); -+ -+ if (ret) { -+ put_mtd_device(mtd); -+ return 1; -+ } -+ -+ printf("Writing to MTD device '%s'... ", mtd->name); -+ -+ ret = mtd_io_skip_bad(mtd, false, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, -+ CONFIG_ENV_SIZE_REDUND, (u8 *)env_new); -+ -+ puts(ret ? "FAILED\n" : "OK\n"); -+ -+ put_mtd_device(mtd); -+ -+ return !!ret; -+} -+#endif /* CONFIG_CMD_SAVEENV */ -+ -+static int readenv(size_t offset, u_char *buf) -+{ -+ struct mtd_info *mtd; -+ int ret; -+ -+ mtd = env_mtd_get_dev(); -+ if (!mtd) -+ return 1; -+ -+ ret = mtd_io_skip_bad(mtd, true, offset, CONFIG_ENV_SIZE, -+ CONFIG_ENV_SIZE_REDUND, buf); -+ -+ put_mtd_device(mtd); -+ -+ return !!ret; -+} -+ -+static int env_mtd_load(void) -+{ -+#if !defined(ENV_IS_EMBEDDED) -+ ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); -+ int ret; -+ -+ ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf); -+ if (ret) { -+ env_set_default("readenv() failed", 0); -+ return -EIO; -+ } -+ -+ return env_import(buf, 1, H_EXTERNAL); -+#endif /* ! ENV_IS_EMBEDDED */ -+ -+ return 0; -+} -+ -+U_BOOT_ENV_LOCATION(mtd) = { -+ .location = ENVL_MTD, -+ ENV_NAME("MTD") -+ .load = env_mtd_load, -+#if defined(CONFIG_CMD_SAVEENV) -+ .save = env_save_ptr(env_mtd_save), -+#endif -+ .init = env_mtd_init, -+}; ---- a/include/env_internal.h -+++ b/include/env_internal.h -@@ -130,6 +130,7 @@ enum env_location { - ENVL_FAT, - ENVL_FLASH, - ENVL_MMC, -+ ENVL_MTD, - ENVL_NAND, - ENVL_NVRAM, - ENVL_ONENAND, ---- a/tools/Makefile -+++ b/tools/Makefile -@@ -41,6 +41,7 @@ ENVCRC-$(CONFIG_ENV_IS_EMBEDDED) = y - ENVCRC-$(CONFIG_ENV_IS_IN_EEPROM) = y - ENVCRC-$(CONFIG_ENV_IS_IN_FLASH) = y - ENVCRC-$(CONFIG_ENV_IS_IN_ONENAND) = y -+ENVCRC-$(CONFIG_ENV_IS_IN_MTD) = y - ENVCRC-$(CONFIG_ENV_IS_IN_NAND) = y - ENVCRC-$(CONFIG_ENV_IS_IN_NVRAM) = y - ENVCRC-$(CONFIG_ENV_IS_IN_SPI_FLASH) = y diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch deleted file mode 100644 index 4ee3d6f3..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-17-board-mt7629-add-support-for-booting-from-SPI-NAND.patch +++ /dev/null @@ -1,223 +0,0 @@ -From 3757223c3354b9feeffcbe916eb18eb8873bd133 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Wed, 3 Mar 2021 10:48:53 +0800 -Subject: [PATCH 07/12] board: mt7629: add support for booting from SPI-NAND - -Add support for mt7629 to boot from SPI-NAND. -Add a new defconfig for mt7629+spi-nand configuration. - -Signed-off-by: Weijie Gao ---- - arch/arm/dts/mt7629-rfb-u-boot.dtsi | 8 ++ - arch/arm/dts/mt7629-rfb.dts | 10 +++ - arch/arm/dts/mt7629.dtsi | 16 ++++ - board/mediatek/mt7629/Kconfig | 35 ++++++++- - configs/mt7629_nand_rfb_defconfig | 111 ++++++++++++++++++++++++++++ - include/configs/mt7629.h | 7 ++ - 6 files changed, 186 insertions(+), 1 deletion(-) - create mode 100644 configs/mt7629_nand_rfb_defconfig - ---- a/arch/arm/dts/mt7629-rfb-u-boot.dtsi -+++ b/arch/arm/dts/mt7629-rfb-u-boot.dtsi -@@ -40,3 +40,11 @@ - &snfi { - u-boot,dm-pre-reloc; - }; -+ -+&pinctrl { -+ u-boot,dm-pre-reloc; -+}; -+ -+&snand { -+ u-boot,dm-pre-reloc; -+}; ---- a/arch/arm/dts/mt7629-rfb.dts -+++ b/arch/arm/dts/mt7629-rfb.dts -@@ -47,9 +47,12 @@ - }; - - snfi_pins: snfi-pins { -+ u-boot,dm-pre-reloc; -+ - mux { - function = "flash"; - groups = "snfi"; -+ u-boot,dm-pre-reloc; - }; - }; - -@@ -102,6 +105,13 @@ - }; - }; - -+&snand { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&snfi_pins>; -+ status = "okay"; -+ quad-spi; -+}; -+ - &uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_pins>; ---- a/arch/arm/dts/mt7629.dtsi -+++ b/arch/arm/dts/mt7629.dtsi -@@ -229,6 +229,22 @@ - #size-cells = <0>; - }; - -+ snand: snand@1100d000 { -+ compatible = "mediatek,mt7629-snand"; -+ reg = <0x1100d000 0x1000>, -+ <0x1100e000 0x1000>; -+ reg-names = "nfi", "ecc"; -+ clocks = <&pericfg CLK_PERI_NFI_PD>, -+ <&pericfg CLK_PERI_SNFI_PD>, -+ <&pericfg CLK_PERI_NFIECC_PD>; -+ clock-names = "nfi_clk", "pad_clk", "ecc_clk"; -+ assigned-clocks = <&topckgen CLK_TOP_AXI_SEL>, -+ <&topckgen CLK_TOP_NFI_INFRA_SEL>; -+ assigned-clock-parents = <&topckgen CLK_TOP_SYSPLL1_D2>, -+ <&topckgen CLK_TOP_UNIVPLL2_D8>; -+ status = "disabled"; -+ }; -+ - snor: snor@11014000 { - compatible = "mediatek,mtk-snor"; - reg = <0x11014000 0x1000>; ---- /dev/null -+++ b/configs/mt7629_nand_rfb_defconfig -@@ -0,0 +1,111 @@ -+CONFIG_ARM=y -+CONFIG_SYS_ARCH_TIMER=y -+CONFIG_SYS_THUMB_BUILD=y -+CONFIG_ARCH_MEDIATEK=y -+CONFIG_SYS_TEXT_BASE=0x41e00000 -+CONFIG_SYS_MALLOC_F_LEN=0x4000 -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_ENV_SIZE=0x20000 -+CONFIG_ENV_OFFSET=0x100000 -+CONFIG_SPL_TEXT_BASE=0x201000 -+CONFIG_TARGET_MT7629=y -+CONFIG_BOOT_FROM_SNAND_2K_64=y -+CONFIG_SPL_SERIAL_SUPPORT=y -+CONFIG_SPL_DRIVERS_MISC_SUPPORT=y -+CONFIG_SPL_STACK_R_ADDR=0x40800000 -+CONFIG_SPL_PAYLOAD="u-boot.img" -+CONFIG_BUILD_TARGET="u-boot-mtk.bin" -+CONFIG_DEFAULT_DEVICE_TREE="mt7629-rfb" -+CONFIG_SPL_IMAGE="spl/u-boot-spl-mtk.bin" -+CONFIG_FIT=y -+CONFIG_FIT_VERBOSE=y -+CONFIG_BOOTDELAY=3 -+CONFIG_DEFAULT_FDT_FILE="mt7629-rfb" -+CONFIG_SYS_CONSOLE_IS_IN_ENV=y -+CONFIG_SYS_STDIO_DEREGISTER=y -+# CONFIG_DISPLAY_BOARDINFO is not set -+CONFIG_SPL_SYS_MALLOC_SIMPLE=y -+CONFIG_SPL_STACK_R=y -+CONFIG_SPL_MTD_SUPPORT=y -+CONFIG_SPL_NAND_SUPPORT=y -+CONFIG_SPL_WATCHDOG_SUPPORT=y -+CONFIG_HUSH_PARSER=y -+CONFIG_SYS_PROMPT="U-Boot> " -+CONFIG_CMD_BOOTMENU=y -+# CONFIG_BOOTM_NETBSD is not set -+# CONFIG_BOOTM_PLAN9 is not set -+# CONFIG_BOOTM_RTEMS is not set -+# CONFIG_BOOTM_VXWORKS is not set -+# CONFIG_CMD_ELF is not set -+# CONFIG_CMD_XIMG is not set -+CONFIG_CMD_BIND=y -+CONFIG_CMD_DM=y -+# CONFIG_CMD_FLASH is not set -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_MTD=y -+CONFIG_CMD_USB=y -+# CONFIG_CMD_SETEXPR is not set -+# CONFIG_CMD_NFS is not set -+CONFIG_CMD_PING=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_LOG=y -+CONFIG_EFI_PARTITION=y -+# CONFIG_SPL_PARTITION_UUIDS is not set -+CONFIG_PARTITION_TYPE_GUID=y -+CONFIG_OF_SPL_REMOVE_PROPS="interrupt-parent assigned-clocks assigned-clock-parents" -+CONFIG_ENV_OVERWRITE=y -+CONFIG_ENV_IS_IN_MTD=y -+CONFIG_ENV_MTD_NAME="spi-nand0" -+CONFIG_ENV_SIZE_REDUND=0x40000 -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_SPL_DM_SEQ_ALIAS=y -+CONFIG_REGMAP=y -+CONFIG_SPL_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_SPL_SYSCON=y -+CONFIG_BLK=y -+CONFIG_CLK=y -+CONFIG_SPL_CLK=y -+# CONFIG_MMC is not set -+CONFIG_MTD=y -+CONFIG_DM_MTD=y -+CONFIG_MTK_SPI_NAND=y -+CONFIG_MTK_SPI_NAND_MTD=y -+CONFIG_SPL_MTK_SPI_NAND=y -+CONFIG_DM_ETH=y -+CONFIG_MEDIATEK_ETH=y -+CONFIG_PHY=y -+CONFIG_PHY_MTK_TPHY=y -+CONFIG_PINCTRL=y -+CONFIG_PINCONF=y -+CONFIG_SPL_PINCTRL=y -+CONFIG_SPL_PINCONF=y -+CONFIG_PINCTRL_MT7629=y -+CONFIG_POWER_DOMAIN=y -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_RAM=y -+CONFIG_SPL_RAM=y -+CONFIG_DM_SERIAL=y -+CONFIG_MTK_SERIAL=y -+CONFIG_SPI=y -+CONFIG_DM_SPI=y -+CONFIG_SPI_MEM=y -+CONFIG_MTK_SNFI_SPI=y -+CONFIG_SYSRESET=y -+CONFIG_SPL_SYSRESET=y -+CONFIG_SYSRESET_WATCHDOG=y -+CONFIG_USB=y -+CONFIG_DM_USB=y -+# CONFIG_SPL_DM_USB is not set -+CONFIG_USB_XHCI_HCD=y -+CONFIG_USB_XHCI_MTK=y -+CONFIG_USB_STORAGE=y -+CONFIG_WDT_MTK=y -+CONFIG_FAT_WRITE=y -+CONFIG_LZMA=y -+CONFIG_SPL_LZMA=y -+# CONFIG_EFI_LOADER is not set ---- a/include/configs/mt7629.h -+++ b/include/configs/mt7629.h -@@ -25,12 +25,19 @@ - - /* Defines for SPL */ - #define CONFIG_SPL_STACK 0x106000 -+#ifdef CONFIG_MT7629_BOOT_FROM_SNAND -+#define CONFIG_SPL_MAX_SIZE SZ_128K -+#define CONFIG_SPL_MAX_FOOTPRINT SZ_128K -+#define CONFIG_SPL_PAD_TO 0x20000 -+#define CONFIG_SYS_NAND_U_BOOT_OFFS CONFIG_SPL_PAD_TO -+#else - #define CONFIG_SPL_MAX_SIZE SZ_64K - #define CONFIG_SPL_MAX_FOOTPRINT SZ_64K - #define CONFIG_SPL_PAD_TO 0x10000 - - #define CONFIG_SPI_ADDR 0x30000000 - #define CONFIG_SYS_UBOOT_BASE (CONFIG_SPI_ADDR + CONFIG_SPL_PAD_TO) -+#endif - - /* SPL -> Uboot */ - #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_TEXT_BASE + SZ_2M - \ diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch deleted file mode 100644 index 84101d0e..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-18-board-mt7622-use-new-spi-nand-driver.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 6bcd65ed47844e747ff6db066b092632f1760256 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Wed, 3 Mar 2021 10:51:43 +0800 -Subject: [PATCH 08/12] board: mt7622: use new spi-nand driver - -Enable new spi-nand driver support for mt7622_rfb_defconfig - -Signed-off-by: Weijie Gao ---- - arch/arm/dts/mt7622-rfb.dts | 7 +++++++ - arch/arm/dts/mt7622.dtsi | 16 ++++++++++++++++ - configs/mt7622_rfb_defconfig | 5 +++++ - 3 files changed, 28 insertions(+) - ---- a/arch/arm/dts/mt7622-rfb.dts -+++ b/arch/arm/dts/mt7622-rfb.dts -@@ -188,6 +188,13 @@ - }; - }; - -+&snand { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&snfi_pins>; -+ status = "okay"; -+ quad-spi; -+}; -+ - &uart0 { - pinctrl-names = "default"; - pinctrl-0 = <&uart0_pins>; ---- a/arch/arm/dts/mt7622.dtsi -+++ b/arch/arm/dts/mt7622.dtsi -@@ -53,6 +53,22 @@ - #size-cells = <0>; - }; - -+ snand: snand@1100d000 { -+ compatible = "mediatek,mt7622-snand"; -+ reg = <0x1100d000 0x1000>, -+ <0x1100e000 0x1000>; -+ reg-names = "nfi", "ecc"; -+ clocks = <&pericfg CLK_PERI_NFI_PD>, -+ <&pericfg CLK_PERI_SNFI_PD>, -+ <&pericfg CLK_PERI_NFIECC_PD>; -+ clock-names = "nfi_clk", "pad_clk", "ecc_clk"; -+ assigned-clocks = <&topckgen CLK_TOP_AXI_SEL>, -+ <&topckgen CLK_TOP_NFI_INFRA_SEL>; -+ assigned-clock-parents = <&topckgen CLK_TOP_SYSPLL1_D2>, -+ <&topckgen CLK_TOP_UNIVPLL2_D8>; -+ status = "disabled"; -+ }; -+ - snor: snor@11014000 { - compatible = "mediatek,mtk-snor"; - reg = <0x11014000 0x1000>; ---- a/configs/mt7622_rfb_defconfig -+++ b/configs/mt7622_rfb_defconfig -@@ -16,6 +16,7 @@ CONFIG_LOG=y - CONFIG_SYS_PROMPT="MT7622> " - CONFIG_CMD_BOOTMENU=y - CONFIG_CMD_MMC=y -+CONFIG_CMD_MTD=y - CONFIG_CMD_PCI=y - CONFIG_CMD_SF_TEST=y - CONFIG_CMD_PING=y -@@ -28,6 +29,10 @@ CONFIG_SYSCON=y - CONFIG_CLK=y - CONFIG_MMC_HS200_SUPPORT=y - CONFIG_MMC_MTK=y -+CONFIG_MTD=y -+CONFIG_DM_MTD=y -+CONFIG_MTK_SPI_NAND=y -+CONFIG_MTK_SPI_NAND_MTD=y - CONFIG_DM_SPI_FLASH=y - CONFIG_SPI_FLASH_EON=y - CONFIG_SPI_FLASH_GIGADEVICE=y diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch deleted file mode 100644 index 69ea2b0f..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-19-configs-mt7629-remove-unused-options-and-add-dm-comm.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 632f09f140610cf45da1dba25c66e9ca79a70a15 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Wed, 3 Mar 2021 12:12:39 +0800 -Subject: [PATCH 09/12] configs: mt7629: remove unused options and add dm - command - -Remove unused bootm options -Add dm command - -Signed-off-by: Weijie Gao ---- - configs/mt7629_rfb_defconfig | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/configs/mt7629_rfb_defconfig -+++ b/configs/mt7629_rfb_defconfig -@@ -29,9 +29,14 @@ CONFIG_SPL_WATCHDOG=y - CONFIG_HUSH_PARSER=y - CONFIG_SYS_PROMPT="U-Boot> " - CONFIG_CMD_BOOTMENU=y -+# CONFIG_BOOTM_NETBSD is not set -+# CONFIG_BOOTM_PLAN9 is not set -+# CONFIG_BOOTM_RTEMS is not set -+# CONFIG_BOOTM_VXWORKS is not set - # CONFIG_CMD_ELF is not set - # CONFIG_CMD_XIMG is not set - CONFIG_CMD_BIND=y -+CONFIG_CMD_DM=y - # CONFIG_CMD_FLASH is not set - CONFIG_CMD_GPIO=y - CONFIG_CMD_SF_TEST=y diff --git a/root/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch b/root/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch deleted file mode 100644 index c66451dc..00000000 --- a/root/package/boot/uboot-mediatek/patches/000-mtk-20-configs-mt7622-enable-environment-for-mt7622_rfb.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 93d7086edb0db4b05149dfea21a2a82d8f160944 Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Sat, 6 Mar 2021 16:29:33 +0800 -Subject: [PATCH 10/12] configs: mt7622: enable environment for mt7622_rfb - -Enable environment vairables for mt7622_rfb - -Signed-off-by: Weijie Gao ---- - configs/mt7622_rfb_defconfig | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/configs/mt7622_rfb_defconfig -+++ b/configs/mt7622_rfb_defconfig -@@ -5,6 +5,8 @@ CONFIG_SYS_TEXT_BASE=0x41e00000 - CONFIG_SYS_MALLOC_F_LEN=0x4000 - CONFIG_NR_DRAM_BANKS=1 - CONFIG_DEFAULT_DEVICE_TREE="mt7622-rfb" -+CONFIG_ENV_SIZE=0x20000 -+CONFIG_ENV_OFFSET=0x280000 - CONFIG_DEBUG_UART_BASE=0x11002000 - CONFIG_DEBUG_UART_CLOCK=25000000 - CONFIG_DEBUG_UART=y -@@ -22,6 +24,9 @@ CONFIG_CMD_SF_TEST=y - CONFIG_CMD_PING=y - CONFIG_CMD_SMC=y - CONFIG_ENV_OVERWRITE=y -+CONFIG_ENV_IS_IN_MTD=y -+CONFIG_ENV_MTD_NAME="spi-nand0" -+CONFIG_ENV_SIZE_REDUND=0x40000 - CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y - CONFIG_NET_RANDOM_ETHADDR=y - CONFIG_REGMAP=y diff --git a/root/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch b/root/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch deleted file mode 100644 index 42d60c3f..00000000 --- a/root/package/boot/uboot-mediatek/patches/050-mt7622-enable-pstore.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/arch/arm/dts/mt7622.dtsi -+++ b/arch/arm/dts/mt7622.dtsi -@@ -37,6 +37,30 @@ - }; - }; - -+ psci { -+ compatible = "arm,psci-1.0"; -+ method = "smc"; -+ }; -+ -+ reserved-memory { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ -+ /* 64 KiB reserved for ramoops/pstore */ -+ ramoops@0x42ff0000 { -+ compatible = "ramoops"; -+ reg = <0 0x42ff0000 0 0x10000>; -+ record-size = <0x1000>; -+ }; -+ -+ /* 192 KiB reserved for ARM Trusted Firmware (BL31) */ -+ secmon_reserved: secmon@43000000 { -+ reg = <0 0x43000000 0 0x30000>; -+ no-map; -+ }; -+ }; -+ - snfi: snfi@1100d000 { - compatible = "mediatek,mtk-snfi-spi"; - reg = <0x1100d000 0x2000>; diff --git a/root/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch b/root/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch deleted file mode 100644 index 3fcae5ac..00000000 --- a/root/package/boot/uboot-mediatek/patches/100-scripts-remove-dependency-on-swig.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 12de602dc824bcb821287500fba831225cff5392 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Mon, 13 Jul 2020 23:37:37 +0200 -Subject: [PATCH 11/12] scripts: remove dependency on swig - -Don't build the libfdt tool, as it has a dependency on swig (which -OpenWrt does not ship). - -This requires more hacks, as of-platdata generation does not work -without it. - -Signed-off-by: David Bauer ---- - scripts/dtc/Makefile | 2 -- - 1 file changed, 2 deletions(-) - ---- a/scripts/dtc/Makefile -+++ b/scripts/dtc/Makefile -@@ -18,5 +18,3 @@ HOSTCFLAGS_dtc-parser.tab.o := -I$(src) - # dependencies on generated files need to be listed explicitly - $(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h - --# Added for U-Boot --subdir-$(CONFIG_PYLIBFDT) += pylibfdt diff --git a/root/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch b/root/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch deleted file mode 100644 index 65d14f5b..00000000 --- a/root/package/boot/uboot-mediatek/patches/110-no-kwbimage.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/tools/Makefile -+++ b/tools/Makefile -@@ -119,7 +119,6 @@ dumpimage-mkimage-objs := aisimage.o \ - imximage.o \ - imx8image.o \ - imx8mimage.o \ -- kwbimage.o \ - lib/md5.o \ - lpc32xximage.o \ - mxsimage.o \ diff --git a/root/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch b/root/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch deleted file mode 100644 index c13871b7..00000000 --- a/root/package/boot/uboot-mediatek/patches/120-use-xz-instead-of-lzma.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/Makefile -+++ b/Makefile -@@ -1045,7 +1045,7 @@ quiet_cmd_pad_cat = CAT $@ - cmd_pad_cat = $(cmd_objcopy) && $(append) || { rm -f $@; false; } - - quiet_cmd_lzma = LZMA $@ --cmd_lzma = lzma -c -z -k -9 $< > $@ -+cmd_lzma = xz --format=lzma -c -z -k -9 $< > $@ - - cfg: u-boot.cfg - diff --git a/root/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch b/root/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch deleted file mode 100644 index 5dce177c..00000000 --- a/root/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch +++ /dev/null @@ -1,132 +0,0 @@ ---- a/cmd/bootm.c -+++ b/cmd/bootm.c -@@ -228,6 +228,65 @@ U_BOOT_CMD( - /* iminfo - print header info for a requested image */ - /*******************************************************************/ - #if defined(CONFIG_CMD_IMI) -+#define SECTOR_SHIFT 9 -+static int image_totalsize(struct cmd_tbl *cmdtp, int flag, int argc, -+ char *const argv[], short int in_blocks) -+{ -+ ulong addr; -+ void *fit; -+ int bsize, tsize; -+ char buf[16]; -+ -+ if (argc >= 2) -+ addr = simple_strtoul(argv[1], NULL, 16); -+ else -+ addr = image_load_addr; -+ -+ fit = (void *)map_sysmem(addr, 0); -+ tsize = fit_get_totalsize(fit); -+ unmap_sysmem(fit); -+ if (tsize == 0) -+ return 1; -+ -+ bsize = (tsize >> SECTOR_SHIFT) + ((tsize & ((1 << SECTOR_SHIFT) - 1))?1:0); -+ -+ if (!in_blocks) -+ snprintf(buf, sizeof(buf), "%x", tsize); -+ else -+ snprintf(buf, sizeof(buf), "%x", bsize); -+ -+ if (argc >= 3) -+ return env_set(argv[2], buf); -+ else -+ printf("%s\n", buf); -+ -+ return 0; -+} -+ -+static int do_imsz(struct cmd_tbl *cmdtp, int flag, int argc, -+ char *const argv[]) -+{ -+ return image_totalsize(cmdtp, flag, argc, argv, 0); -+} -+ -+static int do_imszb(struct cmd_tbl *cmdtp, int flag, int argc, -+ char *const argv[]) -+{ -+ return image_totalsize(cmdtp, flag, argc, argv, 1); -+} -+ -+U_BOOT_CMD( -+ imsz, CONFIG_SYS_MAXARGS, 1, do_imsz, -+ "get image total size (in bytes)", -+ "addr [maxhdrlen] [varname]\n" -+); -+ -+U_BOOT_CMD( -+ imszb, CONFIG_SYS_MAXARGS, 1, do_imszb, -+ "get image total size (in blocks)", -+ "addr [maxhdrlen] [varname]\n" -+); -+ - static int do_iminfo(struct cmd_tbl *cmdtp, int flag, int argc, - char *const argv[]) - { ---- a/boot/image-fit.c -+++ b/boot/image-fit.c -@@ -1993,6 +1993,51 @@ static const char *fit_get_image_type_pr - return "unknown"; - } - -+size_t fit_get_totalsize(const void *fit) -+{ -+ int ret, ndepth, noffset, images_noffset; -+ size_t data_size, hdrsize, img_total, max_size = 0; -+ const void *data; -+ -+ ret = fdt_check_header(fit); -+ if (ret) { -+ debug("Wrong FIT format: not a flattened device tree (err=%d)\n", -+ ret); -+ return 0; -+ } -+ -+ hdrsize = fdt_totalsize(fit); -+ -+ /* simple FIT with internal images */ -+ if (hdrsize > 0x1000) -+ return hdrsize; -+ -+ images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH); -+ if (images_noffset < 0) { -+ printf("Can't find images parent node '%s' (%s)\n", -+ FIT_IMAGES_PATH, fdt_strerror(images_noffset)); -+ return 0; -+ } -+ -+ for (ndepth = 0, -+ noffset = fdt_next_node(fit, images_noffset, &ndepth); -+ (noffset >= 0) && (ndepth > 0); -+ noffset = fdt_next_node(fit, noffset, &ndepth)) { -+ if (ndepth == 1) { -+ ret = fit_image_get_data_and_size(fit, noffset, &data, &data_size); -+ if (ret) -+ return 0; -+ -+ img_total = data_size + (data - fit); -+ -+ max_size = (max_size > img_total) ? max_size : img_total; -+ } -+ } -+ -+ return max_size; -+} -+ -+ - int fit_image_load(bootm_headers_t *images, ulong addr, - const char **fit_unamep, const char **fit_uname_configp, - int arch, int image_type, int bootstage_id, ---- a/include/image.h -+++ b/include/image.h -@@ -952,6 +952,7 @@ int fit_parse_subimage(const char *spec, - ulong *addr, const char **image_name); - - int fit_get_subimage_count(const void *fit, int images_noffset); -+size_t fit_get_totalsize(const void *fit); - void fit_print_contents(const void *fit); - void fit_image_print(const void *fit, int noffset, const char *p); - diff --git a/root/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch b/root/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch deleted file mode 100644 index c43b542d..00000000 --- a/root/package/boot/uboot-mediatek/patches/210-cmd-bootmenu-add-ability-to-select-item-by-shortkey.patch +++ /dev/null @@ -1,192 +0,0 @@ -From afea25576fc92d562b248b783cf03564eb4521da Mon Sep 17 00:00:00 2001 -From: Weijie Gao -Date: Tue, 19 Jan 2021 10:58:48 +0800 -Subject: [PATCH 12/12] cmd: bootmenu: add ability to select item by shortkey - -Add ability to use shortkey to select item for bootmenu command - -Signed-off-by: Weijie Gao ---- - cmd/bootmenu.c | 77 +++++++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 70 insertions(+), 7 deletions(-) - ---- a/cmd/bootmenu.c -+++ b/cmd/bootmenu.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -38,6 +39,7 @@ struct bootmenu_data { - int active; /* active menu entry */ - int count; /* total count of menu entries */ - struct bootmenu_entry *first; /* first menu entry */ -+ bool last_choiced; - }; - - enum bootmenu_key { -@@ -46,8 +48,27 @@ enum bootmenu_key { - KEY_DOWN, - KEY_SELECT, - KEY_QUIT, -+ KEY_CHOICE, - }; - -+static const char choice_chars[] = { -+ '1', '2', '3', '4', '5', '6', '7', '8', '9', -+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', -+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', -+ 'u', 'v', 'w', 'x', 'y', 'z' -+}; -+ -+static int find_choice(char choice) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(choice_chars); i++) -+ if (tolower(choice) == choice_chars[i]) -+ return i; -+ -+ return -1; -+} -+ - static char *bootmenu_getoption(unsigned short int n) - { - char name[MAX_ENV_SIZE]; -@@ -82,7 +103,7 @@ static void bootmenu_print_entry(void *d - } - - static void bootmenu_autoboot_loop(struct bootmenu_data *menu, -- enum bootmenu_key *key, int *esc) -+ enum bootmenu_key *key, int *esc, int *choice) - { - int i, c; - -@@ -115,6 +136,19 @@ static void bootmenu_autoboot_loop(struc - break; - default: - *key = KEY_NONE; -+ if (*esc) -+ break; -+ -+ *choice = find_choice(c); -+ if ((*choice >= 0 && -+ *choice < menu->count - 1)) { -+ *key = KEY_CHOICE; -+ } else if (c == '0') { -+ *choice = menu->count - 1; -+ *key = KEY_CHOICE; -+ } else { -+ *key = KEY_NONE; -+ } - break; - } - -@@ -136,10 +170,16 @@ static void bootmenu_autoboot_loop(struc - } - - static void bootmenu_loop(struct bootmenu_data *menu, -- enum bootmenu_key *key, int *esc) -+ enum bootmenu_key *key, int *esc, int *choice) - { - int c; - -+ if (menu->last_choiced) { -+ menu->last_choiced = false; -+ *key = KEY_SELECT; -+ return; -+ } -+ - if (*esc == 1) { - if (tstc()) { - c = getchar(); -@@ -165,6 +205,14 @@ static void bootmenu_loop(struct bootmen - if (c == '\e') { - *esc = 1; - *key = KEY_NONE; -+ } else { -+ *choice = find_choice(c); -+ if ((*choice >= 0 && *choice < menu->count - 1)) { -+ *key = KEY_CHOICE; -+ } else if (c == '0') { -+ *choice = menu->count - 1; -+ *key = KEY_CHOICE; -+ } - } - break; - case 1: -@@ -216,16 +264,17 @@ static char *bootmenu_choice_entry(void - struct bootmenu_data *menu = data; - struct bootmenu_entry *iter; - enum bootmenu_key key = KEY_NONE; -+ int choice = -1; - int esc = 0; - int i; - - while (1) { - if (menu->delay >= 0) { - /* Autoboot was not stopped */ -- bootmenu_autoboot_loop(menu, &key, &esc); -+ bootmenu_autoboot_loop(menu, &key, &esc, &choice); - } else { - /* Some key was pressed, so autoboot was stopped */ -- bootmenu_loop(menu, &key, &esc); -+ bootmenu_loop(menu, &key, &esc, &choice); - } - - switch (key) { -@@ -239,6 +288,12 @@ static char *bootmenu_choice_entry(void - ++menu->active; - /* no menu key selected, regenerate menu */ - return NULL; -+ case KEY_CHOICE: -+ menu->active = choice; -+ if (!menu->last_choiced) { -+ menu->last_choiced = true; -+ return NULL; -+ } - case KEY_SELECT: - iter = menu->first; - for (i = 0; i < menu->active; ++i) -@@ -294,6 +349,7 @@ static struct bootmenu_data *bootmenu_cr - menu->delay = delay; - menu->active = 0; - menu->first = NULL; -+ menu->last_choiced = false; - - default_str = env_get("bootmenu_default"); - if (default_str) -@@ -311,12 +367,19 @@ static struct bootmenu_data *bootmenu_cr - goto cleanup; - - len = sep-option; -- entry->title = malloc(len + 1); -+ entry->title = malloc(len + 4); - if (!entry->title) { - free(entry); - goto cleanup; - } -- memcpy(entry->title, option, len); -+ -+ if (i < ARRAY_SIZE(choice_chars)) { -+ len = sprintf(entry->title, "%c. %.*s", choice_chars[i], -+ len, option); -+ } else { -+ len = sprintf(entry->title, " %.*s", len, option); -+ } -+ - entry->title[len] = 0; - - len = strlen(sep + 1); -@@ -353,7 +416,7 @@ static struct bootmenu_data *bootmenu_cr - if (!entry) - goto cleanup; - -- entry->title = strdup("U-Boot console"); -+ entry->title = strdup("0. U-Boot console"); - if (!entry->title) { - free(entry); - goto cleanup; diff --git a/root/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch b/root/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch deleted file mode 100644 index 3f98f13c..00000000 --- a/root/package/boot/uboot-mediatek/patches/211-cmd-bootmenu-custom-title.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/cmd/bootmenu.c -+++ b/cmd/bootmenu.c -@@ -39,6 +39,7 @@ struct bootmenu_data { - int active; /* active menu entry */ - int count; /* total count of menu entries */ - struct bootmenu_entry *first; /* first menu entry */ -+ char *mtitle; /* custom menu title */ - bool last_choiced; - }; - -@@ -471,7 +472,12 @@ static void menu_display_statusline(stru - printf(ANSI_CURSOR_POSITION, 1, 1); - puts(ANSI_CLEAR_LINE); - printf(ANSI_CURSOR_POSITION, 2, 1); -- puts(" *** U-Boot Boot Menu ***"); -+ -+ if (menu->mtitle) -+ puts(menu->mtitle); -+ else -+ puts(" *** U-Boot Boot Menu ***"); -+ - puts(ANSI_CLEAR_LINE_TO_END); - printf(ANSI_CURSOR_POSITION, 3, 1); - puts(ANSI_CLEAR_LINE); -@@ -525,6 +531,7 @@ static void bootmenu_show(int delay) - return; - } - -+ bootmenu->mtitle = env_get("bootmenu_title"); - for (iter = bootmenu->first; iter; iter = iter->next) { - if (!menu_item_add(menu, iter->key, iter)) - goto cleanup; diff --git a/root/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch b/root/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch deleted file mode 100644 index f7f20216..00000000 --- a/root/package/boot/uboot-mediatek/patches/220-cmd-env-readmem.patch +++ /dev/null @@ -1,116 +0,0 @@ ---- a/cmd/Kconfig -+++ b/cmd/Kconfig -@@ -483,6 +483,12 @@ config CMD_ENV_EXISTS - Check if a variable is defined in the environment for use in - shell scripting. - -+config CMD_ENV_READMEM -+ bool "env readmem" -+ default y -+ help -+ Store memory content into environment variable. -+ - config CMD_ENV_CALLBACK - bool "env callbacks - print callbacks and their associated variables" - help ---- a/cmd/nvedit.c -+++ b/cmd/nvedit.c -@@ -408,6 +408,60 @@ int do_env_ask(struct cmd_tbl *cmdtp, in - } - #endif - -+#if defined(CONFIG_CMD_ENV_READMEM) -+int do_env_readmem(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) -+{ -+ char varstr[CONFIG_SYS_CBSIZE]; -+ const void *buf; -+ char *local_args[4]; -+ ulong addr, bytes = 6; -+ int hexdump = 0; -+ -+ /* -+ * Check the syntax: -+ * -+ * readmem [-b] name address [size] -+ */ -+ if (argc < 3) -+ return CMD_RET_USAGE; -+ -+ local_args[0] = argv[0]; -+ -+ if (!strncmp(argv[1], "-b", 3)) -+ hexdump = 1; -+ -+ local_args[1] = argv[hexdump + 1]; -+ local_args[2] = varstr; -+ local_args[3] = NULL; -+ -+ addr = simple_strtoul(argv[hexdump + 2], NULL, 16); -+ -+ if (!hexdump) -+ bytes = simple_strtoul(argv[hexdump + 3], NULL, 16); -+ -+ if (bytes < 1) -+ return 1; -+ -+ if ((hexdump * 3) * bytes >= CONFIG_SYS_CBSIZE) -+ return 1; -+ -+ buf = map_sysmem(addr, bytes); -+ if (!buf) -+ return 1; -+ -+ if (hexdump) { -+ sprintf(varstr, "%pM", buf); -+ } else { -+ memcpy(varstr, buf, bytes); -+ varstr[bytes] = '\0'; -+ } -+ unmap_sysmem(buf); -+ -+ /* Continue calling setenv code */ -+ return _do_env_set(flag, 3, local_args, H_INTERACTIVE); -+} -+#endif -+ - #if defined(CONFIG_CMD_ENV_CALLBACK) - static int print_static_binding(const char *var_name, const char *callback_name, - void *priv) -@@ -1189,6 +1243,9 @@ static struct cmd_tbl cmd_env_sub[] = { - U_BOOT_CMD_MKENT(load, 1, 0, do_env_load, "", ""), - #endif - U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_env_print, "", ""), -+#if defined(CONFIG_CMD_ENV_READMEM) -+ U_BOOT_CMD_MKENT(readmem, CONFIG_SYS_MAXARGS, 3, do_env_readmem, "", ""), -+#endif - #if defined(CONFIG_CMD_RUN) - U_BOOT_CMD_MKENT(run, CONFIG_SYS_MAXARGS, 1, do_run, "", ""), - #endif -@@ -1277,6 +1334,9 @@ static char env_help_text[] = - #if defined(CONFIG_CMD_NVEDIT_EFI) - "env print -e [-guid guid] [-n] [name ...] - print UEFI environment\n" - #endif -+#if defined(CONFIG_CMD_ENV_READMEM) -+ "env readmem [-b] name address size - read variable from memory\n" -+#endif - #if defined(CONFIG_CMD_RUN) - "env run var [...] - run commands in an environment variable\n" - #endif -@@ -1386,6 +1446,17 @@ U_BOOT_CMD( - ); - #endif - -+#if defined(CONFIG_CMD_ENV_READMEM) -+U_BOOT_CMD_COMPLETE( -+ readmem, CONFIG_SYS_MAXARGS, 3, do_env_readmem, -+ "get environment variable from memory address", -+ "name [-b] address size\n" -+ " - store memory address to env variable\n" -+ " \"-b\": read binary ethaddr", -+ var_complete -+); -+#endif -+ - #if defined(CONFIG_CMD_RUN) - U_BOOT_CMD_COMPLETE( - run, CONFIG_SYS_MAXARGS, 1, do_run, diff --git a/root/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch b/root/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch deleted file mode 100644 index 587245d2..00000000 --- a/root/package/boot/uboot-mediatek/patches/230-cmd-add-pstore-check.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- a/cmd/pstore.c -+++ b/cmd/pstore.c -@@ -207,6 +207,58 @@ static int pstore_set(struct cmd_tbl *cm - } - - /** -+ * pstore_check() - Check for pstore records -+ * @cmdtp: Command data struct pointer -+ * @flag: Command flag -+ * @argc: Command-line argument count -+ * @argv: Array of command-line arguments -+ * -+ * Return: 0 if there are records in pstore, 1 otherwise -+ */ -+static int pstore_check(struct cmd_tbl *cmdtp, int flag, int argc, -+ char * const argv[]) -+{ -+ phys_addr_t ptr; -+ char *buffer; -+ u32 size; -+ int header_len = 0; -+ bool compressed; -+ -+ if (pstore_length == 0) { -+ printf("Please set PStore configuration\n"); -+ return CMD_RET_USAGE; -+ } -+ -+ if (buffer_size == 0) -+ pstore_init_buffer_size(); -+ -+ buffer = malloc_cache_aligned(buffer_size); -+ -+ ptr = pstore_addr; -+ phys_addr_t ptr_end = ptr + pstore_length - pstore_pmsg_size -+ - pstore_ftrace_size - pstore_console_size; -+ -+ while (ptr < ptr_end) { -+ size = pstore_get_buffer(PERSISTENT_RAM_SIG, ptr, -+ pstore_record_size, buffer); -+ ptr += pstore_record_size; -+ -+ if (size == 0) -+ continue; -+ -+ header_len = pstore_read_kmsg_hdr(buffer, &compressed); -+ if (header_len == 0) -+ continue; -+ -+ free(buffer); -+ return 0; -+ } -+ -+ free(buffer); -+ return 1; -+} -+ -+/** - * pstore_print_buffer() - Print buffer - * @type: buffer type - * @buffer: buffer to print -@@ -458,6 +510,7 @@ static int pstore_save(struct cmd_tbl *c - - static struct cmd_tbl cmd_pstore_sub[] = { - U_BOOT_CMD_MKENT(set, 8, 0, pstore_set, "", ""), -+ U_BOOT_CMD_MKENT(check, 1, 0, pstore_check, "", ""), - U_BOOT_CMD_MKENT(display, 3, 0, pstore_display, "", ""), - U_BOOT_CMD_MKENT(save, 4, 0, pstore_save, "", ""), - }; -@@ -531,6 +584,8 @@ U_BOOT_CMD(pstore, 10, 0, do_pstore, - " 'pmsg-size' is the size of the user space logs record.\n" - " 'ecc-size' enables/disables ECC support and specifies ECC buffer size in\n" - " bytes (0 disables it, 1 is a special value, means 16 bytes ECC).\n" -+ "pstore check\n" -+ "- Returns true if there are records in pstore.\n" - "pstore display [record-type] [nb]\n" - "- Display existing records in pstore reserved memory. A 'record-type' can\n" - " be given to only display records of this kind. 'record-type' can be one\n" diff --git a/root/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch b/root/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch deleted file mode 100644 index a6204c7b..00000000 --- a/root/package/boot/uboot-mediatek/patches/260-add-missing-type-u64.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/include/linux/types.h -+++ b/include/linux/types.h -@@ -1,6 +1,7 @@ - #ifndef _LINUX_TYPES_H - #define _LINUX_TYPES_H - -+typedef unsigned long long __u64; - #include - #include - #include diff --git a/root/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch b/root/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch deleted file mode 100644 index 76e272a2..00000000 --- a/root/package/boot/uboot-mediatek/patches/280-image-fdt-save-name-of-FIT-configuration-in-chosen-node.patch +++ /dev/null @@ -1,60 +0,0 @@ -From patchwork Mon Mar 21 23:22:23 2022 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 1607954 -Return-Path: -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@bilbo.ozlabs.org -Date: Mon, 21 Mar 2022 23:22:23 +0000 -From: Daniel Golle -To: u-boot@lists.denx.de -Cc: Simon Glass , Alexandru Gagniuc , - Patrick Delaunay , - Heinrich Schuchardt -Subject: [PATCH] image-fdt: save name of FIT configuration in '/chosen' node -Message-ID: -MIME-Version: 1.0 -Content-Disposition: inline -X-BeenThere: u-boot@lists.denx.de -X-Mailman-Version: 2.1.39 -Precedence: list -List-Id: U-Boot discussion -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Errors-To: u-boot-bounces@lists.denx.de -Sender: "U-Boot" - -It can be useful for the OS (Linux) to know which configuration has -been chosen by U-Boot when launching a FIT image. -Store the name of the FIT configuration node used in a new string -attribute called 'bootconf' in the '/chosen' node in device tree. - -Signed-off-by: Daniel Golle ---- - boot/image-fdt.c | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/boot/image-fdt.c b/boot/image-fdt.c -index 692a9ad3e4..4017bc94a6 100644 ---- a/boot/image-fdt.c -+++ b/boot/image-fdt.c -@@ -601,6 +601,12 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob, - goto err; - } - -+ /* Store name of configuration node as bootconf in /chosen node */ -+ if (images->fit_uname_cfg) -+ fdt_find_and_setprop(blob, "/chosen", "bootconf", -+ images->fit_uname_cfg, -+ strlen(images->fit_uname_cfg) + 1, 1); -+ - /* Update ethernet nodes */ - fdt_fixup_ethernet(blob); - #if CONFIG_IS_ENABLED(CMD_PSTORE) diff --git a/root/package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch b/root/package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch deleted file mode 100644 index 43270a7a..00000000 --- a/root/package/boot/uboot-mediatek/patches/300-mt7622-generic-reset-button-ignore-env.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/board/mediatek/mt7622/mt7622_rfb.c -+++ b/board/mediatek/mt7622/mt7622_rfb.c -@@ -6,9 +6,16 @@ - - #include - #include -+#include -+#include - #include - #include - #include -+#include -+ -+#ifndef CONFIG_RESET_BUTTON_LABEL -+#define CONFIG_RESET_BUTTON_LABEL "reset" -+#endif - - DECLARE_GLOBAL_DATA_PTR; - -@@ -20,7 +27,19 @@ int board_init(void) - - int board_late_init(void) - { -- gd->env_valid = 1; //to load environment variable from persistent store -+ struct udevice *dev; -+ -+ if (!button_get_by_label(CONFIG_RESET_BUTTON_LABEL, &dev)) { -+ puts("reset button found\n"); -+#ifdef CONFIG_RESET_BUTTON_SETTLE_DELAY -+ mdelay(CONFIG_RESET_BUTTON_SETTLE_DELAY); -+#endif -+ if (button_get_state(dev) == BUTTON_ON) { -+ puts("button pushed, resetting environment\n"); -+ gd->env_valid = ENV_INVALID; -+ } -+ } -+ - env_relocate(); - return 0; - } ---- a/arch/arm/mach-mediatek/Kconfig -+++ b/arch/arm/mach-mediatek/Kconfig -@@ -115,4 +115,8 @@ config MTK_BROM_HEADER_INFO - default "media=emmc" if TARGET_MT8516 || TARGET_MT8365 || TARGET_MT8183 - default "lk=1" if TARGET_MT7623 - -+config RESET_BUTTON_LABEL -+ string "Button to trigger factory reset" -+ default "reset" -+ - endif diff --git a/root/package/boot/uboot-mediatek/patches/301-mt7623-generic-reset-button-ignore-env.patch b/root/package/boot/uboot-mediatek/patches/301-mt7623-generic-reset-button-ignore-env.patch deleted file mode 100644 index e144f42c..00000000 --- a/root/package/boot/uboot-mediatek/patches/301-mt7623-generic-reset-button-ignore-env.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- a/board/mediatek/mt7623/mt7623_rfb.c -+++ b/board/mediatek/mt7623/mt7623_rfb.c -@@ -4,8 +4,17 @@ - */ - - #include -+#include -+#include -+#include -+#include - #include - #include -+#include -+ -+#ifndef CONFIG_RESET_BUTTON_LABEL -+#define CONFIG_RESET_BUTTON_LABEL "reset" -+#endif - - DECLARE_GLOBAL_DATA_PTR; - -@@ -41,3 +50,22 @@ int mmc_get_env_dev(void) - return mmc_get_boot_dev(); - } - #endif -+ -+int board_late_init(void) -+{ -+ struct udevice *dev; -+ -+ if (!button_get_by_label(CONFIG_RESET_BUTTON_LABEL, &dev)) { -+ puts("reset button found\n"); -+#ifdef CONFIG_RESET_BUTTON_SETTLE_DELAY -+ mdelay(CONFIG_RESET_BUTTON_SETTLE_DELAY); -+#endif -+ if (button_get_state(dev) == BUTTON_ON) { -+ puts("button pushed, resetting environment\n"); -+ gd->env_valid = ENV_INVALID; -+ } -+ } -+ -+ env_relocate(); -+ return 0; -+} diff --git a/root/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch b/root/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch deleted file mode 100644 index 50df49d8..00000000 --- a/root/package/boot/uboot-mediatek/patches/350-add-support-for-Winbond-W25Q512JV.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/mtd/spi/spi-nor-ids.c -+++ b/drivers/mtd/spi/spi-nor-ids.c -@@ -369,6 +369,8 @@ const struct flash_info spi_nor_ids[] = - SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) - }, - { INFO("w25q256", 0xef4019, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, -+ { INFO("w25q512jv", 0xef4020, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_DUAL_READ | -+ SPI_NOR_HAS_TB | SPI_NOR_HAS_LOCK) }, - { INFO("w25m512jw", 0xef6119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, - { INFO("w25m512jv", 0xef7119, 0, 64 * 1024, 1024, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, - #endif diff --git a/root/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch b/root/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch deleted file mode 100644 index 01a550b3..00000000 --- a/root/package/boot/uboot-mediatek/patches/400-update-bpir2-defconfig.patch +++ /dev/null @@ -1,246 +0,0 @@ ---- a/configs/mt7623n_bpir2_defconfig -+++ b/configs/mt7623n_bpir2_defconfig -@@ -4,53 +4,138 @@ CONFIG_ARCH_MEDIATEK=y - CONFIG_SYS_TEXT_BASE=0x81e00000 - CONFIG_SYS_MALLOC_F_LEN=0x4000 - CONFIG_NR_DRAM_BANKS=1 --CONFIG_ENV_SIZE=0x1000 -+CONFIG_ENV_SIZE=0x10000 - CONFIG_ENV_OFFSET=0x100000 --CONFIG_DEFAULT_DEVICE_TREE="mt7623n-bananapi-bpi-r2" - CONFIG_TARGET_MT7623=y -+CONFIG_DEFAULT_DEVICE_TREE="mt7623n-bananapi-bpi-r2" -+CONFIG_USE_DEFAULT_ENV_FILE=y - CONFIG_DISTRO_DEFAULTS=y - CONFIG_SYS_LOAD_ADDR=0x84000000 - CONFIG_FIT=y --CONFIG_FIT_VERBOSE=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LED=y -+CONFIG_LED_BLINK=y -+CONFIG_LED_GPIO=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_BOARD_LATE_INIT=y - CONFIG_BOOTDELAY=3 -+CONFIG_BOOTP_SEND_HOSTNAME=y - CONFIG_DEFAULT_FDT_FILE="mt7623n-bananapi-bpi-r2.dtb" - CONFIG_SYS_CONSOLE_IS_IN_ENV=y -+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r2_env" -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_RESET_BUTTON_LABEL="factory" -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_CMD_ENV_FLAGS=y - # CONFIG_DISPLAY_BOARDINFO is not set --CONFIG_SYS_PROMPT="U-Boot> " -+CONFIG_SYS_PROMPT="MT7623> " - CONFIG_CMD_BOOTMENU=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CACHE=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DM=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_EXT4=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_FS_UUID=y - # CONFIG_CMD_ELF is not set - # CONFIG_CMD_XIMG is not set - CONFIG_CMD_GPIO=y --CONFIG_CMD_GPT=y -+# CONFIG_CMD_GPT is not set -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LICENSE=y -+CONFIG_CMD_LINK_LOCAL=y -+CONFIG_CMD_MBR=y - CONFIG_CMD_MMC=y --CONFIG_CMD_READ=y --# CONFIG_CMD_SETEXPR is not set -+CONFIG_CMD_MTD=y - # CONFIG_CMD_NFS is not set -+CONFIG_CMD_PCI=y -+CONFIG_CMD_SF_TEST=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_PWM=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PART=y -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SATA=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SNTP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_STRINGS=y -+CONFIG_CMD_USB=y -+CONFIG_CMD_UUID=y -+CONFIG_CMD_MMC=y -+CONFIG_CMD_READ=y -+CONFIG_CMD_SCSI=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_ETH=y -+CONFIG_DM_GPIO=y -+CONFIG_DM_SCSI=y -+CONFIG_DM_MMC=y -+CONFIG_DM_MTD=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_SERIAL=y -+CONFIG_DM_REGULATOR_GPIO=y -+CONFIG_DM_USB=y -+CONFIG_DM_PCI=y -+CONFIG_DM_PWM=y -+CONFIG_AHCI=y -+CONFIG_AHCI_PCI=y -+CONFIG_SCSI_AHCI=y -+CONFIG_SCSI=y -+CONFIG_PWM_MTK=y -+CONFIG_HUSH_PARSER=y -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y - CONFIG_ENV_OVERWRITE=y - CONFIG_ENV_IS_IN_MMC=y - CONFIG_SYS_RELOC_GD_ENV_ADDR=y - CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_NETCONSOLE=y - CONFIG_REGMAP=y - CONFIG_SYSCON=y - CONFIG_CLK=y -+CONFIG_LZMA=y -+CONFIG_MEDIATEK_ETH=y - # CONFIG_MMC_QUIRKS is not set - CONFIG_SUPPORT_EMMC_BOOT=y - CONFIG_MMC_HS400_SUPPORT=y - CONFIG_MMC_MTK=y -+CONFIG_MTK_AHCI=y -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_MTK_SERIAL=y -+CONFIG_MTK_TIMER=y -+CONFIG_OF_LIBFDT_OVERLAY=y -+CONFIG_PARTITION_UUIDS=y -+CONFIG_PCI=y -+CONFIG_PCIE_MEDIATEK=y -+CONFIG_PHY=y - CONFIG_PHY_FIXED=y --CONFIG_DM_ETH=y --CONFIG_MEDIATEK_ETH=y - CONFIG_PINCTRL=y - CONFIG_PINCONF=y - CONFIG_PINCTRL_MT7623=y - CONFIG_POWER_DOMAIN=y --CONFIG_MTK_POWER_DOMAIN=y --CONFIG_DM_SERIAL=y --CONFIG_MTK_SERIAL=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y - CONFIG_SYSRESET=y - CONFIG_SYSRESET_WATCHDOG=y - CONFIG_TIMER=y --CONFIG_MTK_TIMER=y -+CONFIG_VERSION_VARIABLE=y - CONFIG_WDT_MTK=y --CONFIG_LZMA=y - # CONFIG_EFI_GRUB_ARM32_WORKAROUND is not set ---- /dev/null -+++ b/bananapi_bpi-r2_env -@@ -0,0 +1,70 @@ -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x88000000 -+dtaddr=0x83f00000 -+console=earlycon=uart8250,mmio32,0x11004000 console=ttyS2,115200 console=tty1 -+initrd_high=0xafffffff -+part_default=3 -+part_recovery=2 -+bootcmd=run boot_mmc -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7623-bananapi_bpi-r2-initramfs-recovery.itb -+bootfile_upg=openwrt-mediatek-mt7623-bananapi_bpi-r2-squashfs-sysupgrade.itb -+bootled_pwr=bpi-r2:pio:green -+bootled_rec=bpi-r2:pio:blue -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_first=if button factory ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_tftp_forever=led bpi-r2:pio:blue on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run mmc_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run mmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr -+boot_mmc=run boot_production ; run boot_recovery -+emmc_init=run emmc_init_bl && run emmc_init_openwrt ; env default bootcmd ; saveenv -+emmc_init_bl=run sdmmc_read_emmc_hdr && run emmc_write_hdr && run sdmmc_read_preloader && run emmc_write_preloader && run sdmmc_read_uboot && run emmc_write_uboot -+emmc_init_openwrt=run sdmmc_read_recovery && run emmc_write_recovery ; run sdmmc_read_production && run emmc_write_production -+emmc_write_hdr=mmc dev 0 0 ; mmc erase 0x0 0x2000 ; mmc write $loadaddr 0x0 0x4 ; mmc dev 0 1 ; mmc partconf 0 1 1 1 ; mmc erase 0x0 0x400 ; mmc write $loadaddr 0x0 0x4 ; mmc partconf 0 1 1 0 -+emmc_write_preloader=mmc dev 0 1 ; mmc partconf 0 1 1 1 ; mmc write $loadaddr 0x4 0x100 ; mmc partconf 0 1 1 0 -+emmc_write_uboot=mmc dev 0 0 ; part size mmc 0 1 part_size && part start mmc 0 1 part_addr && mmc write $loadaddr $part_addr 0x400 -+emmc_write_production=mmc dev 0 0 ; iminfo $loadaddr && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol -+emmc_write_recovery=mmc dev 0 0 ; iminfo $loadaddr && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol -+emmc_read_production=mmc dev 0 0 ; part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol -+emmc_read_recovery=mmc dev 0 0 ; part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol -+mmc_write_production=if test "$bootedfrom" = "SD" ; then run sdmmc_write_production ; else run emmc_write_production ; fi -+mmc_write_recovery=if test "$bootedfrom" = "SD" ; run sdmmc_write_recovery ; else run emmc_write_recovery ; fi -+mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $loadaddr 0x$part_addr 0x$image_size -+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200 -+reset_factory=eraseenv && reset -+sdmmc_read_emmc_hdr=mmc dev 1 && mmc read $loadaddr 0x1ff8 0x8 -+sdmmc_read_preloader=mmc dev 1 && mmc read $loadaddr 0x4 0x100 -+sdmmc_read_uboot=mmc dev 1 ; part start mmc 1 1 part_addr && part size mmc 1 1 part_size && mmc read $loadaddr $part_addr $part_size -+sdmmc_read_production=mmc dev 1 ; part start mmc 1 $part_default part_addr && part size mmc 1 $part_default part_size && run mmc_read_vol -+sdmmc_read_recovery=mmc dev 1 ; part start mmc 1 $part_recovery part_addr && part size mmc 1 $part_recovery part_size && run mmc_read_vol -+sdmmc_write_production=iminfo $fileaddr && mmc dev 1 && part start mmc 1 $part_default part_addr && part size mmc 1 $part_default part_size && run mmc_write_vol -+sdmmc_write_recovery=iminfo $fileaddr && mmc dev 1 && part start mmc 1 $part_recovery part_addr && part size mmc 1 $part_recovery part_size && run mmc_write_vol -+_checkbootedfrom=setenv _checkbootedfrom ; if itest.l *81dffff0 == 434d4d65 ; then setenv bootedfrom eMMC ; else setenv bootedfrom SD ; fi -+_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv -+_firstboot=setenv _firstboot ; led $bootled_pwr off ;led $bootled_rec on ; run _checkbootedfrom _switch_to_menu _update_bootdev _update_bootcmd _update_bootcmd2 _init_env boot_first -+_set_bootcmd_sdmmc=setenv boot_production "led $bootled_rec off ; led $bootled_pwr on ; run sdmmc_read_production && bootm $loadaddr ; led $bootled_pwr off" -+_set_bootcmd_emmc=setenv boot_production "led $bootled_rec off ; led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr ; led $bootled_pwr off" -+_update_bootcmd=setenv _update_bootcmd ; if test "$bootedfrom" = "SD" ; then run _set_bootcmd_sdmmc ; else run _set_bootcmd_emmc ; fi ; setenv _set_bootcmd_sdmmc ; setenv _set_bootcmd_emmc -+_set_bootcmd2_sdmmc=setenv boot_recovery "led $bootled_pwr off ; led $bootled_rec on ; run sdmmc_read_recovery && bootm $loadaddr ; led $bootled_rec off" -+_set_bootcmd2_emmc=setenv boot_recovery "led $bootled_pwr off ; led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr ; led $bootled_rec off" -+_update_bootcmd2=setenv _update_bootcmd2 ; if test "$bootedfrom" = "SD" ; then run _set_bootcmd2_sdmmc ; else run _set_bootcmd2_emmc ; fi ; setenv _set_bootcmd2_sdmmc ; setenv _set_bootcmd2_emmc -+_update_bootdev=setenv _update_bootdev ; if test "$bootedfrom" = "SD" ; then setenv bootargs "$console root=/dev/mmcblk1p65" ; else setenv bootargs "$console root=/dev/mmcblk0p65" ; fi -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title [$bootedfrom] $ver" ; run _set_bm2 -+_set_bm2=setenv _set_bm2 ; setenv bootmenu_2 "Boot production system from $bootedfrom.=run boot_production ; run bootmenu_confirm_return" ; run _set_bm3 -+_set_bm3=setenv _set_bm3 ; setenv bootmenu_3 "Boot recovery system from $bootedfrom.=run boot_recovery ; run bootmenu_confirm_return" ; run _set_bm4 -+_set_bm4=setenv _set_bm4 ; setenv bootmenu_4 "Load production system via TFTP then write to $bootedfrom.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return" ; run _set_bm5 -+_set_bm5=setenv _set_bm5 ; setenv bootmenu_5 "Load recovery system via TFTP then write to $bootedfrom.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return" ; run _set_bm5a -+_set_bm5a=setenv _set_bm5a ; if test "$bootedfrom" = "SD" ; then run _set_bm6 ; else setenv _set_bm6 ; setenv _menu_next 6 ; fi ; run _set_bmr -+_set_bm6=setenv _set_bm6 ; setenv bootmenu_6 "Install bootloader, recovery and production to eMMC.=run emmc_init ; run bootmenu_confirm_return" ; setenv _menu_next 7 -+_set_bmr=setenv _set_bmr ; setenv bootmenu_${_menu_next} "Reboot.=reset" ; setexpr _menu_next ${_menu_next} + 1 ; run _set_bmf -+_set_bmf=setenv _set_bmf ; setenv bootmenu_${_menu_next} "Reset all settings to factory defaults.=run reset_factory ; reset" ; setenv _menu_next ---- a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts -+++ b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts -@@ -66,6 +66,15 @@ - default-state = "off"; - }; - }; -+ -+ gpio-keys { -+ compatible = "gpio-keys"; -+ -+ factory { -+ label = "factory"; -+ gpios = <&gpio 256 GPIO_ACTIVE_LOW>; -+ }; -+ }; - }; - - ð { diff --git a/root/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch b/root/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch deleted file mode 100644 index ac870b86..00000000 --- a/root/package/boot/uboot-mediatek/patches/401-update-u7623-defconfig.patch +++ /dev/null @@ -1,202 +0,0 @@ ---- a/configs/mt7623a_unielec_u7623_02_defconfig -+++ b/configs/mt7623a_unielec_u7623_02_defconfig -@@ -4,51 +4,135 @@ CONFIG_ARCH_MEDIATEK=y - CONFIG_SYS_TEXT_BASE=0x81e00000 - CONFIG_SYS_MALLOC_F_LEN=0x4000 - CONFIG_NR_DRAM_BANKS=1 --CONFIG_ENV_SIZE=0x1000 -+CONFIG_ENV_SIZE=0x10000 - CONFIG_ENV_OFFSET=0x100000 - CONFIG_DEFAULT_DEVICE_TREE="mt7623a-unielec-u7623-02-emmc" -+CONFIG_USE_DEFAULT_ENV_FILE=y - CONFIG_TARGET_MT7623=y - CONFIG_DISTRO_DEFAULTS=y - CONFIG_SYS_LOAD_ADDR=0x84000000 - CONFIG_FIT=y --CONFIG_FIT_VERBOSE=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LED=y -+CONFIG_LED_BLINK=y -+CONFIG_LED_GPIO=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_BOARD_LATE_INIT=y - CONFIG_BOOTDELAY=3 -+CONFIG_BOOTP_SEND_HOSTNAME=y - CONFIG_DEFAULT_FDT_FILE="mt7623a-unielec-u7623-02-emmc.dtb" - CONFIG_SYS_CONSOLE_IS_IN_ENV=y -+CONFIG_DEFAULT_ENV_FILE="unielec_u7623-02_env" -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_RESET_BUTTON_LABEL="factory" -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_CMD_ENV_FLAGS=y - # CONFIG_DISPLAY_BOARDINFO is not set --CONFIG_SYS_PROMPT="U-Boot> " -+CONFIG_SYS_PROMPT="MT7623> " - CONFIG_CMD_BOOTMENU=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BOOTZ=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CACHE=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DM=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_EXT4=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_FS_UUID=y - # CONFIG_CMD_ELF is not set - # CONFIG_CMD_XIMG is not set - CONFIG_CMD_GPIO=y --CONFIG_CMD_GPT=y -+# CONFIG_CMD_GPT is not set -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LICENSE=y -+CONFIG_CMD_LINK_LOCAL=y -+CONFIG_CMD_MBR=y - CONFIG_CMD_MMC=y --CONFIG_CMD_READ=y --# CONFIG_CMD_SETEXPR is not set - # CONFIG_CMD_NFS is not set --CONFIG_ENV_IS_IN_MMC=y -+CONFIG_CMD_PCI=y -+CONFIG_CMD_SF_TEST=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_PWM=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PART=y -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SATA=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SNTP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_STRINGS=y -+CONFIG_CMD_USB=y -+CONFIG_CMD_UUID=y -+CONFIG_CMD_READ=y -+CONFIG_CMD_SCSI=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_ETH=y -+CONFIG_DM_GPIO=y -+CONFIG_DM_SCSI=y -+CONFIG_DM_MMC=y -+CONFIG_DM_MTD=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_SERIAL=y -+CONFIG_DM_REGULATOR_GPIO=y -+CONFIG_DM_USB=y -+CONFIG_DM_PCI=y -+CONFIG_DM_PWM=y -+CONFIG_AHCI=y -+CONFIG_AHCI_PCI=y -+CONFIG_SCSI_AHCI=y -+CONFIG_SCSI=y -+CONFIG_PWM_MTK=y -+CONFIG_HUSH_PARSER=y - CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_SYS_MMC_ENV_DEV=0 -+CONFIG_ENV_OVERWRITE=y -+CONFIG_ENV_IS_IN_MMC=y - CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_NETCONSOLE=y - CONFIG_REGMAP=y - CONFIG_SYSCON=y - CONFIG_CLK=y -+CONFIG_LZMA=y -+CONFIG_MEDIATEK_ETH=y - # CONFIG_MMC_QUIRKS is not set - CONFIG_SUPPORT_EMMC_BOOT=y - CONFIG_MMC_HS400_SUPPORT=y - CONFIG_MMC_MTK=y -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_MTK_SERIAL=y -+CONFIG_MTK_TIMER=y -+CONFIG_OF_LIBFDT_OVERLAY=y -+CONFIG_PARTITION_UUIDS=y -+CONFIG_PCI=y -+CONFIG_PCIE_MEDIATEK=y -+CONFIG_PHY=y - CONFIG_PHY_FIXED=y --CONFIG_DM_ETH=y --CONFIG_MEDIATEK_ETH=y - CONFIG_PINCTRL=y - CONFIG_PINCONF=y - CONFIG_PINCTRL_MT7623=y - CONFIG_POWER_DOMAIN=y --CONFIG_MTK_POWER_DOMAIN=y --CONFIG_DM_SERIAL=y --CONFIG_MTK_SERIAL=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y - CONFIG_SYSRESET=y - CONFIG_SYSRESET_WATCHDOG=y - CONFIG_TIMER=y --CONFIG_MTK_TIMER=y -+CONFIG_VERSION_VARIABLE=y - CONFIG_WDT_MTK=y --CONFIG_LZMA=y ---- /dev/null -+++ b/unielec_u7623-02_env -@@ -0,0 +1,47 @@ -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x88000000 -+dtaddr=0x83f00000 -+console=earlycon=uart8250,mmio32,0x11004000 console=ttyS0,115200 -+initrd_high=0xafffffff -+part_default=3 -+part_recovery=2 -+bootcmd=run boot_mmc -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7623-unielec_u7623-02-initramfs-recovery.itb -+bootfile_upg=openwrt-mediatek-mt7623-unielec_u7623-02-squashfs-sysupgrade.itb -+bootled_rec=u7623-01:green:led3 -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return -+bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return -+bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_6=Reboot.=reset -+bootmenu_7=Reset all settings to factory defaults.=run reset_factory ; reset -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_first=if button factory ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_production=run emmc_read_production && bootm $loadaddr -+boot_recovery=run emmc_read_recovery && bootm $loadaddr -+boot_tftp_forever=led bpi-r64:pio:blue on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr -+boot_mmc=run boot_production ; run boot_recovery -+emmc_write_production=mmc dev 0 0 ; iminfo $loadaddr && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol -+emmc_write_recovery=mmc dev 0 0 ; iminfo $loadaddr && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol -+emmc_read_production=mmc dev 0 0 ; part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol -+emmc_read_recovery=mmc dev 0 0 ; part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol -+mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $loadaddr 0x$part_addr 0x$image_size -+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200 -+reset_factory=eraseenv && reset -+_init_env=setenv _init_env ; saveenv ; saveenv -+_firstboot=setenv _firstboot ; run _switch_to_menu _update_bootdev _init_env boot_first -+_update_bootdev=setenv _update_bootdev ; setenv bootargs "$console root=/dev/mmcblk0p65" -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver" diff --git a/root/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch b/root/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch deleted file mode 100644 index 781a6857..00000000 --- a/root/package/boot/uboot-mediatek/patches/402-update-bananapi-bpi-r64-device-tree.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- a/arch/arm/dts/mt7622-bananapi-bpi-r64.dts -+++ b/arch/arm/dts/mt7622-bananapi-bpi-r64.dts -@@ -20,6 +20,7 @@ - - aliases { - spi0 = &snfi; -+ ethernet0 = ð - }; - - memory@40000000 { -@@ -27,6 +28,42 @@ - reg = <0x40000000 0x40000000>; - }; - -+ gpio-keys { -+ compatible = "gpio-keys"; -+ -+ reset { -+ label = "reset"; -+ gpios = <&gpio 0 GPIO_ACTIVE_LOW>; -+ }; -+ -+ wps { -+ label = "wps"; -+ gpios = <&gpio 102 GPIO_ACTIVE_LOW>; -+ }; -+ }; -+ -+ leds { -+ compatible = "gpio-leds"; -+/* -+ * red { -+ * label = "bpi-r64:pio:red"; -+ * gpios = <&gpio 88 GPIO_ACTIVE_HIGH>; -+ * default-state = "off"; -+ * }; -+ */ -+ green { -+ label = "bpi-r64:pio:green"; -+ gpios = <&gpio 89 GPIO_ACTIVE_HIGH>; -+ default-state = "off"; -+ }; -+ -+ blue { -+ label = "bpi-r64:pio:blue"; -+ gpios = <&gpio 85 GPIO_ACTIVE_LOW>; -+ default-state = "off"; -+ }; -+ }; -+ - reg_1p8v: regulator-1p8v { - compatible = "regulator-fixed"; - regulator-name = "fixed-1.8V"; -@@ -199,7 +236,7 @@ - status = "okay"; - bus-width = <8>; - max-frequency = <50000000>; -- cap-sd-highspeed; -+ cap-mmc-highspeed; - vmmc-supply = <®_3p3v>; - vqmmc-supply = <®_3p3v>; - non-removable; -@@ -210,7 +247,7 @@ - pinctrl-0 = <&mmc1_pins_default>; - status = "okay"; - bus-width = <4>; -- max-frequency = <50000000>; -+ max-frequency = <12000000>; - cap-sd-highspeed; - r_smpl = <1>; - vmmc-supply = <®_3p3v>; diff --git a/root/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch b/root/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch deleted file mode 100644 index 1dc2a848..00000000 --- a/root/package/boot/uboot-mediatek/patches/403-add-bananapi_bpi-r64-snand.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/arch/arm/dts/mt7622-bananapi-bpi-r64.dts -+++ b/arch/arm/dts/mt7622-bananapi-bpi-r64.dts -@@ -19,7 +19,7 @@ - }; - - aliases { -- spi0 = &snfi; -+ spi0 = &snand; - ethernet0 = ð - }; - -@@ -205,17 +205,11 @@ - }; - }; - --&snfi { -- pinctrl-names = "default", "snfi"; -- pinctrl-0 = <&snor_pins>; -- pinctrl-1 = <&snfi_pins>; -+&snand { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&snfi_pins>; - status = "okay"; -- -- spi-flash@0{ -- compatible = "jedec,spi-nor"; -- reg = <0>; -- u-boot,dm-pre-reloc; -- }; -+ quad-spi; - }; - - &uart0 { diff --git a/root/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch b/root/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch deleted file mode 100644 index 5ce3a7cd..00000000 --- a/root/package/boot/uboot-mediatek/patches/404-add-bananapi_bpi-r64_defconfigs.patch +++ /dev/null @@ -1,658 +0,0 @@ ---- /dev/null -+++ b/configs/mt7622_bananapi_bpi-r64-sdmmc_defconfig -@@ -0,0 +1,159 @@ -+CONFIG_ARM=y -+CONFIG_POSITION_INDEPENDENT=y -+CONFIG_ARCH_MEDIATEK=y -+CONFIG_TARGET_MT7622=y -+CONFIG_SYS_TEXT_BASE=0x41e00000 -+CONFIG_SYS_MALLOC_F_LEN=0x4000 -+CONFIG_SYS_LOAD_ADDR=0x40080000 -+CONFIG_USE_DEFAULT_ENV_FILE=y -+CONFIG_BOARD_LATE_INIT=y -+CONFIG_BOOTP_SEND_HOSTNAME=y -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_DEBUG_UART_BASE=0x11002000 -+CONFIG_DEBUG_UART_CLOCK=25000000 -+CONFIG_DEFAULT_DEVICE_TREE="mt7622-bananapi-bpi-r64" -+CONFIG_OF_LIBFDT_OVERLAY=y -+CONFIG_DEBUG_UART=y -+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r64-sdmmc_env" -+CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_SMBIOS_PRODUCT_NAME="" -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_BOOTDELAY=30 -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_GPIO_HOG=y -+CONFIG_CMD_ENV_FLAGS=y -+CONFIG_FIT=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LED=y -+CONFIG_LED_BLINK=y -+CONFIG_LED_GPIO=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_DEFAULT_FDT_FILE="mediatek/mt7622-bananapi-bpi-r64.dtb" -+CONFIG_SYS_PROMPT="MT7622> " -+CONFIG_CMD_BOOTMENU=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CACHE=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DM=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_EXT4=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_FS_UUID=y -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_GPT=y -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LICENSE=y -+CONFIG_CMD_LINK_LOCAL=y -+# CONFIG_CMD_MBR is not set -+CONFIG_CMD_MMC=y -+CONFIG_CMD_MTD=y -+CONFIG_CMD_PCI=y -+CONFIG_CMD_SF_TEST=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_PWM=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+CONFIG_CMD_UBI=y -+CONFIG_CMD_UBI_RENAME=y -+CONFIG_CMD_UBIFS=y -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PART=y -+CONFIG_CMD_PSTORE=y -+CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000 -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SNTP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_STRINGS=y -+CONFIG_CMD_USB=y -+CONFIG_CMD_UUID=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_MMC=y -+CONFIG_DM_MTD=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_REGULATOR_GPIO=y -+CONFIG_DM_USB=y -+CONFIG_DM_PWM=y -+CONFIG_PWM_MTK=y -+CONFIG_HUSH_PARSER=y -+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_ENV_IS_IN_MMC=y -+CONFIG_SYS_MMC_ENV_DEV=1 -+CONFIG_ENV_OFFSET=0x400000 -+CONFIG_ENV_OFFSET_REDUND=0x480000 -+CONFIG_ENV_SIZE=0x80000 -+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y -+CONFIG_VERSION_VARIABLE=y -+CONFIG_PARTITION_UUIDS=y -+CONFIG_NETCONSOLE=y -+CONFIG_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_CLK=y -+CONFIG_DM_GPIO=y -+CONFIG_DM_SCSI=y -+CONFIG_AHCI=y -+CONFIG_AHCI_PCI=y -+CONFIG_SCSI_AHCI=y -+CONFIG_SCSI=y -+CONFIG_CMD_SCSI=y -+CONFIG_PHY=y -+CONFIG_PHY_MTK_TPHY=y -+CONFIG_PHY_FIXED=y -+CONFIG_MTK_AHCI=y -+CONFIG_DM_ETH=y -+CONFIG_MEDIATEK_ETH=y -+CONFIG_PCI=y -+CONFIG_MTD=y -+CONFIG_MTD_UBI_FASTMAP=y -+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:512k(bl2),2048k(fip),-(ubi)" -+CONFIG_DM_PCI=y -+CONFIG_PCIE_MEDIATEK=y -+CONFIG_PINCTRL=y -+CONFIG_PINCONF=y -+CONFIG_PINCTRL_MT7622=y -+CONFIG_POWER_DOMAIN=y -+CONFIG_PRE_CONSOLE_BUFFER=y -+CONFIG_PRE_CON_BUF_ADDR=0x4007EF00 -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_RAM=y -+CONFIG_DM_SERIAL=y -+CONFIG_MTK_SERIAL=y -+CONFIG_MMC=y -+CONFIG_MMC_DEFAULT_DEV=1 -+CONFIG_MMC_HS200_SUPPORT=y -+CONFIG_MMC_MTK=y -+CONFIG_MMC_SUPPORTS_TUNING=y -+CONFIG_SUPPORT_EMMC_BOOT=y -+CONFIG_SPI=y -+CONFIG_DM_SPI=y -+CONFIG_MTK_SPI_NAND=y -+CONFIG_MTK_SPI_NAND_MTD=y -+CONFIG_SYSRESET_WATCHDOG=y -+CONFIG_WDT_MTK=y -+CONFIG_LZO=y -+CONFIG_ZSTD=y -+CONFIG_HEXDUMP=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y -+CONFIG_USB=y -+CONFIG_USB_HOST=y -+CONFIG_USB_XHCI_HCD=y -+CONFIG_USB_XHCI_MTK=y -+CONFIG_USB_STORAGE=y ---- /dev/null -+++ b/bananapi_bpi-r64-sdmmc_env -@@ -0,0 +1,82 @@ -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x48000000 -+bootargs=root=/dev/mmcblk1p65 -+bootcmd=if pstore check ; then run boot_recovery ; else run boot_sdmmc ; fi -+bootconf=config-mt7622-bananapi-bpi-r64-pcie1 -+bootconf_pcie=config-mt7622-bananapi-bpi-r64-pcie1 -+bootconf_sata=config-mt7622-bananapi-bpi-r64-sata -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7622-bananapi_bpi-r64-initramfs-recovery.itb -+bootfile_emmcbl2=openwrt-mediatek-mt7622-bananapi_bpi-r64-emmc-preloader.bin -+bootfile_emmcbl3=openwrt-mediatek-mt7622-bananapi_bpi-r64-emmc-bl31-uboot.fip -+bootfile_upg=openwrt-mediatek-mt7622-bananapi_bpi-r64-squashfs-sysupgrade.itb -+bootled_pwr=bpi-r64:pio:green -+bootled_rec=bpi-r64:pio:blue -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) [SD card] -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+bootmenu_2=Boot production system from SD card.=run boot_production ; run bootmenu_confirm_return -+bootmenu_3=Boot recovery system from SD card.=run boot_recovery ; run bootmenu_confirm_return -+bootmenu_4=Load production system via TFTP then write to SD card.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_5=Load recovery system via TFTP then write to SD card.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_6=Install bootloader, recovery and production to eMMC.=run emmc_init ; run bootmenu_confirm_return -+bootmenu_7=Install bootloader, recovery and production to NAND.=run ubi_init ; run bootmenu_confirm_return -+bootmenu_8=Reboot.=reset -+bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset -+boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_production=led $bootled_pwr on ; run sdmmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off -+boot_recovery=led $bootled_rec on ; run sdmmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off -+boot_sdmmc=run boot_production ; run boot_recovery -+boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run sdmmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run sdmmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr -+boot_ubi=ubi part ubi && setenv bootargs && run boot_ubi_production ; run boot_ubi_recovery -+boot_ubi_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr ; led $bootled_pwr off -+boot_ubi_recovery=led $bootled_rec on ; run ubi_read_recovery ; bootm $loadaddr#$bootconf ; ubi remove recovery ; led $bootled_rec off -+check_ubi=ubi part ubi || run ubi_format -+emmc_init=run emmc_init_bl && run emmc_init_openwrt ; env default bootcmd ; saveenv ; saveenv -+emmc_init_bl=run sdmmc_read_emmc_bl2 && run emmc_write_bl2 && run sdmmc_read_emmc_hdr && run emmc_write_hdr && run sdmmc_read_emmc_fip && run emmc_write_fip -+emmc_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run emmc_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run emmc_write_production -+emmc_write_bl2=mmc dev 0 1 && mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $loadaddr 0x0 0x100 ; mmc partconf 0 1 1 0 -+emmc_write_fip=mmc dev 0 0 && mmc erase 0x1000 0x1000 && mmc write $loadaddr 0x1000 0x1000 && mmc erase 0x2000 0x800 -+emmc_write_hdr=mmc dev 0 0 && mmc erase 0x0 0x40 && mmc write $loadaddr 0x0 0x40 -+emmc_write_production=mmc dev 0 && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol -+emmc_write_recovery=mmc dev 0 && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol -+mmc_write_vol=imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $loadaddr 0x$part_addr 0x$image_size -+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size && setexpr filesize $image_size * 0x200 -+part_default=production -+part_recovery=recovery -+reset_factory=eraseenv && reset -+sdmmc_read_emmc_hdr=mmc dev 1 && part start mmc 1 install part_addr && mmc read $loadaddr $part_addr 0x40 -+sdmmc_read_emmc_bl2=mmc dev 1 && part start mmc 1 install part_addr && setexpr offset $part_addr + 0x400 && mmc read $loadaddr $offset 0x400 -+sdmmc_read_emmc_fip=mmc dev 1 && part start mmc 1 install part_addr && setexpr offset $part_addr + 0x1000 && mmc read $loadaddr $offset 0x1000 -+sdmmc_read_production=mmc dev 1 && part start mmc 1 $part_default part_addr && part size mmc 1 $part_default part_size && run mmc_read_vol -+sdmmc_read_recovery=mmc dev 1 && part start mmc 1 $part_recovery part_addr && part size mmc 1 $part_recovery part_size && run mmc_read_vol -+sdmmc_read_snand_bl2=mmc dev 1 && part start mmc 1 install part_addr && setexpr offset $part_addr + 0x2000 && mmc read $loadaddr $offset 0x400 -+sdmmc_read_snand_fip=mmc dev 1 && part start mmc 1 install part_addr && setexpr offset $part_addr + 0x2400 && mmc read $loadaddr $offset 0x1000 -+sdmmc_write_production=mmc dev 1 && part start mmc 1 $part_default part_addr && part size mmc 1 $part_default part_size && run mmc_write_vol -+sdmmc_write_recovery=mmc dev 1 && part start mmc 1 $part_recovery part_addr && part size mmc 1 $part_recovery part_size && run mmc_write_vol -+snand_write_fip=mtd erase fip && mtd write fip $loadaddr -+snand_write_bl2=mtd erase bl2 && mtd write bl2 $loadaddr -+ubi_create_env=ubi create ubootenv 0x100000 dynamic 0 ; ubi create ubootenv2 0x100000 dynamic 1 ; ubi create fit 0x100000 dynamic 2 ; ubi create recovery 0x100000 dynamic 3 -+ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset -+ubi_init=run ubi_init_bl && ubi detach && mtd erase ubi && ubi part ubi && run ubi_create_env && run ubi_init_openwrt -+ubi_init_openwrt=run sdmmc_read_recovery && iminfo $loadaddr && run ubi_write_recovery ; run sdmmc_read_production && iminfo $loadaddr && run ubi_write_production -+ubi_init_bl=run sdmmc_read_snand_bl2 && run snand_write_bl2 && run sdmmc_read_snand_fip && run snand_write_fip -+ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi -+ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs -+ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery -+ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data -+ubi_write_production=ubi check fit && ubi remove fit ; run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize -+ubi_write_recovery=ubi check recovery && ubi remove recovery ; run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize -+_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv -+_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver" ---- /dev/null -+++ b/configs/mt7622_bananapi_bpi-r64-emmc_defconfig -@@ -0,0 +1,146 @@ -+CONFIG_ARM=y -+CONFIG_POSITION_INDEPENDENT=y -+CONFIG_ARCH_MEDIATEK=y -+CONFIG_TARGET_MT7622=y -+CONFIG_SYS_TEXT_BASE=0x41e00000 -+CONFIG_SYS_MALLOC_F_LEN=0x4000 -+CONFIG_SYS_LOAD_ADDR=0x40080000 -+CONFIG_USE_DEFAULT_ENV_FILE=y -+CONFIG_BOARD_LATE_INIT=y -+CONFIG_BOOTP_SEND_HOSTNAME=y -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_DEBUG_UART_BASE=0x11002000 -+CONFIG_DEBUG_UART_CLOCK=25000000 -+CONFIG_DEFAULT_DEVICE_TREE="mt7622-bananapi-bpi-r64" -+CONFIG_OF_LIBFDT_OVERLAY=y -+CONFIG_DEBUG_UART=y -+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r64-emmc_env" -+CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_SMBIOS_PRODUCT_NAME="" -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_BOOTDELAY=30 -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_GPIO_HOG=y -+CONFIG_CMD_ENV_FLAGS=y -+CONFIG_FIT=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LED=y -+CONFIG_LED_BLINK=y -+CONFIG_LED_GPIO=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_DEFAULT_FDT_FILE="mt7622-bananapi-bpi-r64" -+CONFIG_SYS_PROMPT="MT7622> " -+CONFIG_CMD_BOOTMENU=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CACHE=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_EXT4=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_FS_UUID=y -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_GPT=y -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LICENSE=y -+CONFIG_CMD_LINK_LOCAL=y -+# CONFIG_CMD_MBR is not set -+CONFIG_CMD_MMC=y -+CONFIG_CMD_PCI=y -+CONFIG_CMD_SF_TEST=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_PWM=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PART=y -+CONFIG_CMD_PSTORE=y -+CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000 -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SNTP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_STRINGS=y -+CONFIG_CMD_USB=y -+CONFIG_CMD_UUID=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_MMC=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_REGULATOR_GPIO=y -+CONFIG_DM_USB=y -+CONFIG_DM_PWM=y -+CONFIG_PWM_MTK=y -+CONFIG_HUSH_PARSER=y -+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_ENV_IS_IN_MMC=y -+CONFIG_SYS_MMC_ENV_DEV=0 -+CONFIG_ENV_OFFSET=0x400000 -+CONFIG_ENV_OFFSET_REDUND=0x480000 -+CONFIG_ENV_SIZE=0x80000 -+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y -+CONFIG_VERSION_VARIABLE=y -+CONFIG_PARTITION_UUIDS=y -+CONFIG_NETCONSOLE=y -+CONFIG_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_CLK=y -+CONFIG_DM_GPIO=y -+CONFIG_DM_SCSI=y -+CONFIG_AHCI=y -+CONFIG_AHCI_PCI=y -+CONFIG_SCSI_AHCI=y -+CONFIG_SCSI=y -+CONFIG_CMD_SCSI=y -+CONFIG_PHY=y -+CONFIG_PHY_MTK_TPHY=y -+CONFIG_PHY_FIXED=y -+CONFIG_MTK_AHCI=y -+CONFIG_DM_ETH=y -+CONFIG_MEDIATEK_ETH=y -+CONFIG_PCI=y -+CONFIG_DM_PCI=y -+CONFIG_PCIE_MEDIATEK=y -+CONFIG_PINCTRL=y -+CONFIG_PINCONF=y -+CONFIG_PINCTRL_MT7622=y -+CONFIG_POWER_DOMAIN=y -+CONFIG_PRE_CONSOLE_BUFFER=y -+CONFIG_PRE_CON_BUF_ADDR=0x4007EF00 -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_RAM=y -+CONFIG_DM_SERIAL=y -+CONFIG_MTK_SERIAL=y -+CONFIG_MMC=y -+CONFIG_MMC_DEFAULT_DEV=0 -+CONFIG_MMC_HS200_SUPPORT=y -+CONFIG_MMC_MTK=y -+CONFIG_MMC_SUPPORTS_TUNING=y -+CONFIG_SUPPORT_EMMC_BOOT=y -+CONFIG_SYSRESET_WATCHDOG=y -+CONFIG_WDT_MTK=y -+CONFIG_LZO=y -+CONFIG_ZSTD=y -+CONFIG_HEXDUMP=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y -+CONFIG_USB=y -+CONFIG_USB_HOST=y -+CONFIG_USB_XHCI_HCD=y -+CONFIG_USB_XHCI_MTK=y -+CONFIG_USB_STORAGE=y ---- /dev/null -+++ b/bananapi_bpi-r64-emmc_env -@@ -0,0 +1,56 @@ -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x48000000 -+bootcmd=if pstore check ; then run boot_recovery ; else run boot_emmc ; fi -+bootargs=root=/dev/mmcblk0p65 -+bootconf=config-mt7622-bananapi-bpi-r64-pcie1 -+bootconf_pcie=config-mt7622-bananapi-bpi-r64-pcie1 -+bootconf_sata=config-mt7622-bananapi-bpi-r64-sata -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7622-bananapi_bpi-r64-initramfs-recovery.itb -+bootfile_upg=openwrt-mediatek-mt7622-bananapi_bpi-r64-squashfs-sysupgrade.itb -+bootfile_bl2=openwrt-mediatek-mt7622-bananapi_bpi-r64-emmc-preloader.bin -+bootfile_fip=openwrt-mediatek-mt7622-bananapi_bpi-r64-emmc-bl31-uboot.fip -+bootled_pwr=bpi-r64:pio:green -+bootled_rec=bpi-r64:pio:blue -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) [eMMC] -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+bootmenu_2=Boot production system from eMMC.=run boot_production ; run bootmenu_confirm_return -+bootmenu_3=Boot recovery system from eMMC.=run boot_recovery ; run bootmenu_confirm_return -+bootmenu_4=Load production system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_5=Load recovery system via TFTP then write to eMMC.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to eMMC.=run boot_tftp_write_fip ; run bootmenu_confirm_return -+bootmenu_7=Load BL2 preloader via TFTP then write to eMMC.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return -+bootmenu_8=Reboot.=reset -+bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset -+boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_production=led $bootled_pwr on ; run emmc_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off -+boot_recovery=led $bootled_rec on ; run emmc_read_recovery && bootm $loadaddr#$bootconf ; led $bootled_rec off -+boot_emmc=run boot_production ; run boot_recovery -+boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run emmc_write_production ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run emmc_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run emmc_write_bl2 -+boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run emmc_write_fip -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr -+emmc_write_production=mmc dev 0 && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_write_vol -+emmc_write_recovery=mmc dev 0 && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_write_vol -+emmc_write_bl2=mmc dev 0 1 && mmc partconf 0 1 1 1 && mmc erase 0x0 0x400 && mmc write $loadaddr 0x0 0x100 ; mmc partconf 0 1 1 0 -+emmc_write_fip=mmc dev 0 0 && mmc erase 0x1000 0x1000 && mmc write $loadaddr 0x1000 0x1000 && mmc erase 0x2000 0x800 -+emmc_read_production=mmc dev 0 && part start mmc 0 $part_default part_addr && part size mmc 0 $part_default part_size && run mmc_read_vol -+emmc_read_recovery=mmc dev 0 && part start mmc 0 $part_recovery part_addr && part size mmc 0 $part_recovery part_size && run mmc_read_vol -+mmc_write_vol=imszb $fileaddr image_size && test 0x$image_size -le 0x$part_size && mmc erase 0x$part_addr 0x$part_size && mmc write $fileaddr 0x$part_addr 0x$image_size -+mmc_read_vol=mmc read $loadaddr $part_addr 0x8 && imszb $loadaddr image_size && test 0x$image_size -le 0x$part_size && mmc read $loadaddr 0x$part_addr 0x$image_size -+part_default=production -+part_recovery=recovery -+reset_factory=eraseenv && reset -+_init_env=setenv _init_env ; setenv _create_env ; saveenv ; saveenv -+_firstboot=setenv _firstboot ; run _switch_to_menu ; run _init_env ; run boot_first -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver" ---- /dev/null -+++ b/configs/mt7622_bananapi_bpi-r64-snand_defconfig -@@ -0,0 +1,140 @@ -+CONFIG_ARM=y -+CONFIG_POSITION_INDEPENDENT=y -+CONFIG_ARCH_MEDIATEK=y -+CONFIG_SYS_TEXT_BASE=0x41e00000 -+CONFIG_SYS_MALLOC_F_LEN=0x4000 -+CONFIG_SYS_LOAD_ADDR=0x40080000 -+CONFIG_USE_DEFAULT_ENV_FILE=y -+CONFIG_BOARD_LATE_INIT=y -+CONFIG_BOOTP_SEND_HOSTNAME=y -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_DEBUG_UART_BASE=0x11002000 -+CONFIG_DEBUG_UART_CLOCK=25000000 -+CONFIG_DEFAULT_DEVICE_TREE="mt7622-bananapi-bpi-r64" -+CONFIG_OF_LIBFDT_OVERLAY=y -+CONFIG_DEBUG_UART=y -+CONFIG_DEFAULT_ENV_FILE="bananapi_bpi-r64-snand_env" -+CONFIG_DISTRO_DEFAULTS=y -+CONFIG_NET_RANDOM_ETHADDR=y -+CONFIG_SMBIOS_PRODUCT_NAME="" -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_BOOTDELAY=30 -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_CMD_ENV_FLAGS=y -+CONFIG_FIT=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LED=y -+CONFIG_LED_BLINK=y -+CONFIG_LED_GPIO=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_DEFAULT_FDT_FILE="mediatek/mt7622-bananapi-bpi-r64.dtb" -+CONFIG_SYS_PROMPT="MT7622> " -+CONFIG_CMD_BOOTMENU=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DM=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+CONFIG_CMD_EFIDEBUG=y -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_EXT4=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_FS_UUID=y -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_GPT=y -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LICENSE=y -+CONFIG_CMD_LINK_LOCAL=y -+# CONFIG_CMD_MBR is not set -+CONFIG_CMD_MMC=y -+CONFIG_CMD_MTD=y -+CONFIG_CMD_PCI=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+CONFIG_CMD_UBI=y -+CONFIG_CMD_UBI_RENAME=y -+CONFIG_CMD_UBIFS=y -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PART=y -+CONFIG_CMD_PSTORE=y -+CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000 -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SNTP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_USB=y -+CONFIG_CMD_UUID=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_MMC=y -+CONFIG_DM_MTD=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_REGULATOR_GPIO=y -+CONFIG_DM_USB=y -+CONFIG_HUSH_PARSER=y -+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_ENV_IS_IN_UBI=y -+CONFIG_ENV_UBI_PART="ubi" -+CONFIG_ENV_UBI_VOLUME="ubootenv" -+CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2" -+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y -+CONFIG_VERSION_VARIABLE=y -+CONFIG_PARTITION_UUIDS=y -+CONFIG_NETCONSOLE=y -+CONFIG_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_CLK=y -+CONFIG_PHY_FIXED=y -+CONFIG_DM_ETH=y -+CONFIG_MEDIATEK_ETH=y -+CONFIG_PCI=y -+CONFIG_MTD=y -+CONFIG_MTD_UBI_FASTMAP=y -+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:512k(bl2),2048k(fip),-(ubi)" -+CONFIG_DM_PCI=y -+CONFIG_PCIE_MEDIATEK=y -+CONFIG_PINCTRL=y -+CONFIG_PINCONF=y -+CONFIG_PINCTRL_MT7622=y -+CONFIG_POWER_DOMAIN=y -+CONFIG_PRE_CONSOLE_BUFFER=y -+CONFIG_PRE_CON_BUF_ADDR=0x4007EF00 -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_RAM=y -+CONFIG_DM_SERIAL=y -+CONFIG_MTK_SERIAL=y -+CONFIG_MMC=y -+CONFIG_MMC_DEFAULT_DEV=1 -+CONFIG_MMC_MTK=y -+CONFIG_SUPPORT_EMMC_BOOT=y -+CONFIG_SPI=y -+CONFIG_DM_SPI=y -+CONFIG_MTK_SPI_NAND=y -+CONFIG_MTK_SPI_NAND_MTD=y -+CONFIG_SYSRESET_WATCHDOG=y -+CONFIG_WDT_MTK=y -+CONFIG_LZO=y -+CONFIG_ZSTD=y -+CONFIG_HEXDUMP=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y -+CONFIG_USB=y -+CONFIG_USB_HOST=y -+CONFIG_USB_XHCI_HCD=y -+CONFIG_USB_XHCI_MTK=y -+CONFIG_USB_STORAGE=y ---- /dev/null -+++ b/bananapi_bpi-r64-snand_env -@@ -0,0 +1,57 @@ -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x48000000 -+bootargs=root=/dev/ubiblock0_2p1 -+bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi -+bootconf=config-mt7622-bananapi-bpi-r64-pcie1 -+bootconf_pcie=config-mt7622-bananapi-bpi-r64-pcie1 -+bootconf_sata=config-mt7622-bananapi-bpi-r64-sata -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7622-bananapi_bpi-r64-initramfs-recovery.itb -+bootfile_fip=openwrt-mediatek-mt7622-bananapi_bpi-r64-snand-bl31-uboot.fip -+bootfile_bl2=openwrt-mediatek-mt7622-bananapi_bpi-r64-snand-preloader.bin -+bootfile_upg=openwrt-mediatek-mt7622-bananapi_bpi-r64-squashfs-sysupgrade.itb -+bootled_pwr=bpi-r64:pio:green -+bootled_rec=bpi-r64:pio:blue -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) [SPI-NAND] -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+bootmenu_2=Boot production system from NAND.=run boot_production ; run bootmenu_confirm_return -+bootmenu_3=Boot recovery system from NAND.=run boot_recovery ; run bootmenu_confirm_return -+bootmenu_4=Load production system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_5=Load recovery system via TFTP then write to NAND.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to NAND.=run boot_tftp_write_fip ; run bootmenu_confirm_return -+bootmenu_7=Load BL2 preloader via TFTP then write to NAND.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return -+bootmenu_8=Reboot.=reset -+bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset -+boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off -+boot_recovery=led $bootled_rec on ; run ubi_read_recovery ; bootm $loadaddr#$bootconf ; ubi remove recovery ; led $bootled_rec off -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf -+boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && iminfo $loadaddr && ubi part ubi && run ubi_write_production ubi_prepare_rootfs ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && iminfo $loadaddr && ubi part ubi && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run boot_write_bl2 -+boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip -+boot_ubi=ubi part ubi && run boot_production ; run boot_recovery -+boot_write_bl2=mtd erase bl2 && mtd write spi-nand0 $loadaddr 0x0 0x20000 && mtd write spi-nand0 $loadaddr 0x20000 0x20000 && mtd write spi-nand0 $loadaddr 0x40000 0x20000 && mtd write spi-nand0 $loadaddr 0x60000 0x20000 -+boot_write_fip=mtd erase fip && mtd write fip $loadaddr -+check_ubi=ubi part ubi || run ubi_format -+reset_factory=ubi part ubi ; ubi write 0x0 ubootenv 0x0 ; ubi write 0x0 ubootenv2 0x0 ; ubi remove rootfs_data -+ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset -+ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi -+ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs -+ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery -+ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data -+ubi_write_production=ubi check fit && env exists replacevol && ubi remove fit ; if ubi check fit ; then else run ubi_remove_rootfs ; ubi create fit $filesize dynamic 2 && ubi write $loadaddr fit $filesize ; fi -+ubi_write_recovery=ubi check recovery && env exists replacevol && ubi remove recovery ; if ubi check recovery ; then else run ubi_remove_rootfs ; ubi create recovery $filesize dynamic 3 && ubi write $loadaddr recovery $filesize ; fi -+_create_env=ubi create ubootenv 0x100000 dynamic 0 ; ubi create ubootenv2 0x100000 dynamic 1 ; ubi create fit 0x100000 dynamic 2 ; ubi create recovery 0x100000 dynamic 3 -+_init_env=setenv _init_env ; if ubi check ubootenv && ubi check ubootenv2 ; then else run _create_env ; fi ; setenv _create_env ; saveenv || run ubi_format ; saveenv || run ubi_format -+_firstboot=setenv _firstboot ; run _switch_to_menu ; run check_ubi ; run _init_env ; run boot_first -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver" diff --git a/root/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch b/root/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch deleted file mode 100644 index 87481929..00000000 --- a/root/package/boot/uboot-mediatek/patches/405-dts-mt7623n-bpi-r2-fix-leds.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts -+++ b/arch/arm/dts/mt7623n-bananapi-bpi-r2.dts -@@ -50,19 +50,19 @@ - - blue { - label = "bpi-r2:pio:blue"; -- gpios = <&gpio 241 GPIO_ACTIVE_HIGH>; -+ gpios = <&gpio 240 GPIO_ACTIVE_LOW>; - default-state = "off"; - }; - - green { - label = "bpi-r2:pio:green"; -- gpios = <&gpio 240 GPIO_ACTIVE_HIGH>; -+ gpios = <&gpio 241 GPIO_ACTIVE_LOW>; - default-state = "off"; - }; - - red { - label = "bpi-r2:pio:red"; -- gpios = <&gpio 239 GPIO_ACTIVE_HIGH>; -+ gpios = <&gpio 239 GPIO_ACTIVE_LOW>; - default-state = "off"; - }; - }; diff --git a/root/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch b/root/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch deleted file mode 100644 index fde679f3..00000000 --- a/root/package/boot/uboot-mediatek/patches/410-add-linksys-e8450.patch +++ /dev/null @@ -1,407 +0,0 @@ ---- /dev/null -+++ b/configs/mt7622_linksys_e8450_defconfig -@@ -0,0 +1,136 @@ -+CONFIG_ARM=y -+CONFIG_POSITION_INDEPENDENT=y -+CONFIG_ARCH_MEDIATEK=y -+CONFIG_TARGET_MT7622=y -+CONFIG_SYS_TEXT_BASE=0x41e00000 -+CONFIG_SYS_MALLOC_F_LEN=0x4000 -+CONFIG_SYS_LOAD_ADDR=0x40080000 -+CONFIG_USE_DEFAULT_ENV_FILE=y -+CONFIG_BOARD_LATE_INIT=y -+CONFIG_BOOTP_SEND_HOSTNAME=y -+CONFIG_DEFAULT_ENV_FILE="linksys_e8450_env" -+CONFIG_NR_DRAM_BANKS=1 -+CONFIG_DEBUG_UART_BASE=0x11002000 -+CONFIG_DEBUG_UART_CLOCK=25000000 -+CONFIG_DEFAULT_DEVICE_TREE="mt7622-linksys-e8450-ubi" -+CONFIG_DEBUG_UART=y -+CONFIG_MTDPARTS_DEFAULT="mtdparts=spi-nand0:512k(bl2),1280k(fip),1024k(factory),256k(reserved),-(ubi)" -+CONFIG_SMBIOS_PRODUCT_NAME="" -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_BOOTDELAY=30 -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_GPIO_HOG=y -+CONFIG_CMD_ENV_FLAGS=y -+CONFIG_FIT=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LED=y -+CONFIG_LED_BLINK=y -+CONFIG_LED_GPIO=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_DEFAULT_FDT_FILE="mt7622-linksys-e8450" -+CONFIG_SYS_PROMPT="MT7622> " -+CONFIG_CMD_BOOTMENU=y -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_EXT4=y -+CONFIG_CMD_FAT=y -+CONFIG_CMD_FS_GENERIC=y -+CONFIG_CMD_FS_UUID=y -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_GPT=y -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LICENSE=y -+CONFIG_CMD_LINK_LOCAL=y -+# CONFIG_CMD_MBR is not set -+CONFIG_CMD_MTD=y -+CONFIG_CMD_MTDPART=y -+CONFIG_CMD_PCI=y -+CONFIG_CMD_SF_TEST=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+CONFIG_CMD_UBI=y -+CONFIG_CMD_UBI_RENAME=y -+CONFIG_CMD_UBIFS=y -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PART=y -+CONFIG_CMD_PSTORE=y -+CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000 -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SNTP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_USB=y -+CONFIG_CMD_UUID=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_REGULATOR_GPIO=y -+CONFIG_DM_USB=y -+CONFIG_HUSH_PARSER=y -+CONFIG_SYS_REDUNDAND_ENVIRONMENT=y -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+CONFIG_ENV_IS_IN_UBI=y -+CONFIG_ENV_UBI_PART="ubi" -+CONFIG_ENV_UBI_VOLUME="ubootenv" -+CONFIG_ENV_UBI_VOLUME_REDUND="ubootenv2" -+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y -+CONFIG_VERSION_VARIABLE=y -+CONFIG_PARTITION_UUIDS=y -+CONFIG_NETCONSOLE=y -+CONFIG_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_CLK=y -+CONFIG_DM_MTD=y -+CONFIG_DM_GPIO=y -+CONFIG_PHY=y -+CONFIG_PHY_MTK_TPHY=y -+CONFIG_PHY_FIXED=y -+CONFIG_DM_ETH=y -+CONFIG_MEDIATEK_ETH=y -+CONFIG_PCI=y -+CONFIG_MTD=y -+CONFIG_MTD_UBI_FASTMAP=y -+CONFIG_DM_PCI=y -+CONFIG_PCIE_MEDIATEK=y -+CONFIG_PINCTRL=y -+CONFIG_PINCONF=y -+CONFIG_PINCTRL_MT7622=y -+CONFIG_POWER_DOMAIN=y -+CONFIG_PRE_CONSOLE_BUFFER=y -+CONFIG_PRE_CON_BUF_ADDR=0x4007EF00 -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_RAM=y -+CONFIG_DM_SERIAL=y -+CONFIG_MTK_SERIAL=y -+CONFIG_SPI=y -+CONFIG_DM_SPI=y -+CONFIG_MTK_SPI_NAND=y -+CONFIG_MTK_SPI_NAND_MTD=y -+CONFIG_SYSRESET_WATCHDOG=y -+CONFIG_WDT_MTK=y -+CONFIG_LZO=y -+CONFIG_ZSTD=y -+CONFIG_HEXDUMP=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y -+CONFIG_USB=y -+CONFIG_USB_HOST=y -+CONFIG_USB_XHCI_HCD=y -+CONFIG_USB_XHCI_MTK=y -+CONFIG_USB_STORAGE=y ---- /dev/null -+++ b/arch/arm/dts/mt7622-linksys-e8450-ubi.dts -@@ -0,0 +1,195 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (c) 2019 MediaTek Inc. -+ * Author: Sam Shih -+ */ -+ -+/dts-v1/; -+#include "mt7622.dtsi" -+#include "mt7622-u-boot.dtsi" -+ -+/ { -+ #address-cells = <1>; -+ #size-cells = <1>; -+ model = "mt7622-linksys-e8450-ubi"; -+ compatible = "mediatek,mt7622", "linksys,e8450-ubi"; -+ chosen { -+ stdout-path = &uart0; -+ tick-timer = &timer0; -+ }; -+ -+ aliases { -+ spi0 = &snand; -+ }; -+ -+ gpio-keys { -+ compatible = "gpio-keys"; -+ -+ factory { -+ label = "reset"; -+ gpios = <&gpio 0 GPIO_ACTIVE_LOW>; -+ }; -+ -+ wps { -+ label = "wps"; -+ gpios = <&gpio 102 GPIO_ACTIVE_LOW>; -+ }; -+ }; -+ -+ gpio-leds { -+ compatible = "gpio-leds"; -+ -+ led_power: power_blue { -+ label = "power:blue"; -+ gpios = <&gpio 95 GPIO_ACTIVE_LOW>; -+ default-state = "on"; -+ }; -+ -+ power_orange { -+ label = "power:orange"; -+ gpios = <&gpio 96 GPIO_ACTIVE_LOW>; -+ default-state = "off"; -+ }; -+ -+ inet_blue { -+ label = "inet:blue"; -+ gpios = <&gpio 97 GPIO_ACTIVE_LOW>; -+ default-state = "off"; -+ }; -+ -+ inet_orange { -+ label = "inet:orange"; -+ gpios = <&gpio 98 GPIO_ACTIVE_LOW>; -+ default-state = "off"; -+ }; -+ }; -+ -+ memory@40000000 { -+ device_type = "memory"; -+ reg = <0x40000000 0x20000000>; -+ }; -+ -+ reg_1p8v: regulator-1p8v { -+ compatible = "regulator-fixed"; -+ regulator-name = "fixed-1.8V"; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ reg_3p3v: regulator-3p3v { -+ compatible = "regulator-fixed"; -+ regulator-name = "fixed-3.3V"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ reg_5v: regulator-5v { -+ compatible = "regulator-fixed"; -+ regulator-name = "fixed-5V"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+}; -+ -+&pcie { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pcie0_pins>, <&pcie1_pins>; -+ status = "okay"; -+ -+ pcie@0,0 { -+ status = "okay"; -+ }; -+ -+ pcie@1,0 { -+ status = "okay"; -+ }; -+}; -+ -+&pinctrl { -+ pcie0_pins: pcie0-pins { -+ mux { -+ function = "pcie"; -+ groups = "pcie0_pad_perst", -+ "pcie0_1_waken", -+ "pcie0_1_clkreq"; -+ }; -+ }; -+ -+ pcie1_pins: pcie1-pins { -+ mux { -+ function = "pcie"; -+ groups = "pcie1_pad_perst", -+ "pcie1_0_waken", -+ "pcie1_0_clkreq"; -+ }; -+ }; -+ -+ snfi_pins: snfi-pins { -+ mux { -+ function = "flash"; -+ groups = "snfi"; -+ }; -+ }; -+ -+ uart0_pins: uart0 { -+ mux { -+ function = "uart"; -+ groups = "uart0_0_tx_rx" ; -+ }; -+ }; -+ -+ watchdog_pins: watchdog-default { -+ mux { -+ function = "watchdog"; -+ groups = "watchdog"; -+ }; -+ }; -+}; -+ -+&snand { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&snfi_pins>; -+ status = "okay"; -+ quad-spi; -+}; -+ -+&uart0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_pins>; -+ status = "okay"; -+}; -+ -+&watchdog { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&watchdog_pins>; -+ status = "okay"; -+}; -+ -+ð { -+ status = "okay"; -+ mediatek,gmac-id = <0>; -+ phy-mode = "sgmii"; -+ mediatek,switch = "mt7531"; -+ reset-gpios = <&gpio 54 GPIO_ACTIVE_HIGH>; -+ -+ fixed-link { -+ speed = <1000>; -+ full-duplex; -+ }; -+}; -+ -+&ssusb { -+ vusb33-supply = <®_3p3v>; -+ vbus-supply = <®_5v>; -+ status = "okay"; -+}; -+ -+&u3phy { -+ status = "okay"; -+}; ---- a/arch/arm/dts/Makefile -+++ b/arch/arm/dts/Makefile -@@ -1133,6 +1133,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \ - mt7622-rfb.dtb \ - mt7623a-unielec-u7623-02-emmc.dtb \ - mt7622-bananapi-bpi-r64.dtb \ -+ mt7622-linksys-e8450-ubi.dtb \ - mt7623n-bananapi-bpi-r2.dtb \ - mt7629-rfb.dtb \ - mt8183-pumpkin.dtb \ ---- /dev/null -+++ b/linksys_e8450_env -@@ -0,0 +1,57 @@ -+ethaddr_factory=mtd read spi-nand0 0x40080000 0x220000 0x20000 && env readmem -b ethaddr 0x4009fff4 0x6 ; setenv ethaddr_factory -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x48000000 -+bootcmd=if pstore check ; then run boot_recovery ; else run boot_ubi ; fi -+bootconf=config-1 -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7622-linksys_e8450-ubi-initramfs-recovery.itb -+bootfile_bl2=openwrt-mediatek-mt7622-linksys_e8450-ubi-preloader.bin -+bootfile_fip=openwrt-mediatek-mt7622-linksys_e8450-ubi-bl31-uboot.fip -+bootfile_upg=openwrt-mediatek-mt7622-linksys_e8450-ubi-squashfs-sysupgrade.itb -+bootled_pwr=power:blue -+bootled_rec=inet:orange on -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+bootmenu_2=Boot production system from flash.=run boot_production ; run bootmenu_confirm_return -+bootmenu_3=Boot recovery system from flash.=run boot_recovery ; run bootmenu_confirm_return -+bootmenu_4=Load production system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_5=Load recovery system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to flash.=run boot_tftp_write_fip ; run bootmenu_confirm_return -+bootmenu_7=Load BL2 preloader via TFTP then write to flash.=run boot_tftp_write_bl2 ; run bootmenu_confirm_return -+bootmenu_8=Reboot.=reset -+bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset -+boot_first=if button reset ; then led $bootled_rec on ; run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_production=led $bootled_pwr on ; run ubi_read_production && bootm $loadaddr#$bootconf ; led $bootled_pwr off -+boot_recovery=led $bootled_rec on ; run ubi_read_recovery ; bootm $loadaddr#$bootconf ; ubi remove recovery ; led $bootled_rec off -+boot_serial_write_bl2=loadx $loadaddr 115200 && run boot_write_bl2 -+boot_serial_write_fip=loadx $loadaddr 115200 && run boot_write_fip -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr#$bootconf -+boot_tftp_forever=led $bootled_rec on ; while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && iminfo $loadaddr && ubi part ubi && run ubi_write_production ubi_prepare_rootfs ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && iminfo $loadaddr && ubi part ubi && run ubi_write_recovery ; if env exists noboot ; then else bootm $loadaddr#$bootconf ; fi -+boot_tftp_write_bl2=tftpboot $loadaddr $bootfile_bl2 && run boot_write_bl2 -+boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip -+boot_ubi=ubi part ubi && run boot_production ; run boot_recovery -+boot_write_bl2=mtd erase bl2 && mtd write spi-nand0 $loadaddr 0x0 0x20000 && mtd write spi-nand0 $loadaddr 0x20000 0x20000 && mtd write spi-nand0 $loadaddr 0x40000 0x20000 && mtd write spi-nand0 $loadaddr 0x60000 0x20000 -+boot_write_fip=mtd erase fip && mtd write fip $loadaddr -+check_ubi=ubi part ubi || run ubi_format -+reset_factory=ubi part ubi ; ubi write 0x0 ubootenv 0x0 ; ubi write 0x0 ubootenv2 0x0 ; ubi remove rootfs_data -+ubi_format=ubi detach ; mtd erase ubi && ubi part ubi ; reset -+ubi_prepare_rootfs=if ubi check rootfs_data ; then else if env exists rootfs_data_max ; then ubi create rootfs_data $rootfs_data_max dynamic || ubi create rootfs_data - dynamic ; else ubi create rootfs_data - dynamic ; fi ; fi -+ubi_read_production=ubi read $loadaddr fit && iminfo $loadaddr && run ubi_prepare_rootfs -+ubi_read_recovery=ubi check recovery && ubi read $loadaddr recovery -+ubi_remove_rootfs=ubi check rootfs_data && ubi remove rootfs_data -+ubi_write_production=ubi check fit && env exists replacevol && ubi remove fit ; if ubi check fit ; then else run ubi_remove_rootfs ; ubi create fit $filesize dynamic && ubi write $loadaddr fit $filesize ; fi -+ubi_write_recovery=ubi check recovery && env exists replacevol && ubi remove recovery ; if ubi check recovery ; then else run ubi_remove_rootfs ; ubi create recovery $filesize dynamic && ubi write $loadaddr recovery $filesize ; fi -+_create_env=ubi create ubootenv 0x100000 dynamic ; ubi create ubootenv2 0x100000 dynamic -+_init_env=setenv _init_env ; if ubi check ubootenv && ubi check ubootenv2 ; then else run _create_env ; fi ; setenv _create_env ; saveenv || run ubi_format ; saveenv || run ubi_format -+_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run check_ubi ; run _init_env ; run boot_first -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver" diff --git a/root/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch b/root/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch deleted file mode 100644 index 09a72742..00000000 --- a/root/package/boot/uboot-mediatek/patches/412-add-ubnt-unifi-6-lr.patch +++ /dev/null @@ -1,454 +0,0 @@ ---- /dev/null -+++ b/configs/mt7622_ubnt_unifi-6-lr_defconfig -@@ -0,0 +1,141 @@ -+CONFIG_ARM=y -+CONFIG_POSITION_INDEPENDENT=y -+CONFIG_ARCH_MEDIATEK=y -+CONFIG_TARGET_MT7622=y -+CONFIG_SYS_TEXT_BASE=0x41e00000 -+CONFIG_SYS_MALLOC_F_LEN=0x4000 -+CONFIG_SYS_LOAD_ADDR=0x40080000 -+CONFIG_USE_DEFAULT_ENV_FILE=y -+CONFIG_MTDPARTS_DEFAULT="mtdparts=nor0:128k(bl2),640k(fip),64k(u-boot-env),256k(factory),64k(eeprom),15232k(recovery),-(firmware)" -+CONFIG_ENV_IS_IN_MTD=y -+CONFIG_ENV_MTD_NAME="nor0" -+CONFIG_ENV_SIZE_REDUND=0x4000 -+CONFIG_ENV_SIZE=0x4000 -+CONFIG_ENV_OFFSET=0xc0000 -+CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y -+CONFIG_BOARD_LATE_INIT=y -+CONFIG_RESET_BUTTON_SETTLE_DELAY=400 -+CONFIG_BOOTP_SEND_HOSTNAME=y -+CONFIG_DEFAULT_ENV_FILE="ubnt_unifi-6-lr_env" -+CONFIG_DEBUG_UART_BASE=0x11002000 -+CONFIG_DEBUG_UART_CLOCK=25000000 -+CONFIG_DEFAULT_DEVICE_TREE="mt7622-ubnt-unifi-6-lr" -+CONFIG_DEBUG_UART=y -+CONFIG_SMBIOS_PRODUCT_NAME="" -+CONFIG_AUTOBOOT_KEYED=y -+CONFIG_BOOTDELAY=30 -+CONFIG_AUTOBOOT_MENU_SHOW=y -+CONFIG_CFB_CONSOLE_ANSI=y -+CONFIG_BUTTON=y -+CONFIG_BUTTON_GPIO=y -+CONFIG_GPIO_HOG=y -+CONFIG_CMD_ENV_FLAGS=y -+CONFIG_FIT=y -+CONFIG_FIT_ENABLE_SHA256_SUPPORT=y -+CONFIG_LOGLEVEL=7 -+CONFIG_LOG=y -+CONFIG_DEFAULT_FDT_FILE="mt7622-ubnt-unifi-6-lr" -+CONFIG_SYS_PROMPT="MT7622> " -+# CONFIG_LEGACY_IMAGE_FORMAT is not set -+# CONFIG_BOOTM_PLAN9 is not set -+# CONFIG_BOOTM_RTEMS is not set -+# CONFIG_BOOTM_VXWORKS is not set -+# CONFIG_EFI is not set -+# CONFIG_EFI_LOADER is not set -+CONFIG_CMD_BOOTMENU=y -+# CONFIG_CMD_BOOTEFI is not set -+CONFIG_CMD_BOOTP=y -+CONFIG_CMD_BUTTON=y -+CONFIG_CMD_CDP=y -+CONFIG_CMD_DHCP=y -+CONFIG_CMD_DNS=y -+CONFIG_CMD_ECHO=y -+# CONFIG_CMD_ELF is not set -+# CONFIG_CMD_BOOTEFI_BOOTMGR is not set -+CONFIG_CMD_ENV_READMEM=y -+CONFIG_CMD_ERASEENV=y -+CONFIG_CMD_GPIO=y -+CONFIG_CMD_HASH=y -+CONFIG_CMD_ITEST=y -+CONFIG_CMD_LED=y -+CONFIG_CMD_LINK_LOCAL=y -+# CONFIG_CMD_MBR is not set -+CONFIG_CMD_MTD=y -+CONFIG_CMD_MTDPART=y -+# CONFIG_CMD_PCI is not set -+CONFIG_CMD_SF_TEST=y -+CONFIG_CMD_PING=y -+CONFIG_CMD_PXE=y -+CONFIG_CMD_SMC=y -+CONFIG_CMD_TFTPBOOT=y -+CONFIG_CMD_TFTPSRV=y -+# CONFIG_CMD_UNLZ4 is not set -+CONFIG_CMD_ASKENV=y -+CONFIG_CMD_PSTORE=y -+CONFIG_CMD_PSTORE_MEM_ADDR=0x42ff0000 -+CONFIG_CMD_RARP=y -+CONFIG_CMD_SETEXPR=y -+CONFIG_CMD_SLEEP=y -+CONFIG_CMD_SOURCE=y -+CONFIG_CMD_UUID=y -+CONFIG_DISPLAY_CPUINFO=y -+CONFIG_DM_ETH=y -+CONFIG_DM_ETH_PHY=y -+CONFIG_DM_GPIO=y -+CONFIG_DM_MDIO=y -+CONFIG_DM_MTD=y -+CONFIG_DM_REGULATOR=y -+CONFIG_DM_REGULATOR_FIXED=y -+CONFIG_DM_REGULATOR_GPIO=y -+# CONFIG_DM_MMC is not set -+CONFIG_DM_SERIAL=y -+CONFIG_DM_SPI=y -+CONFIG_DM_SPI_FLASH=y -+CONFIG_HUSH_PARSER=y -+# CONFIG_PARTITION_UUIDS is not set -+CONFIG_SYS_RELOC_GD_ENV_ADDR=y -+# CONFIG_LED is not set -+# CONFIG_LZ4 is not set -+CONFIG_VERSION_VARIABLE=y -+CONFIG_NETCONSOLE=y -+CONFIG_REGMAP=y -+CONFIG_SYSCON=y -+CONFIG_CLK=y -+CONFIG_PHY=y -+CONFIG_PHY_FIXED=y -+CONFIG_PHYLIB_10G=y -+CONFIG_PHY_AQUANTIA=y -+CONFIG_PHY_ADDR_ENABLE=y -+CONFIG_PHY_ADDR=8 -+CONFIG_MEDIATEK_ETH=y -+CONFIG_MTD=y -+# CONFIG_MMC is not set -+CONFIG_PINCTRL=y -+CONFIG_PINCONF=y -+CONFIG_PINCTRL_MT7622=y -+CONFIG_POWER_DOMAIN=y -+CONFIG_PRE_CONSOLE_BUFFER=y -+CONFIG_PRE_CON_BUF_ADDR=0x4007EF00 -+CONFIG_MTK_POWER_DOMAIN=y -+CONFIG_RAM=y -+CONFIG_MTK_SERIAL=y -+CONFIG_SPI=y -+CONFIG_MTK_SNFI_SPI=y -+CONFIG_MTK_SNOR=y -+CONFIG_SYSRESET_WATCHDOG=y -+CONFIG_WDT_MTK=y -+CONFIG_HEXDUMP=y -+CONFIG_RANDOM_UUID=y -+CONFIG_REGEX=y -+CONFIG_SPI_FLASH=y -+CONFIG_SPI_FLASH_BAR=y -+CONFIG_SPI_FLASH_MTD=y -+CONFIG_SPI_FLASH_UNLOCK_ALL=y -+CONFIG_SPI_FLASH_EON=y -+CONFIG_SPI_FLASH_GIGADEVICE=y -+CONFIG_SPI_FLASH_MACRONIX=y -+CONFIG_SPI_FLASH_SPANSION=y -+CONFIG_SPI_FLASH_STMICRO=y -+CONFIG_SPI_FLASH_SST=y -+CONFIG_SPI_FLASH_WINBOND=y -+CONFIG_SPI_FLASH_XMC=y ---- /dev/null -+++ b/arch/arm/dts/mt7622-ubnt-unifi-6-lr.dts -@@ -0,0 +1,202 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Copyright (c) 2019 MediaTek Inc. -+ * Author: Sam Shih -+ */ -+ -+/dts-v1/; -+#include "mt7622.dtsi" -+#include "mt7622-u-boot.dtsi" -+ -+/ { -+ #address-cells = <1>; -+ #size-cells = <1>; -+ model = "mt7622-ubnt-unifi-6-lr"; -+ compatible = "mediatek,mt7622", "ubnt,unifi-6-lr"; -+ -+ chosen { -+ stdout-path = &uart0; -+ tick-timer = &timer0; -+ }; -+ -+ aliases { -+ spi0 = &snor; -+ }; -+ -+ gpio-keys { -+ compatible = "gpio-keys"; -+ u-boot,dm-pre-reloc; -+ -+ reset { -+ label = "reset"; -+ gpios = <&gpio 62 GPIO_ACTIVE_LOW>; -+ u-boot,dm-pre-reloc; -+ }; -+ }; -+ -+ memory@40000000 { -+ device_type = "memory"; -+ reg = <0x40000000 0x20000000>; -+ }; -+ -+ reg_1p8v: regulator-1p8v { -+ compatible = "regulator-fixed"; -+ regulator-name = "fixed-1.8V"; -+ regulator-min-microvolt = <1800000>; -+ regulator-max-microvolt = <1800000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ reg_3p3v: regulator-3p3v { -+ compatible = "regulator-fixed"; -+ regulator-name = "fixed-3.3V"; -+ regulator-min-microvolt = <3300000>; -+ regulator-max-microvolt = <3300000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+ -+ reg_5v: regulator-5v { -+ compatible = "regulator-fixed"; -+ regulator-name = "fixed-5V"; -+ regulator-min-microvolt = <5000000>; -+ regulator-max-microvolt = <5000000>; -+ regulator-boot-on; -+ regulator-always-on; -+ }; -+}; -+ -+&pcie { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&pcie0_pins>, <&pcie1_pins>; -+ status = "okay"; -+ -+ pcie@0,0 { -+ status = "okay"; -+ }; -+ -+ pcie@1,0 { -+ status = "okay"; -+ }; -+}; -+ -+&pinctrl { -+ eth_pins: eth-pins { -+ mux { -+ function = "eth"; -+ groups = "mdc_mdio", "rgmii_via_gmac2"; -+ }; -+ }; -+ -+ pcie0_pins: pcie0-pins { -+ mux { -+ function = "pcie"; -+ groups = "pcie0_pad_perst", -+ "pcie0_1_waken", -+ "pcie0_1_clkreq"; -+ }; -+ }; -+ -+ pcie1_pins: pcie1-pins { -+ mux { -+ function = "pcie"; -+ groups = "pcie1_pad_perst", -+ "pcie1_0_waken", -+ "pcie1_0_clkreq"; -+ }; -+ }; -+ -+ snfi_pins: snfi-pins { -+ mux { -+ function = "flash"; -+ groups = "snfi"; -+ }; -+ }; -+ -+ snor_pins: snor-pins { -+ mux { -+ function = "flash"; -+ groups = "spi_nor"; -+ }; -+ }; -+ -+ uart0_pins: uart0 { -+ mux { -+ function = "uart"; -+ groups = "uart0_0_tx_rx" ; -+ }; -+ }; -+ -+ watchdog_pins: watchdog-default { -+ mux { -+ function = "watchdog"; -+ groups = "watchdog"; -+ }; -+ }; -+}; -+ -+&snfi { -+ pinctrl-names = "default", "snfi"; -+ pinctrl-0 = <&snor_pins>; -+ pinctrl-1 = <&snfi_pins>; -+ status = "okay"; -+ -+ spi-flash@0 { -+ compatible = "jedec,spi-nor"; -+ reg = <0>; -+ u-boot,dm-pre-reloc; -+ }; -+}; -+ -+&snor { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&snor_pins>; -+ status = "okay"; -+ -+ spi-flash@0 { -+ compatible = "jedec,spi-nor"; -+ reg = <0>; -+ spi-tx-bus-width = <1>; -+ spi-rx-bus-width = <4>; -+ u-boot,dm-pre-reloc; -+ }; -+}; -+ -+&uart0 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_pins>; -+ status = "okay"; -+}; -+ -+&watchdog { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&watchdog_pins>; -+ status = "okay"; -+}; -+ -+ð { -+ status = "okay"; -+ pinctrl-names = "default"; -+ pinctrl-0 = <ð_pins>; -+ -+ mediatek,gmac-id = <0>; -+ phy-mode = "sgmii"; -+ phy-handle = <&gphy>; -+ -+ fixed-link { -+ speed = <1000>; -+ full-duplex; -+ }; -+ -+ mdio-bus { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ gphy: ethernet-phy@8 { -+ /* Marvell AQRate AQR112W - no driver */ -+ compatible = "ethernet-phy-ieee802.3-c45"; -+ reg = <0x8>; -+ }; -+ }; -+}; ---- a/arch/arm/dts/Makefile -+++ b/arch/arm/dts/Makefile -@@ -1134,6 +1134,7 @@ dtb-$(CONFIG_ARCH_MEDIATEK) += \ - mt7623a-unielec-u7623-02-emmc.dtb \ - mt7622-bananapi-bpi-r64.dtb \ - mt7622-linksys-e8450-ubi.dtb \ -+ mt7622-ubnt-unifi-6-lr.dtb \ - mt7623n-bananapi-bpi-r2.dtb \ - mt7629-rfb.dtb \ - mt8183-pumpkin.dtb \ ---- /dev/null -+++ b/ubnt_unifi-6-lr_env -@@ -0,0 +1,50 @@ -+ethaddr_factory=mtd read nor0 $loadaddr 0x110000 0x10000 && env readmem -b ethaddr $loadaddr 0x6 ; setenv ethaddr_factory -+ipaddr=192.168.1.1 -+serverip=192.168.1.254 -+loadaddr=0x48000000 -+bootcmd=if pstore check ; then run boot_recovery ; else run boot_nor ; fi -+bootdelay=0 -+bootfile=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-initramfs-recovery.itb -+bootfile_bl2=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-preloader.bin -+bootfile_fip=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-bl31-uboot.fip -+bootfile_upg=openwrt-mediatek-mt7622-ubnt_unifi-6-lr-ubootmod-squashfs-sysupgrade.itb -+bootmenu_confirm_return=askenv - Press ENTER to return to menu ; bootmenu 60 -+bootmenu_default=0 -+bootmenu_delay=0 -+bootmenu_title= ( ( ( OpenWrt ) ) ) -+bootmenu_0=Initialize environment.=run _firstboot -+bootmenu_0d=Run default boot command.=run boot_default -+bootmenu_1=Boot system via TFTP.=run boot_tftp ; run bootmenu_confirm_return -+bootmenu_2=Boot production system from flash.=run boot_production ; run bootmenu_confirm_return -+bootmenu_3=Boot recovery system from flash.=run boot_recovery ; run bootmenu_confirm_return -+bootmenu_4=Load production system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_production ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_5=Load recovery system via TFTP then write to flash.=setenv noboot 1 ; setenv replacevol 1 ; run boot_tftp_recovery ; setenv noboot ; setenv replacevol ; run bootmenu_confirm_return -+bootmenu_6=Load BL31+U-Boot FIP via TFTP then write to flash.=run boot_tftp_write_fip ; run bootmenu_confirm_return -+bootmenu_7=Load BL2 preloader via TFTP then write to flash.=run boot_tftp_write_preloader ; run bootmenu_confirm_return -+bootmenu_8=Reboot.=reset -+bootmenu_9=Reset all settings to factory defaults.=run reset_factory ; reset -+boot_first=if button reset ; then run boot_tftp_recovery ; setenv flag_recover 1 ; run boot_default ; fi ; bootmenu -+boot_default=if env exists flag_recover ; then else run bootcmd ; fi ; run boot_recovery ; setenv replacevol 1 ; run boot_tftp_forever -+boot_production=run nor_read_production && bootm $loadaddr -+boot_recovery=run nor_read_recovery ; bootm $loadaddr -+boot_serial_write_fip=loadx $loadaddr 115200 && run boot_write_fip -+boot_serial_write_preloader=loadx $loadaddr 115200 && run boot_write_preloader -+boot_tftp_forever=while true ; do run boot_tftp_recovery ; sleep 1 ; done -+boot_tftp_production=tftpboot $loadaddr $bootfile_upg && env exists replacevol && iminfo $loadaddr && run nor_write_production ; if env exists noboot ; then else bootm $loadaddr ; fi -+boot_tftp_recovery=tftpboot $loadaddr $bootfile && env exists replacevol && iminfo $loadaddr && run nor_write_recovery ; if env exists noboot ; then else bootm $loadaddr ; fi -+boot_tftp=tftpboot $loadaddr $bootfile && bootm $loadaddr -+boot_tftp_write_fip=tftpboot $loadaddr $bootfile_fip && run boot_write_fip -+boot_tftp_write_preloader=tftpboot $loadaddr $bootfile_bl2 && run boot_write_preloader -+boot_nor=run boot_production ; run boot_recovery -+boot_write_fip=mtd erase nor0 0x20000 0x80000 && mtd write nor0 $loadaddr 0x20000 0x80000 -+boot_write_preloader=mtd erase nor0 0x0 0x20000 && mtd write nor0 $loadaddr 0x0 0x20000 -+reset_factory=mtd erase nor0 0xc0000 0x10000 && reset -+nor_read_production=mtd read nor0 $loadaddr 0x1000000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x1000000 $image_size -+nor_read_recovery=mtd read nor0 $loadaddr 0x120000 0x1000 && imsz $loadaddr image_size && mtd read nor0 $loadaddr 0x120000 $image_size -+nor_pad_size=imsz $loadaddr image_size ; setexpr image_eb $image_size / 0x1000 ; setexpr tmp1 image_size % 0x1000 ; test 0x$tmp1 -gt 0 && setexpr image_eb $image_eb + 1 ; setexpr image_eb $image_eb * 0x1000 -+nor_write_production=run nor_pad_size ; test 0x$image_eb -le 0x3000000 && mtd erase nor0 0x1000000 0x$image_eb && mtd write nor0 $loadaddr 0x1000000 $filesize -+nor_write_recovery=run nor_pad_size ; test 0x$image_eb -le 0xee0000 && mtd erase nor0 0x120000 0x$image_eb && mtd write nor0 $loadaddr 0x120000 $filesize -+_init_env=setenv _init_env ; saveenv -+_firstboot=setenv _firstboot ; run _switch_to_menu ; run ethaddr_factory ; run _init_env ; run boot_first -+_switch_to_menu=setenv _switch_to_menu ; setenv bootdelay 3 ; setenv bootmenu_delay 3 ; setenv bootmenu_0 $bootmenu_0d ; setenv bootmenu_0d ; run _bootmenu_update_title -+_bootmenu_update_title=setenv _bootmenu_update_title ; setenv bootmenu_title "$bootmenu_title $ver" ---- a/common/board_r.c -+++ b/common/board_r.c -@@ -78,6 +78,7 @@ - #ifdef CONFIG_EFI_SETUP_EARLY - #include - #endif -+#include - - DECLARE_GLOBAL_DATA_PTR; - -@@ -417,6 +418,21 @@ static int initr_onenand(void) - } - #endif - -+#if defined(CONFIG_SPI_FLASH) -+/* probe SPI FLASH */ -+static int initr_spiflash(void) -+{ -+ struct udevice *new; -+ -+ spi_flash_probe_bus_cs(CONFIG_SF_DEFAULT_BUS, -+ CONFIG_SF_DEFAULT_CS, -+ CONFIG_SF_DEFAULT_SPEED, -+ CONFIG_SF_DEFAULT_MODE, -+ &new); -+ return 0; -+} -+#endif -+ - #ifdef CONFIG_MMC - static int initr_mmc(void) - { -@@ -705,6 +721,9 @@ static init_fnc_t init_sequence_r[] = { - #ifdef CONFIG_CMD_ONENAND - initr_onenand, - #endif -+#ifdef CONFIG_SPI_FLASH -+ initr_spiflash, -+#endif - #ifdef CONFIG_MMC - initr_mmc, - #endif diff --git a/root/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch b/root/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch deleted file mode 100644 index 2f0ed85e..00000000 --- a/root/package/boot/uboot-mediatek/patches/500-board-mt7623-fix-mmc-detect.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/board/mediatek/mt7623/mt7623_rfb.c -+++ b/board/mediatek/mt7623/mt7623_rfb.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -31,8 +32,9 @@ int mmc_get_boot_dev(void) - { - int g_mmc_devid = -1; - char *uflag = (char *)0x81DFFFF0; -+ struct blk_desc *desc; - -- if (!find_mmc_device(1)) -+ if (blk_get_device_by_str("mmc", "1", &desc) < 0) - return 0; - - if (strncmp(uflag,"eMMC",4)==0) { From ceef6a67973481f49350e901c13385cd2a55b677 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Sun, 11 Sep 2022 19:25:49 +0200 Subject: [PATCH 3/7] Update BBR patch --- patches/bbr2-5.15.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/bbr2-5.15.patch b/patches/bbr2-5.15.patch index ae33db4b..89a4d343 100644 --- a/patches/bbr2-5.15.patch +++ b/patches/bbr2-5.15.patch @@ -3396,13 +3396,13 @@ index d9f1b83be6047..3437789f10e93 100644 - min_tso = ca_ops->min_tso_segs ? - ca_ops->min_tso_segs(sk) : -- sock_net(sk)->ipv4.sysctl_tcp_min_tso_segs; +- READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_min_tso_segs); - - tso_segs = tcp_tso_autosize(sk, mss_now, min_tso); + tso_segs = ca_ops->tso_segs ? + ca_ops->tso_segs(sk, mss_now) : + tcp_tso_autosize(sk, mss_now, -+ sock_net(sk)->ipv4.sysctl_tcp_min_tso_segs); ++ READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_min_tso_segs)); return min_t(u32, tso_segs, sk->sk_gso_max_segs); } From 6248242a5d2a7b2f8f08265fbe6636f823ec2647 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Mon, 12 Sep 2022 19:52:12 +0200 Subject: [PATCH 4/7] Update OpenWrt --- build.sh | 16 ++++++------- root/include/kernel-version.mk | 10 ++++---- root/include/netfilter.mk | 2 ++ root/package/kernel/linux/modules/crypto.mk | 23 ------------------- .../package/kernel/linux/modules/netfilter.mk | 11 +++++++++ root/target/linux/generic/config-5.15 | 3 +++ 6 files changed, 28 insertions(+), 37 deletions(-) diff --git a/build.sh b/build.sh index cab67892..b9f2e93d 100755 --- a/build.sh +++ b/build.sh @@ -94,13 +94,13 @@ fi if [ "$OMR_OPENWRT" = "default" ]; then if [ "$OMR_KERNEL" = "5.4" ]; then # Use OpenWrt 21.02 for 5.4 kernel - _get_repo "$OMR_TARGET/${OMR_KERNEL}/source" https://github.com/openwrt/openwrt "ce92de8c8c90aa2a6281cbfb046fcf6498b78786" - _get_repo feeds/${OMR_KERNEL}/packages https://github.com/openwrt/packages "93aca6dfbe894217435e4623bc48489ab9695cd1" - _get_repo feeds/${OMR_KERNEL}/luci https://github.com/openwrt/luci "9139ad468599b586dbd7ca48fe5a149c95f28800" + _get_repo "$OMR_TARGET/${OMR_KERNEL}/source" https://github.com/openwrt/openwrt "cb6501435c3136c296e3477bc7f3b043e2a83a47" + _get_repo feeds/${OMR_KERNEL}/packages https://github.com/openwrt/packages "51077c1094a1e63d333d32b138b381296fd45276" + _get_repo feeds/${OMR_KERNEL}/luci https://github.com/openwrt/luci "bdaec14361fa44529a2da5996745d43fc79fd764" else - _get_repo "$OMR_TARGET/${OMR_KERNEL}/source" https://github.com/openwrt/openwrt "3c06a344e9c7c03c49c9153342e68a5390651323" - _get_repo feeds/${OMR_KERNEL}/packages https://github.com/openwrt/packages "b4043d92257505526a5b8ceac94f9f28f887abbd" - _get_repo feeds/${OMR_KERNEL}/luci https://github.com/openwrt/luci "111c551cdb8d14e8e5ef7c7a66ffdceb6d3cbb55" + _get_repo "$OMR_TARGET/${OMR_KERNEL}/source" https://github.com/openwrt/openwrt "bae87942bcfb461d2882dd7e593b6aa2d75f63b1" + _get_repo feeds/${OMR_KERNEL}/packages https://github.com/openwrt/packages "2840abb0c049061618e4e32c5f59c20f7d081c67" + _get_repo feeds/${OMR_KERNEL}/luci https://github.com/openwrt/luci "46181e5ace8c5cf86e257d021b4e3e593f1a7f5e" fi elif [ "$OMR_OPENWRT" = "master" ]; then _get_repo "$OMR_TARGET/${OMR_KERNEL}/source" https://github.com/openwrt/openwrt "master" @@ -133,8 +133,8 @@ fi rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/files" "$OMR_TARGET/${OMR_KERNEL}/source/tmp" #rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/mediatek/patches-4.14" #rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/target/linux/mediatek/patches-5.4" -rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/package/boot/uboot-mediatek" -rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/package/boot/arm-trusted-firmware-mediatek" +#rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/package/boot/uboot-mediatek" +#rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/package/boot/arm-trusted-firmware-mediatek" rm -rf "$OMR_TARGET/${OMR_KERNEL}/source/tools/firmware-utils" if [ "$OMR_TARGET" != "rutx" ]; then # There is many customization to support rutx and this seems to break other ipq40xx, so dirty workaround for now diff --git a/root/include/kernel-version.mk b/root/include/kernel-version.mk index 1862202d..93320244 100644 --- a/root/include/kernel-version.mk +++ b/root/include/kernel-version.mk @@ -6,23 +6,21 @@ ifdef CONFIG_TESTING_KERNEL KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER) endif -LINUX_VERSION-5.4 = .194 -LINUX_VERSION-5.10 = .64 -LINUX_VERSION-5.14 = .6 -LINUX_VERSION-5.15 = .50 +LINUX_VERSION-5.4 = .203 +LINUX_VERSION-5.15 = .63 LINUX_KERNEL_HASH-5.4.132 = 8466adbfb3579e751ede683496df7bb20f258b5f882250f3dd82be63736d00ef LINUX_KERNEL_HASH-5.4.182 = b2f1201f64f010e9e3c85d6f303a559a7944a80a0244a86b8f5035bd23f1f40d LINUX_KERNEL_HASH-5.4.188 = 9fbc8bfdc28c9fce2307bdf7cf1172c9819df673397a411c40a5c3d0a570fdbc LINUX_KERNEL_HASH-5.4.194 = 284157891929f26f34ddd4c447980c1ce364c78df4f89b64edeac8ff9a1d3df6 -LINUX_KERNEL_HASH-5.10.64 = 3eb84bd24a2de2b4749314e34597c02401c5d6831b055ed5224adb405c35e30a -LINUX_KERNEL_HASH-5.14.6 = 54848c1268771ee3515e4c33e29abc3f1fa90d8144894cce6d0ebc3b158bccec +LINUX_KERNEL_HASH-5.4.203 = fc933f5b13066cfa54aacb5e86747a167bad1d8d23972e4a03ab5ee36c29798a LINUX_KERNEL_HASH-5.15.4 = 549d0fb75e65f6158e6f4becc648f249d386843da0e1211460bde8b1ea99cbca LINUX_KERNEL_HASH-5.15.15 = 1d3c57cf8071af174933df3e5d77da801e240a59da3c5e8406f7769de2c83a5a LINUX_KERNEL_HASH-5.15.17 = 2787f5c0cc59984902fd97916dc604f39718c73817497c25f963141bfb70abde LINUX_KERNEL_HASH-5.15.29 = 5905e684602c47ae95746d4003cb834335e5451aca4ac7c3013f15dd49ed876e LINUX_KERNEL_HASH-5.15.36 = 36345db17a937c197c72ca9c7f34c262b3a12f927c237ff7770193014e29c690 LINUX_KERNEL_HASH-5.15.50 = 554d507d37a23810fe8c83912761e4a4f73c40794bc685ff7ca98042fe1bd70f +LINUX_KERNEL_HASH-5.15.63 = 6dd3cd1e5a629d0002bc6c6ec7e8ea96710104f38664122dd56c83dfd4eb7341 remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1)))) sanitize_uri=$(call qstrip,$(subst @,_,$(subst :,_,$(subst .,_,$(subst -,_,$(subst /,_,$(1))))))) diff --git a/root/include/netfilter.mk b/root/include/netfilter.mk index 044a9719..3eb67586 100644 --- a/root/include/netfilter.mk +++ b/root/include/netfilter.mk @@ -350,6 +350,8 @@ $(eval $(if $(NF_KMOD),$(call nf_add,NFT_FIB,CONFIG_NFT_FIB_IPV6, $(P_V6)nft_fib $(eval $(if $(NF_KMOD),$(call nf_add,NFT_QUEUE,CONFIG_NFT_QUEUE, $(P_XT)nft_queue),)) +$(eval $(if $(NF_KMOD),$(call nf_add,NFT_COMPAT,CONFIG_NFT_COMPAT, $(P_XT)nft_compat),)) + # userland only IPT_BUILTIN += $(NF_IPT-y) $(NF_IPT-m) IPT_BUILTIN += $(IPT_CORE-y) $(IPT_CORE-m) diff --git a/root/package/kernel/linux/modules/crypto.mk b/root/package/kernel/linux/modules/crypto.mk index 7ee603d5..3385dedd 100644 --- a/root/package/kernel/linux/modules/crypto.mk +++ b/root/package/kernel/linux/modules/crypto.mk @@ -446,29 +446,6 @@ endef $(eval $(call KernelPackage,crypto-kpp)) - -define KernelPackage/crypto-lib-blake2s - TITLE:=BLAKE2s hash function library - KCONFIG:=CONFIG_CRYPTO_LIB_BLAKE2S - HIDDEN:=1 - FILES:= \ - $(LINUX_DIR)/lib/crypto/libblake2s.ko@lt5.14 \ - $(LINUX_DIR)/lib/crypto/libblake2s-generic.ko@lt5.14 - $(call AddDepends/crypto,+PACKAGE_kmod-crypto-hash:kmod-crypto-hash) -endef - -define KernelPackage/crypto-lib-blake2s/config - imply PACKAGE_kmod-crypto-hash -endef - -define KernelPackage/crypto-lib-blake2s/x86/64 - KCONFIG+=CONFIG_CRYPTO_BLAKE2S_X86 - FILES+=$(LINUX_DIR)/arch/x86/crypto/blake2s-x86_64.ko -endef - -$(eval $(call KernelPackage,crypto-lib-blake2s)) - - define KernelPackage/crypto-lib-chacha20 TITLE:=ChaCha library interface KCONFIG:=CONFIG_CRYPTO_LIB_CHACHA diff --git a/root/package/kernel/linux/modules/netfilter.mk b/root/package/kernel/linux/modules/netfilter.mk index 7d185802..e74358f3 100644 --- a/root/package/kernel/linux/modules/netfilter.mk +++ b/root/package/kernel/linux/modules/netfilter.mk @@ -1177,3 +1177,14 @@ define KernelPackage/nft-queue endef $(eval $(call KernelPackage,nft-queue)) + +define KernelPackage/nft-compat + SUBMENU:=$(NF_MENU) + TITLE:=Netfilter nf_tables compat support + DEPENDS:=+kmod-nft-core +kmod-nf-ipt + FILES:=$(foreach mod,$(NFT_COMPAT-m),$(LINUX_DIR)/net/$(mod).ko) + AUTOLOAD:=$(call AutoProbe,$(notdir $(NFT_COMPAT-m))) + KCONFIG:=$(KCONFIG_NFT_COMPAT) +endef + +$(eval $(call KernelPackage,nft-compat)) \ No newline at end of file diff --git a/root/target/linux/generic/config-5.15 b/root/target/linux/generic/config-5.15 index c9c474c0..f5a14233 100644 --- a/root/target/linux/generic/config-5.15 +++ b/root/target/linux/generic/config-5.15 @@ -7451,6 +7451,7 @@ CONFIG_MODULE_COMPRESS_NONE=y CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y # CONFIG_MTD_SPI_NOR_SWP_KEEP is not set # CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE is not set +# CONFIG_MTD_SPLIT_H3C_VFS is not set # CONFIG_MTK_DEVAPC is not set # CONFIG_MULTIPLEXER is not set # CONFIG_MUX_ADG792A is not set @@ -7473,6 +7474,7 @@ CONFIG_NET_SOCK_MSG=y # CONFIG_NTFS3_FS is not set # CONFIG_NTFS3_FS_POSIX_ACL is not set # CONFIG_NTFS3_LZX_XPRESS is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set # CONFIG_OID_REGISTRY is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_PCIE_MEDIATEK_GEN3 is not set @@ -7587,6 +7589,7 @@ CONFIG_SERIAL_8250_16550A_VARIANTS=y # CONFIG_VIDEO_OV9282 is not set # CONFIG_VMLINUX_MAP is not set # CONFIG_WERROR is not set +# CONFIG_WWAN_HWSIM is not set # CONFIG_ZERO_CALL_USED_REGS is not set # CONFIG_ZRAM_DEF_COMP_LZORLE is not set # CONFIG_ZRAM_DEF_COMP_ZSTD is not set \ No newline at end of file From e0b396e68ce2ee1de2283d56eb178d9335a73975 Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 15 Sep 2022 09:08:29 +0200 Subject: [PATCH 5/7] Update MPTCP --- .../generic/hack-5.4/690-mptcp_v0.96.patch | 933 ++++++++---------- 1 file changed, 425 insertions(+), 508 deletions(-) diff --git a/root/target/linux/generic/hack-5.4/690-mptcp_v0.96.patch b/root/target/linux/generic/hack-5.4/690-mptcp_v0.96.patch index 03490aaa..e5b44dd0 100644 --- a/root/target/linux/generic/hack-5.4/690-mptcp_v0.96.patch +++ b/root/target/linux/generic/hack-5.4/690-mptcp_v0.96.patch @@ -14,7 +14,7 @@ index db9d53b879f8..3d859ac99b73 100644 Format: ,,, diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt -index 8af3771a3ebf..e8fecb8f6370 100644 +index 5cf601c94e35..e8ff86e5078b 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt @@ -818,6 +818,18 @@ tcp_rx_skb_cache - BOOLEAN @@ -264,7 +264,7 @@ index 13792c0ef46e..e99cc510610f 100644 /* * Pointers to address related TCP functions diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h -index 34c4436fd18f..828f79528b32 100644 +index 58db7c69c146..1acaa5e45f15 100644 --- a/include/net/inet_sock.h +++ b/include/net/inet_sock.h @@ -79,7 +79,7 @@ struct inet_request_sock { @@ -287,10 +287,10 @@ index 34c4436fd18f..828f79528b32 100644 union { diff --git a/include/net/mptcp.h b/include/net/mptcp.h new file mode 100644 -index 000000000000..630977f67614 +index 000000000000..f2efa46027d0 --- /dev/null +++ b/include/net/mptcp.h -@@ -0,0 +1,1548 @@ +@@ -0,0 +1,1549 @@ +/* + * MPTCP implementation + * @@ -1025,6 +1025,7 @@ index 000000000000..630977f67614 + +#define MPTCP_INC_STATS(net, field) SNMP_INC_STATS((net)->mptcp.mptcp_statistics, field) +#define MPTCP_DEC_STATS(net, field) SNMP_DEC_STATS((net)->mptcp.mptcp_statistics, field) ++#define MPTCP_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mptcp.mptcp_statistics, field, val) + +enum +{ @@ -2097,7 +2098,7 @@ index cb8ced4380a6..0aa0d10af2ce 100644 #define TCP_MIB_MAX __TCP_MIB_MAX struct tcp_mib { diff --git a/include/net/sock.h b/include/net/sock.h -index 7f213cfcb3cc..c1be2daccb54 100644 +index 9d687070d272..4c40e2af33f1 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -821,6 +821,7 @@ enum sock_flags { @@ -2116,8 +2117,39 @@ index 7f213cfcb3cc..c1be2daccb54 100644 /* Keeping track of sockets in use */ #ifdef CONFIG_PROC_FS +@@ -1541,12 +1543,26 @@ static inline void lock_sock(struct sock *sk) + void __release_sock(struct sock *sk); + void release_sock(struct sock *sk); + ++#ifdef CONFIG_MPTCP_DEBUG_LOCK ++extern void mptcp_check_lock(struct sock* sk); ++#endif ++static inline void lock_sock_check_mptcp(struct sock* sk) ++{ ++#ifdef CONFIG_MPTCP_DEBUG_LOCK ++ if (sk && sk->sk_type == SOCK_STREAM && sk->sk_protocol == IPPROTO_TCP) ++ mptcp_check_lock(sk); ++#endif ++} ++ + /* BH context may only use the following locking interface. */ +-#define bh_lock_sock(__sk) spin_lock(&((__sk)->sk_lock.slock)) +-#define bh_lock_sock_nested(__sk) \ ++#define bh_lock_sock(__sk) do { lock_sock_check_mptcp(__sk); \ ++ spin_lock(&((__sk)->sk_lock.slock)); } while (0) ++#define bh_lock_sock_nested(__sk) do { \ ++ lock_sock_check_mptcp(__sk); \ + spin_lock_nested(&((__sk)->sk_lock.slock), \ +- SINGLE_DEPTH_NESTING) +-#define bh_unlock_sock(__sk) spin_unlock(&((__sk)->sk_lock.slock)) ++ SINGLE_DEPTH_NESTING); } while (0) ++#define bh_unlock_sock(__sk) do { lock_sock_check_mptcp(__sk); \ ++ spin_unlock(&((__sk)->sk_lock.slock)); } while (0) + + bool lock_sock_fast(struct sock *sk); + /** diff --git a/include/net/tcp.h b/include/net/tcp.h -index 65be8bd1f0f4..cf89f928640e 100644 +index 8459145497b7..c1b90862e3cc 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -182,6 +182,7 @@ @@ -2160,7 +2192,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 /* sysctl variables for tcp */ extern int sysctl_tcp_max_orphans; -@@ -310,6 +336,98 @@ static inline bool tcp_too_many_orphans(struct sock *sk, int shift) +@@ -310,6 +336,96 @@ static inline bool tcp_too_many_orphans(struct sock *sk, int shift) #define TCP_DEC_STATS(net, field) SNMP_DEC_STATS((net)->mib.tcp_statistics, field) #define TCP_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mib.tcp_statistics, field, val) @@ -2237,8 +2269,6 @@ index 65be8bd1f0f4..cf89f928640e 100644 +u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb); +void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb, u32 prior_snd_una); + -+/* void skb_clone_fraglist(struct sk_buff *skb); */ -+ +void inet_twsk_free(struct inet_timewait_sock *tw); +int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb); +/* These states need RST on ABORT according to RFC793 */ @@ -2259,7 +2289,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 void tcp_tasklet_init(void); int tcp_v4_err(struct sk_buff *skb, u32); -@@ -411,7 +529,9 @@ int tcp_mmap(struct file *file, struct socket *sock, +@@ -411,7 +527,9 @@ int tcp_mmap(struct file *file, struct socket *sock, #endif void tcp_parse_options(const struct net *net, const struct sk_buff *skb, struct tcp_options_received *opt_rx, @@ -2270,7 +2300,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 const u8 *tcp_parse_md5sig_option(const struct tcphdr *th); /* -@@ -430,6 +550,7 @@ u16 tcp_get_syncookie_mss(struct request_sock_ops *rsk_ops, +@@ -430,6 +548,7 @@ u16 tcp_get_syncookie_mss(struct request_sock_ops *rsk_ops, void tcp_v4_send_check(struct sock *sk, struct sk_buff *skb); void tcp_v4_mtu_reduced(struct sock *sk); @@ -2278,7 +2308,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 void tcp_req_err(struct sock *sk, u32 seq, bool abort); int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb); struct sock *tcp_create_openreq_child(const struct sock *sk, -@@ -453,6 +574,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, +@@ -453,6 +572,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, struct request_sock *req, struct tcp_fastopen_cookie *foc, enum tcp_synack_type synack_type); @@ -2286,7 +2316,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 int tcp_disconnect(struct sock *sk, int flags); void tcp_finish_connect(struct sock *sk, struct sk_buff *skb); -@@ -462,6 +584,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, +@@ -462,6 +582,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, /* From syncookies.c */ struct sock *tcp_get_cookie_sock(struct sock *sk, struct sk_buff *skb, struct request_sock *req, @@ -2294,7 +2324,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 struct dst_entry *dst, u32 tsoff); int __cookie_v4_check(const struct iphdr *iph, const struct tcphdr *th, u32 cookie); -@@ -547,7 +670,8 @@ static inline u32 tcp_cookie_time(void) +@@ -547,7 +668,8 @@ static inline u32 tcp_cookie_time(void) u32 __cookie_v4_init_sequence(const struct iphdr *iph, const struct tcphdr *th, u16 *mssp); @@ -2304,7 +2334,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 u64 cookie_init_timestamp(struct request_sock *req); bool cookie_timestamp_decode(const struct net *net, struct tcp_options_received *opt); -@@ -561,7 +685,8 @@ int __cookie_v6_check(const struct ipv6hdr *iph, const struct tcphdr *th, +@@ -561,7 +683,8 @@ int __cookie_v6_check(const struct ipv6hdr *iph, const struct tcphdr *th, u32 __cookie_v6_init_sequence(const struct ipv6hdr *iph, const struct tcphdr *th, u16 *mssp); @@ -2314,7 +2344,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 #endif /* tcp_output.c */ -@@ -597,10 +722,16 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, +@@ -597,10 +720,16 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, void tcp_skb_collapse_tstamp(struct sk_buff *skb, const struct sk_buff *next_skb); @@ -2331,7 +2361,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb); void tcp_fin(struct sock *sk); void tcp_check_space(struct sock *sk); -@@ -646,7 +777,7 @@ static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize) +@@ -646,7 +775,7 @@ static inline int tcp_bound_to_half_wnd(struct tcp_sock *tp, int pktsize) } /* tcp.c */ @@ -2340,7 +2370,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 /* Read 'sendfile()'-style from a TCP socket */ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, -@@ -724,7 +855,7 @@ static inline u32 tcp_min_rtt(const struct tcp_sock *tp) +@@ -724,7 +853,7 @@ static inline u32 tcp_min_rtt(const struct tcp_sock *tp) * Rcv_nxt can be after the window if our peer push more data * than the offered window. */ @@ -2349,7 +2379,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 { s32 win = tp->rcv_wup + tp->rcv_wnd - tp->rcv_nxt; -@@ -733,6 +864,32 @@ static inline u32 tcp_receive_window(const struct tcp_sock *tp) +@@ -733,6 +862,32 @@ static inline u32 tcp_receive_window(const struct tcp_sock *tp) return (u32) win; } @@ -2382,7 +2412,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 /* Choose a new window, without checks for shrinking, and without * scaling applied to the result. The caller does these things * if necessary. This is a "raw" window selection. -@@ -830,6 +987,12 @@ struct tcp_skb_cb { +@@ -830,6 +985,12 @@ struct tcp_skb_cb { u16 tcp_gso_size; }; }; @@ -2395,7 +2425,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 __u8 tcp_flags; /* TCP header flags. (tcp[13]) */ __u8 sacked; /* State flags for SACK. */ -@@ -848,6 +1011,14 @@ struct tcp_skb_cb { +@@ -848,6 +1009,14 @@ struct tcp_skb_cb { has_rxtstamp:1, /* SKB has a RX timestamp */ unused:5; __u32 ack_seq; /* Sequence number ACK'd */ @@ -2410,7 +2440,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 union { struct { /* There is space for up to 24 bytes */ -@@ -1090,6 +1261,8 @@ struct tcp_congestion_ops { +@@ -1090,6 +1259,8 @@ struct tcp_congestion_ops { int tcp_set_allowed_congestion_control(char *allowed); int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit, bool cap_net_admin); @@ -2419,7 +2449,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); -@@ -1396,6 +1569,19 @@ static inline int tcp_win_from_space(const struct sock *sk, int space) +@@ -1396,6 +1567,19 @@ static inline int tcp_win_from_space(const struct sock *sk, int space) space - (space>>tcp_adv_win_scale); } @@ -2439,7 +2469,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 /* Note: caller must be prepared to deal with negative returns */ static inline int tcp_space(const struct sock *sk) { -@@ -1988,6 +2174,30 @@ struct tcp_sock_af_ops { +@@ -1989,6 +2173,30 @@ struct tcp_sock_af_ops { #endif }; @@ -2470,7 +2500,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 struct tcp_request_sock_ops { u16 mss_clamp; #ifdef CONFIG_TCP_MD5SIG -@@ -1998,12 +2208,13 @@ struct tcp_request_sock_ops { +@@ -1999,12 +2207,13 @@ struct tcp_request_sock_ops { const struct sock *sk, const struct sk_buff *skb); #endif @@ -2489,7 +2519,7 @@ index 65be8bd1f0f4..cf89f928640e 100644 #endif struct dst_entry *(*route_req)(const struct sock *sk, struct flowi *fl, const struct request_sock *req); -@@ -2022,15 +2233,17 @@ struct tcp_request_sock_ops { +@@ -2023,15 +2232,17 @@ struct tcp_request_sock_ops { #ifdef CONFIG_SYN_COOKIES static inline __u32 cookie_init_sequence(const struct tcp_request_sock_ops *ops, @@ -2916,7 +2946,7 @@ index a03036456221..aebb337662c3 100644 IFF_ALLMULTI)); diff --git a/net/core/filter.c b/net/core/filter.c -index eba96343c7af..c84249eec838 100644 +index 72bf78032f45..b96c3c126b7c 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -73,6 +73,7 @@ @@ -3173,7 +3203,7 @@ index a926de2e42b5..6d73dc6e2586 100644 default "dctcp" if DEFAULT_DCTCP default "cdg" if DEFAULT_CDG diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c -index a7a6b1adb698..e1ccbe866a90 100644 +index d61ca7be6eda..8e474fe9dfd8 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -100,6 +100,7 @@ @@ -3239,7 +3269,7 @@ index a7a6b1adb698..e1ccbe866a90 100644 tcp_init(); diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c -index 6cbf0db57ad0..1d70d8f22075 100644 +index 6cbf0db57ad0..be95a4b0ffa2 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -19,6 +19,7 @@ @@ -3273,7 +3303,22 @@ index 6cbf0db57ad0..1d70d8f22075 100644 if (newsk) { struct inet_connection_sock *newicsk = inet_csk(newsk); -@@ -1019,7 +1025,14 @@ void inet_csk_listen_stop(struct sock *sk) +@@ -966,6 +972,14 @@ struct sock *inet_csk_reqsk_queue_add(struct sock *sk, + + spin_lock(&queue->rskq_lock); + if (unlikely(sk->sk_state != TCP_LISTEN)) { ++ struct tcp_sock *tp = tcp_sk(sk); ++ ++ /* in case of mptcp, two locks may been taken, one ++ * on the meta, the other on master_sk ++ */ ++ if (mptcp(tp) && tp->mpcb && tp->mpcb->master_sk) ++ bh_unlock_sock(tp->mpcb->master_sk); ++ + inet_child_forget(sk, req, child); + child = NULL; + } else { +@@ -1019,7 +1033,14 @@ void inet_csk_listen_stop(struct sock *sk) */ while ((req = reqsk_queue_remove(queue, sk)) != NULL) { struct sock *child = req->sk; @@ -3288,7 +3333,7 @@ index 6cbf0db57ad0..1d70d8f22075 100644 local_bh_disable(); bh_lock_sock(child); WARN_ON(sock_owned_by_user(child)); -@@ -1029,6 +1042,10 @@ void inet_csk_listen_stop(struct sock *sk) +@@ -1029,6 +1050,10 @@ void inet_csk_listen_stop(struct sock *sk) reqsk_put(req); bh_unlock_sock(child); local_bh_enable(); @@ -3343,7 +3388,7 @@ index aa3fd61818c4..8b3e955ec165 100644 break; case IP_TTL: diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c -index 6811174ad518..1de2196515ea 100644 +index 3f6c9514c7a9..9dc0cff27ad8 100644 --- a/net/ipv4/syncookies.c +++ b/net/ipv4/syncookies.c @@ -12,6 +12,8 @@ @@ -3409,7 +3454,7 @@ index 6811174ad518..1de2196515ea 100644 struct inet_request_sock *ireq; struct tcp_request_sock *treq; struct tcp_sock *tp = tcp_sk(sk); -@@ -313,7 +338,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) +@@ -314,7 +339,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) /* check for timestamp cookie support */ memset(&tcp_opt, 0, sizeof(tcp_opt)); @@ -3419,7 +3464,7 @@ index 6811174ad518..1de2196515ea 100644 if (tcp_opt.saw_tstamp && tcp_opt.rcv_tsecr) { tsoff = secure_tcp_ts_off(sock_net(sk), -@@ -326,7 +352,12 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) +@@ -327,7 +353,12 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) goto out; ret = NULL; @@ -3433,7 +3478,7 @@ index 6811174ad518..1de2196515ea 100644 if (!req) goto out; -@@ -347,6 +378,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) +@@ -348,6 +379,8 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) ireq->sack_ok = tcp_opt.sack_ok; ireq->wscale_ok = tcp_opt.wscale_ok; ireq->tstamp_ok = tcp_opt.saw_tstamp; @@ -3442,7 +3487,7 @@ index 6811174ad518..1de2196515ea 100644 req->ts_recent = tcp_opt.saw_tstamp ? tcp_opt.rcv_tsval : 0; treq->snt_synack = 0; treq->tfo_listener = false; -@@ -355,6 +388,9 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) +@@ -356,6 +389,9 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) ireq->ir_iif = inet_request_bound_dev_if(sk, skb); @@ -3452,7 +3497,7 @@ index 6811174ad518..1de2196515ea 100644 /* We throwed the options of the initial SYN away, so we hope * the ACK carries the same options again (see RFC1122 4.2.3.8) */ -@@ -393,15 +429,15 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) +@@ -394,15 +430,15 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb) (req->rsk_window_clamp > full_space || req->rsk_window_clamp == 0)) req->rsk_window_clamp = full_space; @@ -3474,7 +3519,7 @@ index 6811174ad518..1de2196515ea 100644 * Normal sockets get it right from inet_csk_route_child_sock() */ diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c -index 4815cf72569e..61469ec77734 100644 +index 0a570d5d0b38..99ca3c55eb19 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -270,6 +270,7 @@ @@ -3627,7 +3672,7 @@ index 4815cf72569e..61469ec77734 100644 return sock_no_sendpage_locked(sk, page, offset, size, flags); tcp_rate_check_app_limited(sk); /* is sending application-limited? */ -@@ -1231,12 +1292,21 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) +@@ -1232,12 +1293,21 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) * is fully established. */ if (((1 << sk->sk_state) & ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) && @@ -3650,7 +3695,7 @@ index 4815cf72569e..61469ec77734 100644 if (unlikely(tp->repair)) { if (tp->repair_queue == TCP_RECV_QUEUE) { copied = tcp_send_rcvq(sk, msg, size); -@@ -1529,7 +1599,7 @@ static int tcp_peek_sndq(struct sock *sk, struct msghdr *msg, int len) +@@ -1530,7 +1600,7 @@ static int tcp_peek_sndq(struct sock *sk, struct msghdr *msg, int len) * calculation of whether or not we must ACK for the sake of * a window update. */ @@ -3659,7 +3704,7 @@ index 4815cf72569e..61469ec77734 100644 { struct tcp_sock *tp = tcp_sk(sk); bool time_to_ack = false; -@@ -1568,11 +1638,11 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied) +@@ -1569,11 +1639,11 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied) * in states, where we will not receive more. It is useless. */ if (copied > 0 && !time_to_ack && !(sk->sk_shutdown & RCV_SHUTDOWN)) { @@ -3673,7 +3718,7 @@ index 4815cf72569e..61469ec77734 100644 /* Send ACK now, if this read freed lots of space * in our buffer. Certainly, new_window is new window. -@@ -1690,7 +1760,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, +@@ -1691,7 +1761,7 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc, /* Clean up data we have read: This will do ACK frames. */ if (copied > 0) { tcp_recv_skb(sk, seq, &offset); @@ -3682,7 +3727,7 @@ index 4815cf72569e..61469ec77734 100644 } return copied; } -@@ -1981,6 +2051,16 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, +@@ -1982,6 +2052,16 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, lock_sock(sk); @@ -3699,7 +3744,7 @@ index 4815cf72569e..61469ec77734 100644 err = -ENOTCONN; if (sk->sk_state == TCP_LISTEN) goto out; -@@ -2099,7 +2179,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, +@@ -2100,7 +2180,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, } } @@ -3708,7 +3753,7 @@ index 4815cf72569e..61469ec77734 100644 if (copied >= target) { /* Do not sleep, just process backlog. */ -@@ -2191,7 +2271,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, +@@ -2192,7 +2272,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, */ /* Clean up data we have read: This will do ACK frames. */ @@ -3717,7 +3762,7 @@ index 4815cf72569e..61469ec77734 100644 release_sock(sk); -@@ -2250,8 +2330,11 @@ void tcp_set_state(struct sock *sk, int state) +@@ -2251,8 +2331,11 @@ void tcp_set_state(struct sock *sk, int state) switch (state) { case TCP_ESTABLISHED: @@ -3730,7 +3775,7 @@ index 4815cf72569e..61469ec77734 100644 break; case TCP_CLOSE: -@@ -2264,8 +2347,11 @@ void tcp_set_state(struct sock *sk, int state) +@@ -2265,8 +2348,11 @@ void tcp_set_state(struct sock *sk, int state) inet_put_port(sk); /* fall through */ default: @@ -3743,7 +3788,7 @@ index 4815cf72569e..61469ec77734 100644 } /* Change state AFTER socket is unhashed to avoid closed -@@ -2297,9 +2383,10 @@ void tcp_set_state(struct sock *sk, int state) +@@ -2298,9 +2384,10 @@ void tcp_set_state(struct sock *sk, int state) [TCP_LISTEN] = TCP_CLOSE, [TCP_CLOSING] = TCP_CLOSING, [TCP_NEW_SYN_RECV] = TCP_CLOSE, /* should not happen ! */ @@ -3755,7 +3800,7 @@ index 4815cf72569e..61469ec77734 100644 { int next = (int)new_state[sk->sk_state]; int ns = next & TCP_STATE_MASK; -@@ -2329,7 +2416,7 @@ void tcp_shutdown(struct sock *sk, int how) +@@ -2330,7 +2417,7 @@ void tcp_shutdown(struct sock *sk, int how) TCPF_SYN_RECV | TCPF_CLOSE_WAIT)) { /* Clear out any half completed packets. FIN if needed. */ if (tcp_close_state(sk)) @@ -3764,7 +3809,7 @@ index 4815cf72569e..61469ec77734 100644 } } EXPORT_SYMBOL(tcp_shutdown); -@@ -2354,6 +2441,17 @@ void tcp_close(struct sock *sk, long timeout) +@@ -2355,6 +2442,17 @@ void tcp_close(struct sock *sk, long timeout) int data_was_unread = 0; int state; @@ -3782,7 +3827,7 @@ index 4815cf72569e..61469ec77734 100644 lock_sock(sk); sk->sk_shutdown = SHUTDOWN_MASK; -@@ -2398,7 +2496,7 @@ void tcp_close(struct sock *sk, long timeout) +@@ -2399,7 +2497,7 @@ void tcp_close(struct sock *sk, long timeout) /* Unread data was tossed, zap the connection. */ NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONCLOSE); tcp_set_state(sk, TCP_CLOSE); @@ -3791,7 +3836,7 @@ index 4815cf72569e..61469ec77734 100644 } else if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { /* Check zero linger _after_ checking for unread data. */ sk->sk_prot->disconnect(sk, 0); -@@ -2472,7 +2570,7 @@ void tcp_close(struct sock *sk, long timeout) +@@ -2473,7 +2571,7 @@ void tcp_close(struct sock *sk, long timeout) struct tcp_sock *tp = tcp_sk(sk); if (tp->linger2 < 0) { tcp_set_state(sk, TCP_CLOSE); @@ -3800,7 +3845,7 @@ index 4815cf72569e..61469ec77734 100644 __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONLINGER); } else { -@@ -2482,7 +2580,8 @@ void tcp_close(struct sock *sk, long timeout) +@@ -2483,7 +2581,8 @@ void tcp_close(struct sock *sk, long timeout) inet_csk_reset_keepalive_timer(sk, tmo - TCP_TIMEWAIT_LEN); } else { @@ -3810,7 +3855,7 @@ index 4815cf72569e..61469ec77734 100644 goto out; } } -@@ -2491,7 +2590,7 @@ void tcp_close(struct sock *sk, long timeout) +@@ -2492,7 +2591,7 @@ void tcp_close(struct sock *sk, long timeout) sk_mem_reclaim(sk); if (tcp_check_oom(sk, 0)) { tcp_set_state(sk, TCP_CLOSE); @@ -3819,7 +3864,7 @@ index 4815cf72569e..61469ec77734 100644 __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONMEMORY); } else if (!check_net(sock_net(sk))) { -@@ -2523,15 +2622,6 @@ void tcp_close(struct sock *sk, long timeout) +@@ -2524,15 +2623,6 @@ void tcp_close(struct sock *sk, long timeout) } EXPORT_SYMBOL(tcp_close); @@ -3835,7 +3880,7 @@ index 4815cf72569e..61469ec77734 100644 static void tcp_rtx_queue_purge(struct sock *sk) { struct rb_node *p = rb_first(&sk->tcp_rtx_queue); -@@ -2553,6 +2643,10 @@ void tcp_write_queue_purge(struct sock *sk) +@@ -2554,6 +2644,10 @@ void tcp_write_queue_purge(struct sock *sk) { struct sk_buff *skb; @@ -3846,7 +3891,7 @@ index 4815cf72569e..61469ec77734 100644 tcp_chrono_stop(sk, TCP_CHRONO_BUSY); while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL) { tcp_skb_tsorted_anchor_cleanup(skb); -@@ -2571,6 +2665,36 @@ void tcp_write_queue_purge(struct sock *sk) +@@ -2572,6 +2666,36 @@ void tcp_write_queue_purge(struct sock *sk) inet_csk(sk)->icsk_backoff = 0; } @@ -3883,7 +3928,7 @@ index 4815cf72569e..61469ec77734 100644 int tcp_disconnect(struct sock *sk, int flags) { struct inet_sock *inet = inet_sk(sk); -@@ -2593,7 +2717,7 @@ int tcp_disconnect(struct sock *sk, int flags) +@@ -2594,7 +2718,7 @@ int tcp_disconnect(struct sock *sk, int flags) /* The last check adjusts for discrepancy of Linux wrt. RFC * states */ @@ -3892,7 +3937,7 @@ index 4815cf72569e..61469ec77734 100644 sk->sk_err = ECONNRESET; } else if (old_state == TCP_SYN_SENT) sk->sk_err = ECONNRESET; -@@ -2615,11 +2739,16 @@ int tcp_disconnect(struct sock *sk, int flags) +@@ -2616,11 +2740,16 @@ int tcp_disconnect(struct sock *sk, int flags) if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK)) inet_reset_saddr(sk); @@ -3912,7 +3957,7 @@ index 4815cf72569e..61469ec77734 100644 seq = tp->write_seq + tp->max_window + 2; if (!seq) -@@ -2629,21 +2758,14 @@ int tcp_disconnect(struct sock *sk, int flags) +@@ -2630,21 +2759,14 @@ int tcp_disconnect(struct sock *sk, int flags) icsk->icsk_backoff = 0; tp->snd_cwnd = 2; icsk->icsk_probes_out = 0; @@ -3937,7 +3982,7 @@ index 4815cf72569e..61469ec77734 100644 inet_csk_delack_init(sk); /* Initialize rcv_mss to TCP_MIN_MSS to avoid division by 0 * issue in __tcp_select_window() -@@ -2655,14 +2777,6 @@ int tcp_disconnect(struct sock *sk, int flags) +@@ -2656,14 +2778,6 @@ int tcp_disconnect(struct sock *sk, int flags) sk->sk_rx_dst = NULL; tcp_saved_syn_free(tp); tp->compressed_ack = 0; @@ -3952,7 +3997,7 @@ index 4815cf72569e..61469ec77734 100644 tp->duplicate_sack[0].start_seq = 0; tp->duplicate_sack[0].end_seq = 0; tp->dsack_dups = 0; -@@ -2671,8 +2785,6 @@ int tcp_disconnect(struct sock *sk, int flags) +@@ -2672,8 +2786,6 @@ int tcp_disconnect(struct sock *sk, int flags) tp->sacked_out = 0; tp->tlp_high_seq = 0; tp->last_oow_ack_time = 0; @@ -3961,7 +4006,7 @@ index 4815cf72569e..61469ec77734 100644 tp->rack.mstamp = 0; tp->rack.advanced = 0; tp->rack.reo_wnd_steps = 1; -@@ -2706,7 +2818,7 @@ int tcp_disconnect(struct sock *sk, int flags) +@@ -2707,7 +2819,7 @@ int tcp_disconnect(struct sock *sk, int flags) static inline bool tcp_can_repair_sock(const struct sock *sk) { return ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN) && @@ -3970,7 +4015,7 @@ index 4815cf72569e..61469ec77734 100644 } static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int len) -@@ -2737,6 +2849,7 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l +@@ -2738,6 +2850,7 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l tp->rcv_wnd = opt.rcv_wnd; tp->rcv_wup = opt.rcv_wup; @@ -3978,7 +4023,7 @@ index 4815cf72569e..61469ec77734 100644 return 0; } -@@ -2875,6 +2988,61 @@ static int do_tcp_setsockopt(struct sock *sk, int level, +@@ -2876,6 +2989,61 @@ static int do_tcp_setsockopt(struct sock *sk, int level, return tcp_fastopen_reset_cipher(net, sk, key, backup_key); } @@ -4040,7 +4085,7 @@ index 4815cf72569e..61469ec77734 100644 default: /* fallthru */ break; -@@ -3064,6 +3232,12 @@ static int do_tcp_setsockopt(struct sock *sk, int level, +@@ -3065,6 +3233,12 @@ static int do_tcp_setsockopt(struct sock *sk, int level, break; case TCP_DEFER_ACCEPT: @@ -4053,7 +4098,7 @@ index 4815cf72569e..61469ec77734 100644 /* Translate value in seconds to number of retransmits */ icsk->icsk_accept_queue.rskq_defer_accept = secs_to_retrans(val, TCP_TIMEOUT_INIT / HZ, -@@ -3091,7 +3265,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, +@@ -3092,7 +3266,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT) && inet_csk_ack_scheduled(sk)) { icsk->icsk_ack.pending |= ICSK_ACK_PUSHED; @@ -4062,7 +4107,7 @@ index 4815cf72569e..61469ec77734 100644 if (!(val & 1)) inet_csk_enter_pingpong_mode(sk); } -@@ -3101,7 +3275,10 @@ static int do_tcp_setsockopt(struct sock *sk, int level, +@@ -3102,7 +3276,10 @@ static int do_tcp_setsockopt(struct sock *sk, int level, #ifdef CONFIG_TCP_MD5SIG case TCP_MD5SIG: case TCP_MD5SIG_EXT: @@ -4074,7 +4119,7 @@ index 4815cf72569e..61469ec77734 100644 break; #endif case TCP_USER_TIMEOUT: -@@ -3157,6 +3334,33 @@ static int do_tcp_setsockopt(struct sock *sk, int level, +@@ -3159,6 +3336,33 @@ static int do_tcp_setsockopt(struct sock *sk, int level, tp->notsent_lowat = val; sk->sk_write_space(sk); break; @@ -4108,7 +4153,7 @@ index 4815cf72569e..61469ec77734 100644 case TCP_INQ: if (val > 1 || val < 0) err = -EINVAL; -@@ -3221,7 +3425,7 @@ static void tcp_get_info_chrono_stats(const struct tcp_sock *tp, +@@ -3223,7 +3427,7 @@ static void tcp_get_info_chrono_stats(const struct tcp_sock *tp, } /* Return information about state of tcp endpoint in API format. */ @@ -4117,7 +4162,7 @@ index 4815cf72569e..61469ec77734 100644 { const struct tcp_sock *tp = tcp_sk(sk); /* iff sk_type == SOCK_STREAM */ const struct inet_connection_sock *icsk = inet_csk(sk); -@@ -3258,7 +3462,8 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) +@@ -3260,7 +3464,8 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) return; } @@ -4127,7 +4172,7 @@ index 4815cf72569e..61469ec77734 100644 info->tcpi_ca_state = icsk->icsk_ca_state; info->tcpi_retransmits = icsk->icsk_retransmits; -@@ -3334,7 +3539,9 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) +@@ -3336,7 +3541,9 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info) info->tcpi_reord_seen = tp->reord_seen; info->tcpi_rcv_ooopack = tp->rcv_ooopack; info->tcpi_snd_wnd = tp->snd_wnd; @@ -4138,7 +4183,7 @@ index 4815cf72569e..61469ec77734 100644 } EXPORT_SYMBOL_GPL(tcp_get_info); -@@ -3481,7 +3688,7 @@ static int do_tcp_getsockopt(struct sock *sk, int level, +@@ -3483,7 +3690,7 @@ static int do_tcp_getsockopt(struct sock *sk, int level, if (get_user(len, optlen)) return -EFAULT; @@ -4147,7 +4192,7 @@ index 4815cf72569e..61469ec77734 100644 len = min_t(unsigned int, len, sizeof(info)); if (put_user(len, optlen)) -@@ -3670,6 +3877,87 @@ static int do_tcp_getsockopt(struct sock *sk, int level, +@@ -3672,6 +3879,87 @@ static int do_tcp_getsockopt(struct sock *sk, int level, } return 0; } @@ -4235,7 +4280,7 @@ index 4815cf72569e..61469ec77734 100644 #ifdef CONFIG_MMU case TCP_ZEROCOPY_RECEIVE: { struct tcp_zerocopy_receive zc; -@@ -3875,7 +4163,9 @@ void tcp_done(struct sock *sk) +@@ -3877,7 +4165,9 @@ void tcp_done(struct sock *sk) if (sk->sk_state == TCP_SYN_SENT || sk->sk_state == TCP_SYN_RECV) TCP_INC_STATS(sock_net(sk), TCP_MIB_ATTEMPTFAILS); @@ -4245,7 +4290,7 @@ index 4815cf72569e..61469ec77734 100644 tcp_clear_xmit_timers(sk); if (req) reqsk_fastopen_remove(sk, req, false); -@@ -3891,6 +4181,8 @@ void tcp_done(struct sock *sk) +@@ -3893,6 +4183,8 @@ void tcp_done(struct sock *sk) int tcp_abort(struct sock *sk, int err) { @@ -4254,7 +4299,7 @@ index 4815cf72569e..61469ec77734 100644 if (!sk_fullsock(sk)) { if (sk->sk_state == TCP_NEW_SYN_RECV) { struct request_sock *req = inet_reqsk(sk); -@@ -3904,7 +4196,7 @@ int tcp_abort(struct sock *sk, int err) +@@ -3906,7 +4198,7 @@ int tcp_abort(struct sock *sk, int err) } /* Don't race with userspace socket closes such as tcp_close. */ @@ -4263,7 +4308,7 @@ index 4815cf72569e..61469ec77734 100644 if (sk->sk_state == TCP_LISTEN) { tcp_set_state(sk, TCP_CLOSE); -@@ -3913,7 +4205,7 @@ int tcp_abort(struct sock *sk, int err) +@@ -3915,7 +4207,7 @@ int tcp_abort(struct sock *sk, int err) /* Don't race with BH socket closes such as inet_csk_listen_stop. */ local_bh_disable(); @@ -4272,7 +4317,7 @@ index 4815cf72569e..61469ec77734 100644 if (!sock_flag(sk, SOCK_DEAD)) { sk->sk_err = err; -@@ -3921,14 +4213,14 @@ int tcp_abort(struct sock *sk, int err) +@@ -3923,14 +4215,14 @@ int tcp_abort(struct sock *sk, int err) smp_wmb(); sk->sk_error_report(sk); if (tcp_need_reset(sk->sk_state)) @@ -4330,7 +4375,7 @@ index 549506162dde..e5a530e0b1c5 100644 #ifdef CONFIG_TCP_MD5SIG diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c -index a5ec77a5ad6f..f9fb4a268b9b 100644 +index 21705b2ddaff..8b439c148e2c 100644 --- a/net/ipv4/tcp_fastopen.c +++ b/net/ipv4/tcp_fastopen.c @@ -9,6 +9,7 @@ @@ -4393,7 +4438,7 @@ index a5ec77a5ad6f..f9fb4a268b9b 100644 * and queues the child into listener accept queue. */ diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c -index 0808110451a0..d278b28035ad 100644 +index f4e00ff909da..b31087c02c2d 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -76,35 +76,15 @@ @@ -4537,7 +4582,7 @@ index 0808110451a0..d278b28035ad 100644 /* Normally R but no L won't result in plain S */ if (!dup_sack && (TCP_SKB_CB(skb)->sacked & (TCPCB_LOST|TCPCB_SACKED_RETRANS)) == TCPCB_SACKED_RETRANS) -@@ -2965,7 +2972,7 @@ static bool tcp_ack_update_rtt(struct sock *sk, const int flag, +@@ -2969,7 +2976,7 @@ static bool tcp_ack_update_rtt(struct sock *sk, const int flag, */ tcp_update_rtt_min(sk, ca_rtt_us, flag); tcp_rtt_estimator(sk, seq_rtt_us); @@ -4546,7 +4591,7 @@ index 0808110451a0..d278b28035ad 100644 /* RFC6298: only reset backoff on valid RTT measurement. */ inet_csk(sk)->icsk_backoff = 0; -@@ -3033,7 +3040,7 @@ static void tcp_set_xmit_timer(struct sock *sk) +@@ -3037,7 +3044,7 @@ static void tcp_set_xmit_timer(struct sock *sk) } /* If we get here, the whole TSO packet has not been acked. */ @@ -4555,7 +4600,7 @@ index 0808110451a0..d278b28035ad 100644 { struct tcp_sock *tp = tcp_sk(sk); u32 packets_acked; -@@ -3053,8 +3060,7 @@ static u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb) +@@ -3057,8 +3064,7 @@ static u32 tcp_tso_acked(struct sock *sk, struct sk_buff *skb) return packets_acked; } @@ -4565,7 +4610,7 @@ index 0808110451a0..d278b28035ad 100644 { const struct skb_shared_info *shinfo; -@@ -3159,6 +3165,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, +@@ -3163,6 +3169,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, */ if (likely(!(scb->tcp_flags & TCPHDR_SYN))) { flag |= FLAG_DATA_ACKED; @@ -4574,7 +4619,7 @@ index 0808110451a0..d278b28035ad 100644 } else { flag |= FLAG_SYN_ACKED; tp->retrans_stamp = 0; -@@ -3279,7 +3287,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, +@@ -3283,7 +3291,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, return flag; } @@ -4583,7 +4628,7 @@ index 0808110451a0..d278b28035ad 100644 { struct inet_connection_sock *icsk = inet_csk(sk); struct sk_buff *head = tcp_send_head(sk); -@@ -3353,9 +3361,8 @@ static void tcp_cong_control(struct sock *sk, u32 ack, u32 acked_sacked, +@@ -3358,9 +3366,8 @@ static void tcp_cong_control(struct sock *sk, u32 ack, u32 acked_sacked, /* Check that window update is acceptable. * The function assumes that snd_una<=ack<=snd_next. */ @@ -4595,7 +4640,7 @@ index 0808110451a0..d278b28035ad 100644 { return after(ack, tp->snd_una) || after(ack_seq, tp->snd_wl1) || -@@ -3593,7 +3600,7 @@ static u32 tcp_newly_delivered(struct sock *sk, u32 prior_delivered, int flag) +@@ -3599,7 +3606,7 @@ static u32 tcp_newly_delivered(struct sock *sk, u32 prior_delivered, int flag) } /* This routine deals with incoming acks, but not outgoing ones. */ @@ -4604,7 +4649,7 @@ index 0808110451a0..d278b28035ad 100644 { struct inet_connection_sock *icsk = inet_csk(sk); struct tcp_sock *tp = tcp_sk(sk); -@@ -3716,6 +3723,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) +@@ -3722,6 +3729,14 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) tcp_rack_update_reo_wnd(sk, &rs); @@ -4619,7 +4664,7 @@ index 0808110451a0..d278b28035ad 100644 if (tp->tlp_high_seq) tcp_process_tlp_ack(sk, ack, flag); -@@ -3860,8 +3875,10 @@ static u16 tcp_parse_mss_option(const struct tcphdr *th, u16 user_mss) +@@ -3866,8 +3881,10 @@ static u16 tcp_parse_mss_option(const struct tcphdr *th, u16 user_mss) */ void tcp_parse_options(const struct net *net, const struct sk_buff *skb, @@ -4632,7 +4677,7 @@ index 0808110451a0..d278b28035ad 100644 { const unsigned char *ptr; const struct tcphdr *th = tcp_hdr(skb); -@@ -3947,6 +3964,10 @@ void tcp_parse_options(const struct net *net, +@@ -3953,6 +3970,10 @@ void tcp_parse_options(const struct net *net, */ break; #endif @@ -4643,7 +4688,7 @@ index 0808110451a0..d278b28035ad 100644 case TCPOPT_FASTOPEN: tcp_parse_fastopen_option( opsize - TCPOLEN_FASTOPEN_BASE, -@@ -4014,7 +4035,9 @@ static bool tcp_fast_parse_options(const struct net *net, +@@ -4020,7 +4041,9 @@ static bool tcp_fast_parse_options(const struct net *net, return true; } @@ -4654,7 +4699,7 @@ index 0808110451a0..d278b28035ad 100644 if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr) tp->rx_opt.rcv_tsecr -= tp->tsoffset; -@@ -4124,7 +4147,7 @@ static inline bool tcp_paws_discard(const struct sock *sk, +@@ -4130,7 +4153,7 @@ static inline bool tcp_paws_discard(const struct sock *sk, static inline bool tcp_sequence(const struct tcp_sock *tp, u32 seq, u32 end_seq) { return !before(end_seq, tp->rcv_wup) && @@ -4663,7 +4708,7 @@ index 0808110451a0..d278b28035ad 100644 } /* When we get a reset we do this. */ -@@ -4173,6 +4196,11 @@ void tcp_fin(struct sock *sk) +@@ -4179,6 +4202,11 @@ void tcp_fin(struct sock *sk) { struct tcp_sock *tp = tcp_sk(sk); @@ -4675,7 +4720,7 @@ index 0808110451a0..d278b28035ad 100644 inet_csk_schedule_ack(sk); sk->sk_shutdown |= RCV_SHUTDOWN; -@@ -4183,6 +4211,10 @@ void tcp_fin(struct sock *sk) +@@ -4189,6 +4217,10 @@ void tcp_fin(struct sock *sk) case TCP_ESTABLISHED: /* Move to CLOSE_WAIT */ tcp_set_state(sk, TCP_CLOSE_WAIT); @@ -4686,7 +4731,7 @@ index 0808110451a0..d278b28035ad 100644 inet_csk_enter_pingpong_mode(sk); break; -@@ -4205,9 +4237,16 @@ void tcp_fin(struct sock *sk) +@@ -4211,9 +4243,16 @@ void tcp_fin(struct sock *sk) tcp_set_state(sk, TCP_CLOSING); break; case TCP_FIN_WAIT2: @@ -4704,7 +4749,7 @@ index 0808110451a0..d278b28035ad 100644 break; default: /* Only TCP_LISTEN and TCP_CLOSE are left, in these -@@ -4229,6 +4268,10 @@ void tcp_fin(struct sock *sk) +@@ -4235,6 +4274,10 @@ void tcp_fin(struct sock *sk) if (!sock_flag(sk, SOCK_DEAD)) { sk->sk_state_change(sk); @@ -4715,7 +4760,7 @@ index 0808110451a0..d278b28035ad 100644 /* Do not send POLL_HUP for half duplex close. */ if (sk->sk_shutdown == SHUTDOWN_MASK || sk->sk_state == TCP_CLOSE) -@@ -4443,6 +4486,9 @@ static bool tcp_try_coalesce(struct sock *sk, +@@ -4449,6 +4492,9 @@ static bool tcp_try_coalesce(struct sock *sk, *fragstolen = false; @@ -4725,7 +4770,7 @@ index 0808110451a0..d278b28035ad 100644 /* Its possible this segment overlaps with prior segment in queue */ if (TCP_SKB_CB(from)->seq != TCP_SKB_CB(to)->end_seq) return false; -@@ -4497,7 +4543,7 @@ static void tcp_drop(struct sock *sk, struct sk_buff *skb) +@@ -4503,7 +4549,7 @@ static void tcp_drop(struct sock *sk, struct sk_buff *skb) /* This one checks to see if we can put data from the * out_of_order queue into the receive_queue. */ @@ -4734,7 +4779,7 @@ index 0808110451a0..d278b28035ad 100644 { struct tcp_sock *tp = tcp_sk(sk); __u32 dsack_high = tp->rcv_nxt; -@@ -4520,7 +4566,14 @@ static void tcp_ofo_queue(struct sock *sk) +@@ -4526,7 +4572,14 @@ static void tcp_ofo_queue(struct sock *sk) p = rb_next(p); rb_erase(&skb->rbnode, &tp->out_of_order_queue); @@ -4750,17 +4795,26 @@ index 0808110451a0..d278b28035ad 100644 tcp_drop(sk, skb); continue; } -@@ -4550,6 +4603,9 @@ static void tcp_ofo_queue(struct sock *sk) +@@ -4556,21 +4609,23 @@ static void tcp_ofo_queue(struct sock *sk) static int tcp_try_rmem_schedule(struct sock *sk, struct sk_buff *skb, unsigned int size) { -+ if (mptcp(tcp_sk(sk))) -+ sk = mptcp_meta_sk(sk); +- if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || ++ struct sock *meta_sk = mptcp(tcp_sk(sk)) ? mptcp_meta_sk(sk) : sk; + - if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || ++ if (atomic_read(&meta_sk->sk_rmem_alloc) > meta_sk->sk_rcvbuf || !sk_rmem_schedule(sk, skb, size)) { -@@ -4564,7 +4620,7 @@ static int tcp_try_rmem_schedule(struct sock *sk, struct sk_buff *skb, +- if (tcp_prune_queue(sk) < 0) ++ if (tcp_prune_queue(meta_sk) < 0) + return -1; + + while (!sk_rmem_schedule(sk, skb, size)) { +- if (!tcp_prune_ofo_queue(sk)) ++ if (!tcp_prune_ofo_queue(meta_sk)) + return -1; + } + } return 0; } @@ -4769,7 +4823,7 @@ index 0808110451a0..d278b28035ad 100644 { struct tcp_sock *tp = tcp_sk(sk); struct rb_node **p, *parent; -@@ -4636,7 +4692,8 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) +@@ -4642,7 +4697,8 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) continue; } if (before(seq, TCP_SKB_CB(skb1)->end_seq)) { @@ -4779,7 +4833,7 @@ index 0808110451a0..d278b28035ad 100644 /* All the bits are present. Drop. */ NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPOFOMERGE); -@@ -4683,6 +4740,11 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) +@@ -4689,6 +4745,11 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) end_seq); break; } @@ -4791,7 +4845,7 @@ index 0808110451a0..d278b28035ad 100644 rb_erase(&skb1->rbnode, &tp->out_of_order_queue); tcp_dsack_extend(sk, TCP_SKB_CB(skb1)->seq, TCP_SKB_CB(skb1)->end_seq); -@@ -4694,7 +4756,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) +@@ -4700,7 +4761,7 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) tp->ooo_last_skb = skb; add_sack: @@ -4800,7 +4854,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_sack_new_ofo_skb(sk, seq, end_seq); end: if (skb) { -@@ -4708,8 +4770,8 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) +@@ -4714,8 +4775,8 @@ static void tcp_data_queue_ofo(struct sock *sk, struct sk_buff *skb) } } @@ -4811,7 +4865,7 @@ index 0808110451a0..d278b28035ad 100644 { int eaten; struct sk_buff *tail = skb_peek_tail(&sk->sk_receive_queue); -@@ -4784,7 +4846,8 @@ void tcp_data_ready(struct sock *sk) +@@ -4790,7 +4851,8 @@ void tcp_data_ready(struct sock *sk) if (avail < sk->sk_rcvlowat && !tcp_rmem_pressure(sk) && !sock_flag(sk, SOCK_DONE) && @@ -4821,7 +4875,7 @@ index 0808110451a0..d278b28035ad 100644 return; sk->sk_data_ready(sk); -@@ -4796,10 +4859,14 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +@@ -4802,10 +4864,14 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) bool fragstolen; int eaten; @@ -4837,7 +4891,7 @@ index 0808110451a0..d278b28035ad 100644 skb_dst_drop(skb); __skb_pull(skb, tcp_hdr(skb)->doff * 4); -@@ -4810,7 +4877,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +@@ -4816,7 +4882,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) * Out of sequence packets to the out_of_order_queue. */ if (TCP_SKB_CB(skb)->seq == tp->rcv_nxt) { @@ -4846,7 +4900,7 @@ index 0808110451a0..d278b28035ad 100644 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPZEROWINDOWDROP); goto out_of_window; } -@@ -4826,7 +4893,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +@@ -4832,7 +4898,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) } eaten = tcp_queue_rcv(sk, skb, &fragstolen); @@ -4855,7 +4909,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_event_data_recv(sk, skb); if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) tcp_fin(sk); -@@ -4848,7 +4915,11 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +@@ -4854,7 +4920,11 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) if (eaten > 0) kfree_skb_partial(skb, fragstolen); @@ -4868,7 +4922,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_data_ready(sk); return; } -@@ -4868,7 +4939,8 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +@@ -4874,7 +4944,8 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) } /* Out of window. F.e. zero window probe. */ @@ -4878,7 +4932,7 @@ index 0808110451a0..d278b28035ad 100644 goto out_of_window; if (before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) { -@@ -4878,7 +4950,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) +@@ -4884,7 +4955,7 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) /* If window is closed, drop tail of packet. But after * remembering D-SACK for its head made in previous line. */ @@ -4887,7 +4941,7 @@ index 0808110451a0..d278b28035ad 100644 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPZEROWINDOWDROP); goto out_of_window; } -@@ -5191,7 +5263,7 @@ static int tcp_prune_queue(struct sock *sk) +@@ -5197,7 +5268,7 @@ static int tcp_prune_queue(struct sock *sk) return -1; } @@ -4896,7 +4950,7 @@ index 0808110451a0..d278b28035ad 100644 { const struct tcp_sock *tp = tcp_sk(sk); -@@ -5226,7 +5298,7 @@ static void tcp_new_space(struct sock *sk) +@@ -5232,7 +5303,7 @@ static void tcp_new_space(struct sock *sk) { struct tcp_sock *tp = tcp_sk(sk); @@ -4905,7 +4959,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_sndbuf_expand(sk); tp->snd_cwnd_stamp = tcp_jiffies32; } -@@ -5250,10 +5322,11 @@ void tcp_check_space(struct sock *sk) +@@ -5256,10 +5327,11 @@ void tcp_check_space(struct sock *sk) sock_reset_flag(sk, SOCK_QUEUE_SHRUNK); /* pairs with tcp_poll() */ smp_mb(); @@ -4920,7 +4974,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_chrono_stop(sk, TCP_CHRONO_SNDBUF_LIMITED); } } -@@ -5272,6 +5345,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) +@@ -5278,6 +5350,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) { struct tcp_sock *tp = tcp_sk(sk); unsigned long rtt, delay; @@ -4929,7 +4983,7 @@ index 0808110451a0..d278b28035ad 100644 /* More than one full frame received... */ if (((tp->rcv_nxt - tp->rcv_wup) > inet_csk(sk)->icsk_ack.rcv_mss && -@@ -5280,8 +5355,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) +@@ -5286,8 +5360,8 @@ static void __tcp_ack_snd_check(struct sock *sk, int ofo_possible) * If application uses SO_RCVLOWAT, we want send ack now if * we have not received enough bytes to satisfy the condition. */ @@ -4940,7 +4994,7 @@ index 0808110451a0..d278b28035ad 100644 /* We ACK each frame or... */ tcp_in_quickack_mode(sk) || /* Protocol state mandates a one-time immediate ACK */ -@@ -5416,6 +5491,10 @@ static void tcp_urg(struct sock *sk, struct sk_buff *skb, const struct tcphdr *t +@@ -5423,6 +5497,10 @@ static void tcp_urg(struct sock *sk, struct sk_buff *skb, const struct tcphdr *t { struct tcp_sock *tp = tcp_sk(sk); @@ -4951,7 +5005,7 @@ index 0808110451a0..d278b28035ad 100644 /* Check if we get a new urgent pointer - normally not. */ if (th->urg) tcp_check_urg(sk, th); -@@ -5558,9 +5637,15 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, +@@ -5565,9 +5643,15 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb, goto discard; } @@ -4967,7 +5021,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_drop(sk, skb); return false; } -@@ -5617,6 +5702,10 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb) +@@ -5624,6 +5708,10 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb) tp->rx_opt.saw_tstamp = 0; @@ -4978,7 +5032,7 @@ index 0808110451a0..d278b28035ad 100644 /* pred_flags is 0xS?10 << 16 + snd_wnd * if header_prediction is to be made * 'S' will always be tp->tcp_header_len >> 2 -@@ -5791,7 +5880,7 @@ void tcp_init_transfer(struct sock *sk, int bpf_op) +@@ -5798,7 +5886,7 @@ void tcp_init_transfer(struct sock *sk, int bpf_op) tcp_call_bpf(sk, bpf_op, 0, NULL); tcp_init_congestion_control(sk); @@ -4987,7 +5041,7 @@ index 0808110451a0..d278b28035ad 100644 } void tcp_finish_connect(struct sock *sk, struct sk_buff *skb) -@@ -5828,17 +5917,24 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack, +@@ -5835,17 +5923,24 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack, struct tcp_fastopen_cookie *cookie) { struct tcp_sock *tp = tcp_sk(sk); @@ -5014,7 +5068,7 @@ index 0808110451a0..d278b28035ad 100644 mss = opt.mss_clamp; } -@@ -5862,7 +5958,11 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack, +@@ -5869,7 +5964,11 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack, tcp_fastopen_cache_set(sk, mss, cookie, syn_drop, try_exp); @@ -5027,7 +5081,7 @@ index 0808110451a0..d278b28035ad 100644 skb_rbtree_walk_from(data) { if (__tcp_retransmit_skb(sk, data, 1)) break; -@@ -5917,9 +6017,13 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, +@@ -5924,9 +6023,13 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, struct tcp_sock *tp = tcp_sk(sk); struct tcp_fastopen_cookie foc = { .len = -1 }; int saved_clamp = tp->rx_opt.mss_clamp; @@ -5042,7 +5096,7 @@ index 0808110451a0..d278b28035ad 100644 if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr) tp->rx_opt.rcv_tsecr -= tp->tsoffset; -@@ -5980,11 +6084,41 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, +@@ -5987,11 +6090,41 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, tcp_try_undo_spurious_syn(sk); tcp_ack(sk, skb, FLAG_SLOWPATH); @@ -5084,7 +5138,7 @@ index 0808110451a0..d278b28035ad 100644 /* RFC1323: The window in SYN & SYN/ACK segments is * never scaled. -@@ -6006,6 +6140,11 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, +@@ -6013,6 +6146,11 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, tp->tcp_header_len = sizeof(struct tcphdr); } @@ -5096,7 +5150,7 @@ index 0808110451a0..d278b28035ad 100644 tcp_sync_mss(sk, icsk->icsk_pmtu_cookie); tcp_initialize_rcv_mss(sk); -@@ -6029,9 +6168,12 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, +@@ -6036,9 +6174,12 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, } if (fastopen_fail) return -1; @@ -5111,7 +5165,7 @@ index 0808110451a0..d278b28035ad 100644 /* Save one ACK. Data will be ready after * several ticks, if write_pending is set. * -@@ -6070,6 +6212,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, +@@ -6077,6 +6218,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, tcp_paws_reject(&tp->rx_opt, 0)) goto discard_and_undo; @@ -5119,7 +5173,7 @@ index 0808110451a0..d278b28035ad 100644 if (th->syn) { /* We see SYN without ACK. It is attempt of * simultaneous connect with crossed SYNs. -@@ -6086,9 +6229,15 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, +@@ -6093,9 +6235,15 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, tp->tcp_header_len = sizeof(struct tcphdr); } @@ -5135,7 +5189,7 @@ index 0808110451a0..d278b28035ad 100644 /* RFC1323: The window in SYN & SYN/ACK segments is * never scaled. -@@ -6176,6 +6325,7 @@ static void tcp_rcv_synrecv_state_fastopen(struct sock *sk) +@@ -6183,6 +6331,7 @@ static void tcp_rcv_synrecv_state_fastopen(struct sock *sk) */ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) @@ -5143,7 +5197,7 @@ index 0808110451a0..d278b28035ad 100644 { struct tcp_sock *tp = tcp_sk(sk); struct inet_connection_sock *icsk = inet_csk(sk); -@@ -6218,6 +6368,16 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6225,6 +6374,16 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) tp->rx_opt.saw_tstamp = 0; tcp_mstamp_refresh(tp); queued = tcp_rcv_synsent_state_process(sk, skb, th); @@ -5160,7 +5214,7 @@ index 0808110451a0..d278b28035ad 100644 if (queued >= 0) return queued; -@@ -6290,6 +6450,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6297,6 +6456,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) if (tp->rx_opt.tstamp_ok) tp->advmss -= TCPOLEN_TSTAMP_ALIGNED; @@ -5169,7 +5223,7 @@ index 0808110451a0..d278b28035ad 100644 if (!inet_csk(sk)->icsk_ca_ops->cong_control) tcp_update_pacing_rate(sk); -@@ -6299,6 +6461,30 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6306,9 +6467,34 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) tcp_initialize_rcv_mss(sk); tcp_fast_path_on(tp); @@ -5200,17 +5254,21 @@ index 0808110451a0..d278b28035ad 100644 break; case TCP_FIN_WAIT1: { -@@ -6339,7 +6525,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) ++ struct sock *meta_sk = mptcp(tcp_sk(sk)) ? mptcp_meta_sk(sk) : sk; + int tmo; + + if (req) +@@ -6346,7 +6532,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) tmo = tcp_fin_time(sk); if (tmo > TCP_TIMEWAIT_LEN) { inet_csk_reset_keepalive_timer(sk, tmo - TCP_TIMEWAIT_LEN); - } else if (th->fin || sock_owned_by_user(sk)) { + } else if (th->fin || mptcp_is_data_fin(skb) || -+ sock_owned_by_user(sk)) { ++ sock_owned_by_user(meta_sk)) { /* Bad case. We could lose such FIN otherwise. * It is not a big problem, but it looks confusing * and not so rare event. We still can lose it now, -@@ -6348,7 +6535,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6355,7 +6542,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) */ inet_csk_reset_keepalive_timer(sk, tmo); } else { @@ -5219,7 +5277,7 @@ index 0808110451a0..d278b28035ad 100644 goto discard; } break; -@@ -6356,7 +6543,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6363,7 +6550,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) case TCP_CLOSING: if (tp->snd_una == tp->write_seq) { @@ -5228,7 +5286,7 @@ index 0808110451a0..d278b28035ad 100644 goto discard; } break; -@@ -6368,6 +6555,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6375,6 +6562,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) goto discard; } break; @@ -5238,7 +5296,7 @@ index 0808110451a0..d278b28035ad 100644 } /* step 6: check the URG bit */ -@@ -6389,7 +6579,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) +@@ -6396,7 +6586,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb) */ if (sk->sk_shutdown & RCV_SHUTDOWN) { if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq && @@ -5248,7 +5306,7 @@ index 0808110451a0..d278b28035ad 100644 NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA); tcp_reset(sk); return 1; -@@ -6491,6 +6682,8 @@ static void tcp_openreq_init(struct request_sock *req, +@@ -6498,6 +6689,8 @@ static void tcp_openreq_init(struct request_sock *req, ireq->wscale_ok = rx_opt->wscale_ok; ireq->acked = 0; ireq->ecn_ok = 0; @@ -5257,7 +5315,7 @@ index 0808110451a0..d278b28035ad 100644 ireq->ir_rmt_port = tcp_hdr(skb)->source; ireq->ir_num = ntohs(tcp_hdr(skb)->dest); ireq->ir_mark = inet_request_mark(sk, skb); -@@ -6616,12 +6809,17 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, +@@ -6628,12 +6821,17 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, /* TW buckets are converted to open requests without * limitations, they conserve resources and peer is * evidently real one. @@ -5276,7 +5334,7 @@ index 0808110451a0..d278b28035ad 100644 } if (sk_acceptq_is_full(sk)) { -@@ -6639,8 +6837,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, +@@ -6650,8 +6849,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, tcp_clear_options(&tmp_opt); tmp_opt.mss_clamp = af_ops->mss_clamp; tmp_opt.user_mss = tp->rx_opt.user_mss; @@ -5287,7 +5345,7 @@ index 0808110451a0..d278b28035ad 100644 if (want_cookie && !tmp_opt.saw_tstamp) tcp_clear_options(&tmp_opt); -@@ -6655,7 +6853,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, +@@ -6666,7 +6865,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, /* Note: tcp_v6_init_req() might override ir_iif for link locals */ inet_rsk(req)->ir_iif = inet_request_bound_dev_if(sk, skb); @@ -5297,7 +5355,7 @@ index 0808110451a0..d278b28035ad 100644 if (security_inet_conn_request(sk, skb, req)) goto drop_and_free; -@@ -6691,7 +6890,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, +@@ -6704,7 +6904,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, tcp_ecn_create_request(req, skb, sk, dst); if (want_cookie) { @@ -5306,7 +5364,7 @@ index 0808110451a0..d278b28035ad 100644 req->cookie_ts = tmp_opt.tstamp_ok; if (!tmp_opt.tstamp_ok) inet_rsk(req)->ecn_ok = 0; -@@ -6706,17 +6905,25 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, +@@ -6719,17 +6919,31 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops, fastopen_sk = tcp_try_fastopen(sk, skb, req, &foc, dst); } if (fastopen_sk) { @@ -5320,21 +5378,28 @@ index 0808110451a0..d278b28035ad 100644 - if (!inet_csk_reqsk_queue_add(sk, req, fastopen_sk)) { + if (!inet_csk_reqsk_queue_add(sk, req, meta_sk)) { reqsk_fastopen_remove(fastopen_sk, req, false); - bh_unlock_sock(fastopen_sk); +- bh_unlock_sock(fastopen_sk); ++ /* in the case of mptcp, on failure, the master subflow ++ * socket (==fastopen_sk) will already have been unlocked ++ * by the failed call to inet_csk_reqsk_queue_add ++ */ ++ bh_unlock_sock(meta_sk); + if (meta_sk != fastopen_sk) -+ bh_unlock_sock(meta_sk); ++ sock_put(meta_sk); sock_put(fastopen_sk); goto drop_and_free; } sk->sk_data_ready(sk); bh_unlock_sock(fastopen_sk); -+ if (meta_sk != fastopen_sk) ++ if (meta_sk != fastopen_sk) { + bh_unlock_sock(meta_sk); ++ sock_put(meta_sk); ++ } sock_put(fastopen_sk); } else { tcp_rsk(req)->tfo_listener = false; diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c -index 72fe93ace7d7..6e8b769189f1 100644 +index b95e1a3487c8..c6f13e32fdd0 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -62,6 +62,8 @@ @@ -5394,6 +5459,15 @@ index 72fe93ace7d7..6e8b769189f1 100644 /* XXX (TFO) - tp->snd_una should be ISN (tcp_create_openreq_child() */ fastopen = rcu_dereference(tp->fastopen_rsk); snd_una = fastopen ? tcp_rsk(fastopen)->snt_isn : tp->snd_una; +@@ -491,7 +500,7 @@ int tcp_v4_err(struct sk_buff *icmp_skb, u32 info) + + switch (type) { + case ICMP_REDIRECT: +- if (!sock_owned_by_user(sk)) ++ if (!sock_owned_by_user(meta_sk)) + do_redirect(icmp_skb, sk); + goto out; + case ICMP_SOURCE_QUENCH: @@ -513,11 +522,13 @@ int tcp_v4_err(struct sk_buff *icmp_skb, u32 info) goto out; @@ -5800,7 +5874,7 @@ index 72fe93ace7d7..6e8b769189f1 100644 EXPORT_SYMBOL(tcp_prot); diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c -index 9b038cb0a43d..84db337f5282 100644 +index 324f43fadb37..9bcd0b8aa0af 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -19,11 +19,13 @@ @@ -6065,7 +6139,7 @@ index 9b038cb0a43d..84db337f5282 100644 return ret; } diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c -index 739fc69cdcc6..a4fa05e5562d 100644 +index c37028af0db0..08c79424fbc3 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -37,6 +37,12 @@ @@ -6368,7 +6442,20 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { struct tcp_sock *tp = tcp_sk(sk); -@@ -1401,7 +1437,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, +@@ -1355,6 +1391,12 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, + TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; + TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; + ++#ifdef CONFIG_MPTCP ++ memcpy(TCP_SKB_CB(buff)->dss, TCP_SKB_CB(skb)->dss, ++ sizeof(TCP_SKB_CB(skb)->dss)); ++ TCP_SKB_CB(buff)->mptcp_flags = TCP_SKB_CB(skb)->mptcp_flags; ++#endif ++ + /* PSH and FIN should only be set in the second packet. */ + flags = TCP_SKB_CB(skb)->tcp_flags; + TCP_SKB_CB(skb)->tcp_flags = flags & ~(TCPHDR_FIN | TCPHDR_PSH); +@@ -1401,7 +1443,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, /* This is similar to __pskb_pull_tail(). The difference is that pulled * data is not copied, but immediately discarded. */ @@ -6377,7 +6464,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { struct skb_shared_info *shinfo; int i, k, eat; -@@ -1624,6 +1660,7 @@ unsigned int tcp_current_mss(struct sock *sk) +@@ -1625,6 +1667,7 @@ unsigned int tcp_current_mss(struct sock *sk) return mss_now; } @@ -6385,7 +6472,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 /* RFC2861, slow part. Adjust cwnd, after it was not full during one rto. * As additional protections, we do not touch cwnd in retransmission phases, -@@ -1683,8 +1720,11 @@ static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited) +@@ -1684,8 +1727,11 @@ static void tcp_cwnd_validate(struct sock *sk, bool is_cwnd_limited) * 2) not cwnd limited (this else condition) * 3) no more data to send (tcp_write_queue_empty()) * 4) application is hitting buffer limit (SOCK_NOSPACE) @@ -6397,7 +6484,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 test_bit(SOCK_NOSPACE, &sk->sk_socket->flags) && (1 << sk->sk_state) & (TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)) tcp_chrono_start(sk, TCP_CHRONO_SNDBUF_LIMITED); -@@ -1706,8 +1746,8 @@ static bool tcp_minshall_check(const struct tcp_sock *tp) +@@ -1707,8 +1753,8 @@ static bool tcp_minshall_check(const struct tcp_sock *tp) * But we can avoid doing the divide again given we already have * skb_pcount = skb->len / mss_now */ @@ -6408,7 +6495,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { if (skb->len < tcp_skb_pcount(skb) * mss_now) tp->snd_sml = TCP_SKB_CB(skb)->end_seq; -@@ -1753,7 +1793,7 @@ static u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now, +@@ -1754,7 +1800,7 @@ static u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now, /* Return the number of segments we want in the skb we are transmitting. * See if congestion control module wants to decide; otherwise, autosize. */ @@ -6417,7 +6504,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { const struct tcp_congestion_ops *ca_ops = inet_csk(sk)->icsk_ca_ops; u32 min_tso, tso_segs; -@@ -1767,11 +1807,11 @@ static u32 tcp_tso_segs(struct sock *sk, unsigned int mss_now) +@@ -1768,11 +1814,11 @@ static u32 tcp_tso_segs(struct sock *sk, unsigned int mss_now) } /* Returns the portion of skb which can be sent right away */ @@ -6434,7 +6521,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { const struct tcp_sock *tp = tcp_sk(sk); u32 partial, needed, window, max_len; -@@ -1801,13 +1841,14 @@ static unsigned int tcp_mss_split_point(const struct sock *sk, +@@ -1802,13 +1848,14 @@ static unsigned int tcp_mss_split_point(const struct sock *sk, /* Can at least one segment of SKB be sent right now, according to the * congestion window rules? If so, return how many segments are allowed. */ @@ -6452,7 +6539,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 tcp_skb_pcount(skb) == 1) return 1; -@@ -1822,12 +1863,13 @@ static inline unsigned int tcp_cwnd_test(const struct tcp_sock *tp, +@@ -1823,12 +1870,13 @@ static inline unsigned int tcp_cwnd_test(const struct tcp_sock *tp, halfcwnd = max(cwnd >> 1, 1U); return min(halfcwnd, cwnd - in_flight); } @@ -6467,7 +6554,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { int tso_segs = tcp_skb_pcount(skb); -@@ -1842,8 +1884,8 @@ static int tcp_init_tso_segs(struct sk_buff *skb, unsigned int mss_now) +@@ -1843,8 +1891,8 @@ static int tcp_init_tso_segs(struct sk_buff *skb, unsigned int mss_now) /* Return true if the Nagle test allows this packet to be * sent now. */ @@ -6478,7 +6565,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { /* Nagle rule does not apply to frames, which sit in the middle of the * write_queue (they have no chances to get new data). -@@ -1855,7 +1897,8 @@ static inline bool tcp_nagle_test(const struct tcp_sock *tp, const struct sk_buf +@@ -1856,7 +1904,8 @@ static inline bool tcp_nagle_test(const struct tcp_sock *tp, const struct sk_buf return true; /* Don't use the nagle rule for urgent data (or for the final FIN). */ @@ -6488,7 +6575,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 return true; if (!tcp_nagle_check(skb->len < cur_mss, tp, nonagle)) -@@ -1865,9 +1908,8 @@ static inline bool tcp_nagle_test(const struct tcp_sock *tp, const struct sk_buf +@@ -1866,9 +1915,8 @@ static inline bool tcp_nagle_test(const struct tcp_sock *tp, const struct sk_buf } /* Does at least the first segment of SKB fit into the send window? */ @@ -6500,7 +6587,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { u32 end_seq = TCP_SKB_CB(skb)->end_seq; -@@ -1876,6 +1918,7 @@ static bool tcp_snd_wnd_test(const struct tcp_sock *tp, +@@ -1877,6 +1925,7 @@ static bool tcp_snd_wnd_test(const struct tcp_sock *tp, return !after(end_seq, tcp_wnd_end(tp)); } @@ -6508,7 +6595,20 @@ index 739fc69cdcc6..a4fa05e5562d 100644 /* Trim TSO SKB to LEN bytes, put the remaining data into a new packet * which is put after SKB on the list. It is very much like -@@ -2034,7 +2077,8 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, +@@ -1912,6 +1961,12 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len, + TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; + TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; + ++#ifdef CONFIG_MPTCP ++ memcpy(TCP_SKB_CB(buff)->dss, TCP_SKB_CB(skb)->dss, ++ sizeof(TCP_SKB_CB(skb)->dss)); ++ TCP_SKB_CB(buff)->mptcp_flags = TCP_SKB_CB(skb)->mptcp_flags; ++#endif ++ + /* PSH and FIN should only be set in the second packet. */ + flags = TCP_SKB_CB(skb)->tcp_flags; + TCP_SKB_CB(skb)->tcp_flags = flags & ~(TCPHDR_FIN | TCPHDR_PSH); +@@ -2035,7 +2090,8 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb, /* If this packet won't get more data, do not wait. */ if ((TCP_SKB_CB(skb)->tcp_flags & TCPHDR_FIN) || @@ -6518,7 +6618,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 goto send_now; return true; -@@ -2367,7 +2411,7 @@ void tcp_chrono_stop(struct sock *sk, const enum tcp_chrono type) +@@ -2368,7 +2424,7 @@ void tcp_chrono_stop(struct sock *sk, const enum tcp_chrono type) * Returns true, if no segments are in flight and we have queued segments, * but cannot send anything now because of SWS or another problem. */ @@ -6527,7 +6627,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 int push_one, gfp_t gfp) { struct tcp_sock *tp = tcp_sk(sk); -@@ -2381,7 +2425,12 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, +@@ -2382,7 +2438,12 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, sent_pkts = 0; tcp_mstamp_refresh(tp); @@ -6541,7 +6641,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 /* Do MTU probing. */ result = tcp_mtu_probe(sk); if (!result) { -@@ -2577,7 +2626,7 @@ void tcp_send_loss_probe(struct sock *sk) +@@ -2578,7 +2639,7 @@ void tcp_send_loss_probe(struct sock *sk) skb = tcp_send_head(sk); if (skb && tcp_snd_wnd_test(tp, skb, mss)) { pcount = tp->packets_out; @@ -6550,7 +6650,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 if (tp->packets_out > pcount) goto probe_sent; goto rearm_timer; -@@ -2639,8 +2688,8 @@ void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss, +@@ -2640,8 +2701,8 @@ void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss, if (unlikely(sk->sk_state == TCP_CLOSE)) return; @@ -6561,7 +6661,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 tcp_check_probe_timer(sk); } -@@ -2653,7 +2702,8 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now) +@@ -2654,7 +2715,8 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now) BUG_ON(!skb || skb->len < mss_now); @@ -6571,7 +6671,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 } /* This function returns the amount that we can raise the -@@ -2875,6 +2925,10 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *to, +@@ -2876,6 +2938,10 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *to, if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN) return; @@ -6582,7 +6682,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 skb_rbtree_walk_from_safe(skb, tmp) { if (!tcp_can_collapse(sk, skb)) break; -@@ -3356,7 +3410,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, +@@ -3367,7 +3433,7 @@ struct sk_buff *tcp_make_synack(const struct sock *sk, struct dst_entry *dst, /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */ th->window = htons(min(req->rsk_rcv_wnd, 65535U)); @@ -6591,7 +6691,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 th->doff = (tcp_header_size >> 2); __TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS); -@@ -3438,13 +3492,13 @@ static void tcp_connect_init(struct sock *sk) +@@ -3449,13 +3515,13 @@ static void tcp_connect_init(struct sock *sk) if (rcv_wnd == 0) rcv_wnd = dst_metric(dst, RTAX_INITRWND); @@ -6606,13 +6706,13 @@ index 739fc69cdcc6..a4fa05e5562d 100644 + tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0), + &tp->rcv_wnd, + &tp->window_clamp, -+ sock_net(sk)->ipv4.sysctl_tcp_window_scaling, ++ READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_window_scaling), + &rcv_wscale, + rcv_wnd); tp->rx_opt.rcv_wscale = rcv_wscale; tp->rcv_ssthresh = tp->rcv_wnd; -@@ -3464,11 +3518,43 @@ static void tcp_connect_init(struct sock *sk) +@@ -3475,11 +3541,43 @@ static void tcp_connect_init(struct sock *sk) else tp->rcv_tstamp = tcp_jiffies32; tp->rcv_wup = tp->rcv_nxt; @@ -6656,7 +6756,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 } static void tcp_connect_queue_skb(struct sock *sk, struct sk_buff *skb) -@@ -3735,6 +3821,7 @@ void tcp_send_ack(struct sock *sk) +@@ -3746,6 +3844,7 @@ void tcp_send_ack(struct sock *sk) { __tcp_send_ack(sk, tcp_sk(sk)->rcv_nxt); } @@ -6664,7 +6764,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 /* This routine sends a packet with an out of date sequence * number. It assumes the other end will try to ack it. -@@ -3747,7 +3834,7 @@ void tcp_send_ack(struct sock *sk) +@@ -3758,7 +3857,7 @@ void tcp_send_ack(struct sock *sk) * one is with SEG.SEQ=SND.UNA to deliver urgent pointer, another is * out-of-date with SND.UNA-1 to probe window. */ @@ -6673,7 +6773,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 { struct tcp_sock *tp = tcp_sk(sk); struct sk_buff *skb; -@@ -3834,7 +3921,7 @@ void tcp_send_probe0(struct sock *sk) +@@ -3845,7 +3944,7 @@ void tcp_send_probe0(struct sock *sk) unsigned long timeout; int err; @@ -6683,7 +6783,7 @@ index 739fc69cdcc6..a4fa05e5562d 100644 if (tp->packets_out || tcp_write_queue_empty(sk)) { /* Cancel probe timer, if it is not required. */ diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c -index fa2ae96ecdc4..d2b3e30b8788 100644 +index a0107eb02ae4..7017ee200aec 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -21,6 +21,7 @@ @@ -6712,7 +6812,21 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 tcp_done(sk); __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONMEMORY); return 1; -@@ -206,9 +207,9 @@ static unsigned int tcp_model_timeout(struct sock *sk, +@@ -149,6 +150,13 @@ static int tcp_orphan_retries(struct sock *sk, bool alive) + if (sk->sk_err_soft && !alive) + retries = 0; + ++ /* If the app called close() and we don't have any subflows left, ++ * be aggressive at killing the connection. Otherwise we will linger ++ * around for a very long time. ++ */ ++ if (is_meta_sk(sk) && hlist_empty(&tcp_sk(sk)->mpcb->conn_list)) ++ retries = 1; ++ + /* However, if socket sent something recently, select some safe + * number of retries. 8 corresponds to >100 seconds with minimal + * RTO of 200msec. */ +@@ -206,9 +214,9 @@ static unsigned int tcp_model_timeout(struct sock *sk, * after "boundary" unsuccessful, exponentially backed-off * retransmissions with an initial RTO of TCP_RTO_MIN. */ @@ -6725,7 +6839,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 { unsigned int start_ts; -@@ -228,7 +229,7 @@ static bool retransmits_timed_out(struct sock *sk, +@@ -228,7 +236,7 @@ static bool retransmits_timed_out(struct sock *sk, } /* A write timeout has occurred. Process the after effects. */ @@ -6734,7 +6848,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 { struct inet_connection_sock *icsk = inet_csk(sk); struct tcp_sock *tp = tcp_sk(sk); -@@ -243,6 +244,17 @@ static int tcp_write_timeout(struct sock *sk) +@@ -243,6 +251,17 @@ static int tcp_write_timeout(struct sock *sk) sk_rethink_txhash(sk); } retry_until = icsk->icsk_syn_retries ? : net->ipv4.sysctl_tcp_syn_retries; @@ -6751,8 +6865,8 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 + expired = icsk->icsk_retransmits >= retry_until; } else { - if (retransmits_timed_out(sk, net->ipv4.sysctl_tcp_retries1, 0)) { -@@ -338,18 +350,22 @@ static void tcp_delack_timer(struct timer_list *t) + if (retransmits_timed_out(sk, READ_ONCE(net->ipv4.sysctl_tcp_retries1), 0)) { +@@ -338,18 +357,22 @@ static void tcp_delack_timer(struct timer_list *t) struct inet_connection_sock *icsk = from_timer(icsk, t, icsk_delack_timer); struct sock *sk = &icsk->icsk_inet.sk; @@ -6779,7 +6893,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 sock_put(sk); } -@@ -393,7 +409,12 @@ static void tcp_probe_timer(struct sock *sk) +@@ -393,7 +416,12 @@ static void tcp_probe_timer(struct sock *sk) } if (icsk->icsk_probes_out >= max_probes) { @@ -6793,7 +6907,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 } else { /* Only send another probe if we didn't close things up. */ tcp_send_probe0(sk); -@@ -614,7 +635,7 @@ void tcp_write_timer_handler(struct sock *sk) +@@ -614,7 +642,7 @@ void tcp_write_timer_handler(struct sock *sk) break; case ICSK_TIME_RETRANS: icsk->icsk_pending = 0; @@ -6802,7 +6916,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 break; case ICSK_TIME_PROBE0: icsk->icsk_pending = 0; -@@ -631,16 +652,19 @@ static void tcp_write_timer(struct timer_list *t) +@@ -631,16 +659,19 @@ static void tcp_write_timer(struct timer_list *t) struct inet_connection_sock *icsk = from_timer(icsk, t, icsk_retransmit_timer); struct sock *sk = &icsk->icsk_inet.sk; @@ -6825,7 +6939,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 sock_put(sk); } -@@ -670,11 +694,12 @@ static void tcp_keepalive_timer (struct timer_list *t) +@@ -670,11 +701,12 @@ static void tcp_keepalive_timer (struct timer_list *t) struct sock *sk = from_timer(sk, t, sk_timer); struct inet_connection_sock *icsk = inet_csk(sk); struct tcp_sock *tp = tcp_sk(sk); @@ -6840,7 +6954,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 /* Try again later. */ inet_csk_reset_keepalive_timer (sk, HZ/20); goto out; -@@ -686,16 +711,31 @@ static void tcp_keepalive_timer (struct timer_list *t) +@@ -686,16 +718,31 @@ static void tcp_keepalive_timer (struct timer_list *t) } tcp_mstamp_refresh(tp); @@ -6874,7 +6988,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 goto death; } -@@ -720,11 +760,11 @@ static void tcp_keepalive_timer (struct timer_list *t) +@@ -720,11 +767,11 @@ static void tcp_keepalive_timer (struct timer_list *t) icsk->icsk_probes_out > 0) || (icsk->icsk_user_timeout == 0 && icsk->icsk_probes_out >= keepalive_probes(tp))) { @@ -6888,7 +7002,7 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 icsk->icsk_probes_out++; elapsed = keepalive_intvl_when(tp); } else { -@@ -748,7 +788,7 @@ static void tcp_keepalive_timer (struct timer_list *t) +@@ -748,7 +795,7 @@ static void tcp_keepalive_timer (struct timer_list *t) tcp_done(sk); out: @@ -6897,8 +7011,30 @@ index fa2ae96ecdc4..d2b3e30b8788 100644 sock_put(sk); } +@@ -756,9 +803,10 @@ static enum hrtimer_restart tcp_compressed_ack_kick(struct hrtimer *timer) + { + struct tcp_sock *tp = container_of(timer, struct tcp_sock, compressed_ack_timer); + struct sock *sk = (struct sock *)tp; ++ struct sock *meta_sk = mptcp(tp) ? mptcp_meta_sk(sk) : sk; + +- bh_lock_sock(sk); +- if (!sock_owned_by_user(sk)) { ++ bh_lock_sock(meta_sk); ++ if (!sock_owned_by_user(meta_sk)) { + if (tp->compressed_ack > TCP_FASTRETRANS_THRESH) + tcp_send_ack(sk); + } else { +@@ -766,7 +814,7 @@ static enum hrtimer_restart tcp_compressed_ack_kick(struct hrtimer *timer) + &sk->sk_tsq_flags)) + sock_hold(sk); + } +- bh_unlock_sock(sk); ++ bh_unlock_sock(meta_sk); + + sock_put(sk); + diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c -index e29553e4f4ee..a4882b96f59a 100644 +index a0123760fb2c..587cbcfe10e5 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -978,6 +978,7 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp) @@ -6910,7 +7046,7 @@ index e29553e4f4ee..a4882b96f59a 100644 static void ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c -index 942da168f18f..e36520f9dcd5 100644 +index 56f396ecc26b..768a8717dc10 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -104,8 +104,7 @@ static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) @@ -6969,7 +7105,7 @@ index 5352c7e68c42..534a9d2e4858 100644 break; diff --git a/net/ipv6/syncookies.c b/net/ipv6/syncookies.c -index 37ab254f7b92..c0b637adf337 100644 +index 7e5550546594..248255d2883a 100644 --- a/net/ipv6/syncookies.c +++ b/net/ipv6/syncookies.c @@ -15,6 +15,8 @@ @@ -6999,7 +7135,7 @@ index 37ab254f7b92..c0b637adf337 100644 struct inet_request_sock *ireq; struct tcp_request_sock *treq; struct ipv6_pinfo *np = inet6_sk(sk); -@@ -157,7 +161,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) +@@ -158,7 +162,8 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) /* check for timestamp cookie support */ memset(&tcp_opt, 0, sizeof(tcp_opt)); @@ -7009,7 +7145,7 @@ index 37ab254f7b92..c0b637adf337 100644 if (tcp_opt.saw_tstamp && tcp_opt.rcv_tsecr) { tsoff = secure_tcpv6_ts_off(sock_net(sk), -@@ -170,15 +175,28 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) +@@ -171,15 +176,28 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) goto out; ret = NULL; @@ -7039,7 +7175,7 @@ index 37ab254f7b92..c0b637adf337 100644 if (security_inet_conn_request(sk, skb, req)) goto out_free; -@@ -248,15 +266,15 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) +@@ -249,15 +267,15 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb) (req->rsk_window_clamp > full_space || req->rsk_window_clamp == 0)) req->rsk_window_clamp = full_space; @@ -7061,7 +7197,7 @@ index 37ab254f7b92..c0b637adf337 100644 return ret; out_free: diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c -index 063898cae3e5..78d91dfc3f06 100644 +index 063898cae3e5..7f3804814657 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -58,6 +58,8 @@ @@ -7187,6 +7323,15 @@ index 063898cae3e5..78d91dfc3f06 100644 /* XXX (TFO) - tp->snd_una should be ISN (tcp_create_openreq_child() */ fastopen = rcu_dereference(tp->fastopen_rsk); snd_una = fastopen ? tcp_rsk(fastopen)->snt_isn : tp->snd_una; +@@ -427,7 +437,7 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, + np = tcp_inet6_sk(sk); + + if (type == NDISC_REDIRECT) { +- if (!sock_owned_by_user(sk)) { ++ if (!sock_owned_by_user(meta_sk)) { + struct dst_entry *dst = __sk_dst_check(sk, np->dst_cookie); + + if (dst) @@ -454,11 +464,15 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, WRITE_ONCE(tp->mtu_info, mtu); @@ -7657,10 +7802,10 @@ index 063898cae3e5..78d91dfc3f06 100644 /* thinking of making this const? Don't. diff --git a/net/mptcp/Kconfig b/net/mptcp/Kconfig new file mode 100644 -index 000000000000..1a7e9bbc766d +index 000000000000..c3d2053a61b2 --- /dev/null +++ b/net/mptcp/Kconfig -@@ -0,0 +1,155 @@ +@@ -0,0 +1,162 @@ +# +# MPTCP configuration +# @@ -7816,6 +7961,13 @@ index 000000000000..1a7e9bbc766d + default "redundant" if DEFAULT_REDUNDANT + default "default" + ++config MPTCP_DEBUG_LOCK ++ bool "MPTCP lock debugging" ++ default n ++ depends on MPTCP ++ ---help--- ++ Check that MPTCP meta locks are properly held when locking subflows. ++ This is a debug option that impacts performances. Say N if unsure. diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile new file mode 100644 index 000000000000..369248a2f68e @@ -9373,10 +9525,10 @@ index 000000000000..9eb7628053f6 +MODULE_VERSION("0.1"); diff --git a/net/mptcp/mptcp_ctrl.c b/net/mptcp/mptcp_ctrl.c new file mode 100644 -index 000000000000..9a1b5a048b70 +index 000000000000..0e8dc7f2aac4 --- /dev/null +++ b/net/mptcp/mptcp_ctrl.c -@@ -0,0 +1,3302 @@ +@@ -0,0 +1,3307 @@ +/* + * MPTCP implementation - MPTCP-control + * @@ -10611,7 +10763,6 @@ index 000000000000..9a1b5a048b70 + /* The below has to be done to allow calling inet_csk_destroy_sock */ + sock_set_flag(sk, SOCK_DEAD); + percpu_counter_inc(sk->sk_prot->orphan_count); -+ /* inet_sk(sk)->inet_num = 0; */ + + tcp_done(sk); + @@ -11152,6 +11303,7 @@ index 000000000000..9a1b5a048b70 + /* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */ + tcp_init_nondata_skb(skb, tp->write_seq, + TCPHDR_ACK | TCPHDR_FIN); ++ sk_forced_mem_schedule(sk, skb->truesize); + tcp_queue_skb(sk, skb); + } + __tcp_push_pending_frames(sk, mss_now, TCP_NAGLE_OFF); @@ -11495,9 +11647,6 @@ index 000000000000..9a1b5a048b70 + mptcp_for_each_sub_safe(meta_tp->mpcb, mptcp, tmp) { + struct sock *subsk = mptcp_to_sock(mptcp); + -+ if (spin_is_locked(&subsk->sk_lock.slock)) -+ bh_unlock_sock(subsk); -+ + tcp_sk(subsk)->tcp_disconnect = 1; + + meta_sk->sk_prot->disconnect(subsk, O_NONBLOCK); @@ -11648,9 +11797,6 @@ index 000000000000..9a1b5a048b70 + */ + mptcp_reqsk_remove_tk(req); + -+ /* Hold when creating the meta-sk in tcp_vX_syn_recv_sock. */ -+ sock_put(meta_sk); -+ + return 0; +} + @@ -11727,9 +11873,7 @@ index 000000000000..9a1b5a048b70 + reqsk_queue_removed(&inet_csk(sk)->icsk_accept_queue, req); + if (!inet_csk_reqsk_queue_add(sk, req, meta_sk)) { + bh_unlock_sock(meta_sk); -+ /* No sock_put() of the meta needed. The reference has -+ * already been dropped in __mptcp_check_req_master(). -+ */ ++ sock_put(meta_sk); + sock_put(child); + return -1; + } @@ -11739,14 +11883,14 @@ index 000000000000..9a1b5a048b70 + tcp_sk(meta_sk)->tsoffset = tsoff; + if (!inet_csk_reqsk_queue_add(sk, req, meta_sk)) { + bh_unlock_sock(meta_sk); -+ /* No sock_put() of the meta needed. The reference has -+ * already been dropped in __mptcp_check_req_master(). -+ */ ++ sock_put(meta_sk); + sock_put(child); + return -1; + } + } + ++ sock_put(meta_sk); ++ + return 0; +} + @@ -11799,6 +11943,7 @@ index 000000000000..9a1b5a048b70 + * some of the fields + */ + child_tp->mptcp->rcv_low_prio = mtreq->rcv_low_prio; ++ child_tp->mptcp->low_prio = mtreq->low_prio; + + /* We should allow proper increase of the snd/rcv-buffers. Thus, we + * use the original values instead of the bloated up ones from the @@ -12679,6 +12824,18 @@ index 000000000000..9a1b5a048b70 +mptcp_sock_cache_failed: + mptcp_init_failed = true; +} ++ ++#ifdef CONFIG_MPTCP_DEBUG_LOCK ++void mptcp_check_lock(struct sock *sk) ++{ ++ struct tcp_sock *tp = tcp_sk(sk); ++ /* make sure the meta lock is held when we hold the sublock */ ++ if (mptcp(tp) && !is_meta_tp(tp) && tp->meta_sk) ++ WARN_ON(!spin_is_locked(&tp->meta_sk->sk_lock.slock) && ++ !sock_owned_by_user(tp->meta_sk)); ++} ++EXPORT_SYMBOL(mptcp_check_lock); ++#endif diff --git a/net/mptcp/mptcp_ecf.c b/net/mptcp/mptcp_ecf.c new file mode 100644 index 000000000000..6b976b2b0c72 @@ -14824,10 +14981,10 @@ index 000000000000..65e2cd9bf630 +MODULE_VERSION("0.88"); diff --git a/net/mptcp/mptcp_input.c b/net/mptcp/mptcp_input.c new file mode 100644 -index 000000000000..7ce97409e1e2 +index 000000000000..01a81e3f7690 --- /dev/null +++ b/net/mptcp/mptcp_input.c -@@ -0,0 +1,2630 @@ +@@ -0,0 +1,2632 @@ +/* + * MPTCP implementation - Sending side + * @@ -15853,6 +16010,7 @@ index 000000000000..7ce97409e1e2 + tp->copied_seq = TCP_SKB_CB(tmp1)->end_seq; + mptcp_prepare_skb(tmp1, sk); + __skb_unlink(tmp1, &sk->sk_receive_queue); ++ sk_forced_mem_schedule(meta_sk, tmp1->truesize); + /* MUST be done here, because fragstolen may be true later. + * Then, kfree_skb_partial will not account the memory. + */ @@ -15884,6 +16042,7 @@ index 000000000000..7ce97409e1e2 + tp->copied_seq = TCP_SKB_CB(tmp1)->end_seq; + mptcp_prepare_skb(tmp1, sk); + __skb_unlink(tmp1, &sk->sk_receive_queue); ++ sk_forced_mem_schedule(meta_sk, tmp1->truesize); + /* MUST be done here, because fragstolen may be true. + * Then, kfree_skb_partial will not account the memory. + */ @@ -17460,7 +17619,7 @@ index 000000000000..7ce97409e1e2 +} diff --git a/net/mptcp/mptcp_ipv4.c b/net/mptcp/mptcp_ipv4.c new file mode 100644 -index 000000000000..c908e02c72e1 +index 000000000000..fbcf47c46783 --- /dev/null +++ b/net/mptcp/mptcp_ipv4.c @@ -0,0 +1,433 @@ @@ -17637,14 +17796,14 @@ index 000000000000..c908e02c72e1 + if (!sk) + goto new_subflow; + -+ if (is_meta_sk(sk)) { -+ WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); -+ sock_put(sk); ++ if (sk->sk_state == TCP_TIME_WAIT) { ++ inet_twsk_put(inet_twsk(sk)); + goto discard; + } + -+ if (sk->sk_state == TCP_TIME_WAIT) { -+ inet_twsk_put(inet_twsk(sk)); ++ if (is_meta_sk(sk)) { ++ WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); ++ sock_put(sk); + goto discard; + } + @@ -17899,7 +18058,7 @@ index 000000000000..c908e02c72e1 +} diff --git a/net/mptcp/mptcp_ipv6.c b/net/mptcp/mptcp_ipv6.c new file mode 100644 -index 000000000000..ebe3f5f97460 +index 000000000000..915dd7892037 --- /dev/null +++ b/net/mptcp/mptcp_ipv6.c @@ -0,0 +1,482 @@ @@ -18105,14 +18264,14 @@ index 000000000000..ebe3f5f97460 + if (!sk) + goto new_subflow; + -+ if (is_meta_sk(sk)) { -+ WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); -+ sock_put(sk); ++ if (sk->sk_state == TCP_TIME_WAIT) { ++ inet_twsk_put(inet_twsk(sk)); + goto discard; + } + -+ if (sk->sk_state == TCP_TIME_WAIT) { -+ inet_twsk_put(inet_twsk(sk)); ++ if (is_meta_sk(sk)) { ++ WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); ++ sock_put(sk); + goto discard; + } + @@ -20167,10 +20326,10 @@ index 000000000000..161a63f336d7 +MODULE_VERSION("0.1"); diff --git a/net/mptcp/mptcp_output.c b/net/mptcp/mptcp_output.c new file mode 100644 -index 000000000000..a8a5787adbf1 +index 000000000000..c26e14a702fd --- /dev/null +++ b/net/mptcp/mptcp_output.c -@@ -0,0 +1,2015 @@ +@@ -0,0 +1,2038 @@ +/* + * MPTCP implementation - Sending side + * @@ -20466,6 +20625,7 @@ index 000000000000..a8a5787adbf1 +void mptcp_reinject_data(struct sock *sk, int clone_it) +{ + struct sock *meta_sk = mptcp_meta_sk(sk); ++ struct tcp_sock *tp = tcp_sk(sk); + struct sk_buff *skb_it, *tmp; + enum tcp_queue tcp_queue; + @@ -20493,6 +20653,10 @@ index 000000000000..a8a5787adbf1 + TCP_FRAG_IN_WRITE_QUEUE); + } + ++ /* We are emptying the rtx-queue. highest_sack is invalid */ ++ if (!clone_it) ++ tp->highest_sack = NULL; ++ + skb_it = tcp_rtx_queue_head(sk); + skb_rbtree_walk_from_safe(skb_it, tmp) { + struct tcp_skb_cb *tcb = TCP_SKB_CB(skb_it); @@ -20525,11 +20689,11 @@ index 000000000000..a8a5787adbf1 + + /* If sk has sent the empty data-fin, we have to reinject it too. */ + if (skb_it && mptcp_is_data_fin(skb_it) && skb_it->len == 0 && -+ TCP_SKB_CB(skb_it)->path_mask & mptcp_pi_to_flag(tcp_sk(sk)->mptcp->path_index)) { ++ TCP_SKB_CB(skb_it)->path_mask & mptcp_pi_to_flag(tp->mptcp->path_index)) { + __mptcp_reinject_data(skb_it, meta_sk, NULL, 1, tcp_queue); + } + -+ tcp_sk(sk)->pf = 1; ++ tp->pf = 1; + + mptcp_push_pending_frames(meta_sk); +} @@ -20727,9 +20891,20 @@ index 000000000000..a8a5787adbf1 + struct tcp_skb_cb *tcb; + struct sk_buff *subskb = NULL; + -+ if (!reinject) ++ if (reinject) { ++ /* Make sure to update counters and MIB in case of meta-retrans ++ * AKA reinjections, similar to what is done in ++ * __tcp_retransmit_skb(). ++ */ ++ int segs = tcp_skb_pcount(skb); ++ ++ MPTCP_ADD_STATS(sock_net(meta_sk), MPTCP_MIB_RETRANSSEGS, segs); ++ tcp_sk(meta_sk)->total_retrans += segs; ++ tcp_sk(meta_sk)->bytes_retrans += skb->len; ++ } else { + TCP_SKB_CB(skb)->mptcp_flags |= (mpcb->snd_hiseq_index ? + MPTCPHDR_SEQ64_INDEX : 0); ++ } + + tcp_skb_tsorted_save(skb) { + subskb = pskb_copy_for_clone(skb, GFP_ATOMIC); @@ -20788,6 +20963,7 @@ index 000000000000..a8a5787adbf1 + + tcp_add_write_queue_tail(sk, subskb); + sk->sk_wmem_queued += subskb->truesize; ++ sk_forced_mem_schedule(sk, subskb->truesize); + sk_mem_charge(sk, subskb->truesize); + } else { + /* Necessary to initialize for tcp_transmit_skb. mss of 1, as @@ -21656,6 +21832,7 @@ index 000000000000..a8a5787adbf1 + tcp_init_nondata_skb(skb, meta_tp->write_seq, TCPHDR_ACK); + TCP_SKB_CB(skb)->end_seq++; + TCP_SKB_CB(skb)->mptcp_flags |= MPTCPHDR_FIN; ++ sk_forced_mem_schedule(meta_sk, skb->truesize); + tcp_queue_skb(meta_sk, skb); + } + __tcp_push_pending_frames(meta_sk, mss_now, TCP_NAGLE_OFF); @@ -21825,7 +22002,9 @@ index 000000000000..a8a5787adbf1 + */ + if (refcount_read(&meta_sk->sk_wmem_alloc) > + min(meta_sk->sk_wmem_queued + (meta_sk->sk_wmem_queued >> 2), meta_sk->sk_sndbuf)) { -+ return -EAGAIN; ++ err = -EAGAIN; ++ ++ goto failed; + } + + /* We need to make sure that the retransmitted segment can be sent on a @@ -21872,9 +22051,6 @@ index 000000000000..a8a5787adbf1 + if (!mptcp_skb_entail(subsk, skb, -1)) + goto failed; + -+ /* Update global TCP statistics. */ -+ MPTCP_INC_STATS(sock_net(meta_sk), MPTCP_MIB_RETRANSSEGS); -+ + /* Diff to tcp_retransmit_skb */ + + /* Save stamp of the first retransmit. */ @@ -21891,6 +22067,12 @@ index 000000000000..a8a5787adbf1 + +failed: + NET_INC_STATS(sock_net(meta_sk), LINUX_MIB_TCPRETRANSFAIL); ++ /* Save stamp of the first attempted retransmit. */ ++ if (!meta_tp->retrans_stamp) { ++ tcp_mstamp_refresh(meta_tp); ++ meta_tp->retrans_stamp = tcp_time_stamp(meta_tp); ++ } ++ + return err; +} + @@ -24132,10 +24314,10 @@ index 94358566c9d1..a26eeeda2b4d 100644 * Now to bump the refcnt of the [loadable] module that owns this * socket at sock_release time we decrement its refcnt. diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h -index 0bfad86ec960..ed7013398991 100644 +index cb0631098f91..b9de598828e9 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h -@@ -3438,6 +3438,7 @@ enum { +@@ -3439,6 +3439,7 @@ enum { BPF_TCP_LISTEN, BPF_TCP_CLOSING, /* Now a valid state */ BPF_TCP_NEW_SYN_RECV, @@ -24143,268 +24325,3 @@ index 0bfad86ec960..ed7013398991 100644 BPF_TCP_MAX_STATES /* Leave at the end! */ }; -diff --git a/include/net/mptcp.h b/include/net/mptcp.h -index 630977f67614..f2efa46027d0 100644 ---- a/include/net/mptcp.h -+++ b/include/net/mptcp.h -@@ -732,6 +732,7 @@ static inline struct sock *mptcp_to_sock(const struct mptcp_tcp_sock *mptcp) - - #define MPTCP_INC_STATS(net, field) SNMP_INC_STATS((net)->mptcp.mptcp_statistics, field) - #define MPTCP_DEC_STATS(net, field) SNMP_DEC_STATS((net)->mptcp.mptcp_statistics, field) -+#define MPTCP_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mptcp.mptcp_statistics, field, val) - - enum - { -diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c -index d278b28035ad..c0572253c723 100644 ---- a/net/ipv4/tcp_input.c -+++ b/net/ipv4/tcp_input.c -@@ -4603,17 +4603,16 @@ static int tcp_prune_queue(struct sock *sk); - static int tcp_try_rmem_schedule(struct sock *sk, struct sk_buff *skb, - unsigned int size) - { -- if (mptcp(tcp_sk(sk))) -- sk = mptcp_meta_sk(sk); -+ struct sock *meta_sk = mptcp(tcp_sk(sk)) ? mptcp_meta_sk(sk) : sk; - -- if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf || -+ if (atomic_read(&meta_sk->sk_rmem_alloc) > meta_sk->sk_rcvbuf || - !sk_rmem_schedule(sk, skb, size)) { - -- if (tcp_prune_queue(sk) < 0) -+ if (tcp_prune_queue(meta_sk) < 0) - return -1; - - while (!sk_rmem_schedule(sk, skb, size)) { -- if (!tcp_prune_ofo_queue(sk)) -+ if (!tcp_prune_ofo_queue(meta_sk)) - return -1; - } - } -diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c -index a4fa05e5562d..2cb4c4a0ce4e 100644 ---- a/net/ipv4/tcp_output.c -+++ b/net/ipv4/tcp_output.c -@@ -1391,6 +1391,12 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, - TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; - -+#ifdef CONFIG_MPTCP -+ memcpy(TCP_SKB_CB(buff)->dss, TCP_SKB_CB(skb)->dss, -+ sizeof(TCP_SKB_CB(skb)->dss)); -+ TCP_SKB_CB(buff)->mptcp_flags = TCP_SKB_CB(skb)->mptcp_flags; -+#endif -+ - /* PSH and FIN should only be set in the second packet. */ - flags = TCP_SKB_CB(skb)->tcp_flags; - TCP_SKB_CB(skb)->tcp_flags = flags & ~(TCPHDR_FIN | TCPHDR_PSH); -@@ -1954,6 +1960,12 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len, - TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq; - TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq; - -+#ifdef CONFIG_MPTCP -+ memcpy(TCP_SKB_CB(buff)->dss, TCP_SKB_CB(skb)->dss, -+ sizeof(TCP_SKB_CB(skb)->dss)); -+ TCP_SKB_CB(buff)->mptcp_flags = TCP_SKB_CB(skb)->mptcp_flags; -+#endif -+ - /* PSH and FIN should only be set in the second packet. */ - flags = TCP_SKB_CB(skb)->tcp_flags; - TCP_SKB_CB(skb)->tcp_flags = flags & ~(TCPHDR_FIN | TCPHDR_PSH); -diff --git a/net/mptcp/mptcp_ctrl.c b/net/mptcp/mptcp_ctrl.c -index 9a1b5a048b70..e6cac7e4de31 100644 ---- a/net/mptcp/mptcp_ctrl.c -+++ b/net/mptcp/mptcp_ctrl.c -@@ -1773,6 +1773,7 @@ static int mptcp_sub_send_fin(struct sock *sk) - /* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */ - tcp_init_nondata_skb(skb, tp->write_seq, - TCPHDR_ACK | TCPHDR_FIN); -+ sk_forced_mem_schedule(sk, skb->truesize); - tcp_queue_skb(sk, skb); - } - __tcp_push_pending_frames(sk, mss_now, TCP_NAGLE_OFF); -@@ -2420,6 +2421,7 @@ struct sock *mptcp_check_req_child(struct sock *meta_sk, - * some of the fields - */ - child_tp->mptcp->rcv_low_prio = mtreq->rcv_low_prio; -+ child_tp->mptcp->low_prio = mtreq->low_prio; - - /* We should allow proper increase of the snd/rcv-buffers. Thus, we - * use the original values instead of the bloated up ones from the -diff --git a/net/mptcp/mptcp_input.c b/net/mptcp/mptcp_input.c -index 7ce97409e1e2..01a81e3f7690 100644 ---- a/net/mptcp/mptcp_input.c -+++ b/net/mptcp/mptcp_input.c -@@ -1023,6 +1023,7 @@ static int mptcp_queue_skb(struct sock *sk) - tp->copied_seq = TCP_SKB_CB(tmp1)->end_seq; - mptcp_prepare_skb(tmp1, sk); - __skb_unlink(tmp1, &sk->sk_receive_queue); -+ sk_forced_mem_schedule(meta_sk, tmp1->truesize); - /* MUST be done here, because fragstolen may be true later. - * Then, kfree_skb_partial will not account the memory. - */ -@@ -1054,6 +1055,7 @@ static int mptcp_queue_skb(struct sock *sk) - tp->copied_seq = TCP_SKB_CB(tmp1)->end_seq; - mptcp_prepare_skb(tmp1, sk); - __skb_unlink(tmp1, &sk->sk_receive_queue); -+ sk_forced_mem_schedule(meta_sk, tmp1->truesize); - /* MUST be done here, because fragstolen may be true. - * Then, kfree_skb_partial will not account the memory. - */ -diff --git a/net/mptcp/mptcp_ipv4.c b/net/mptcp/mptcp_ipv4.c -index c908e02c72e1..fbcf47c46783 100644 ---- a/net/mptcp/mptcp_ipv4.c -+++ b/net/mptcp/mptcp_ipv4.c -@@ -171,14 +171,14 @@ int mptcp_v4_do_rcv(struct sock *meta_sk, struct sk_buff *skb) - if (!sk) - goto new_subflow; - -- if (is_meta_sk(sk)) { -- WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); -- sock_put(sk); -+ if (sk->sk_state == TCP_TIME_WAIT) { -+ inet_twsk_put(inet_twsk(sk)); - goto discard; - } - -- if (sk->sk_state == TCP_TIME_WAIT) { -- inet_twsk_put(inet_twsk(sk)); -+ if (is_meta_sk(sk)) { -+ WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); -+ sock_put(sk); - goto discard; - } - -diff --git a/net/mptcp/mptcp_ipv6.c b/net/mptcp/mptcp_ipv6.c -index ebe3f5f97460..915dd7892037 100644 ---- a/net/mptcp/mptcp_ipv6.c -+++ b/net/mptcp/mptcp_ipv6.c -@@ -200,14 +200,14 @@ int mptcp_v6_do_rcv(struct sock *meta_sk, struct sk_buff *skb) - if (!sk) - goto new_subflow; - -- if (is_meta_sk(sk)) { -- WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); -- sock_put(sk); -+ if (sk->sk_state == TCP_TIME_WAIT) { -+ inet_twsk_put(inet_twsk(sk)); - goto discard; - } - -- if (sk->sk_state == TCP_TIME_WAIT) { -- inet_twsk_put(inet_twsk(sk)); -+ if (is_meta_sk(sk)) { -+ WARN("%s Did not find a sub-sk - did found the meta!\n", __func__); -+ sock_put(sk); - goto discard; - } - -diff --git a/net/mptcp/mptcp_output.c b/net/mptcp/mptcp_output.c -index a8a5787adbf1..226084d11961 100644 ---- a/net/mptcp/mptcp_output.c -+++ b/net/mptcp/mptcp_output.c -@@ -293,6 +293,7 @@ static void __mptcp_reinject_data(struct sk_buff *orig_skb, struct sock *meta_sk - void mptcp_reinject_data(struct sock *sk, int clone_it) - { - struct sock *meta_sk = mptcp_meta_sk(sk); -+ struct tcp_sock *tp = tcp_sk(sk); - struct sk_buff *skb_it, *tmp; - enum tcp_queue tcp_queue; - -@@ -320,6 +321,10 @@ void mptcp_reinject_data(struct sock *sk, int clone_it) - TCP_FRAG_IN_WRITE_QUEUE); - } - -+ /* We are emptying the rtx-queue. highest_sack is invalid */ -+ if (!clone_it) -+ tp->highest_sack = NULL; -+ - skb_it = tcp_rtx_queue_head(sk); - skb_rbtree_walk_from_safe(skb_it, tmp) { - struct tcp_skb_cb *tcb = TCP_SKB_CB(skb_it); -@@ -352,11 +357,11 @@ void mptcp_reinject_data(struct sock *sk, int clone_it) - - /* If sk has sent the empty data-fin, we have to reinject it too. */ - if (skb_it && mptcp_is_data_fin(skb_it) && skb_it->len == 0 && -- TCP_SKB_CB(skb_it)->path_mask & mptcp_pi_to_flag(tcp_sk(sk)->mptcp->path_index)) { -+ TCP_SKB_CB(skb_it)->path_mask & mptcp_pi_to_flag(tp->mptcp->path_index)) { - __mptcp_reinject_data(skb_it, meta_sk, NULL, 1, tcp_queue); - } - -- tcp_sk(sk)->pf = 1; -+ tp->pf = 1; - - mptcp_push_pending_frames(meta_sk); - } -@@ -554,9 +559,20 @@ static bool mptcp_skb_entail(struct sock *sk, struct sk_buff *skb, int reinject) - struct tcp_skb_cb *tcb; - struct sk_buff *subskb = NULL; - -- if (!reinject) -+ if (reinject) { -+ /* Make sure to update counters and MIB in case of meta-retrans -+ * AKA reinjections, similar to what is done in -+ * __tcp_retransmit_skb(). -+ */ -+ int segs = tcp_skb_pcount(skb); -+ -+ MPTCP_ADD_STATS(sock_net(meta_sk), MPTCP_MIB_RETRANSSEGS, segs); -+ tcp_sk(meta_sk)->total_retrans += segs; -+ tcp_sk(meta_sk)->bytes_retrans += skb->len; -+ } else { - TCP_SKB_CB(skb)->mptcp_flags |= (mpcb->snd_hiseq_index ? - MPTCPHDR_SEQ64_INDEX : 0); -+ } - - tcp_skb_tsorted_save(skb) { - subskb = pskb_copy_for_clone(skb, GFP_ATOMIC); -@@ -615,6 +631,7 @@ static bool mptcp_skb_entail(struct sock *sk, struct sk_buff *skb, int reinject) - - tcp_add_write_queue_tail(sk, subskb); - sk->sk_wmem_queued += subskb->truesize; -+ sk_forced_mem_schedule(sk, subskb->truesize); - sk_mem_charge(sk, subskb->truesize); - } else { - /* Necessary to initialize for tcp_transmit_skb. mss of 1, as -@@ -1483,6 +1500,7 @@ void mptcp_send_fin(struct sock *meta_sk) - tcp_init_nondata_skb(skb, meta_tp->write_seq, TCPHDR_ACK); - TCP_SKB_CB(skb)->end_seq++; - TCP_SKB_CB(skb)->mptcp_flags |= MPTCPHDR_FIN; -+ sk_forced_mem_schedule(meta_sk, skb->truesize); - tcp_queue_skb(meta_sk, skb); - } - __tcp_push_pending_frames(meta_sk, mss_now, TCP_NAGLE_OFF); -@@ -1652,7 +1670,9 @@ int mptcp_retransmit_skb(struct sock *meta_sk, struct sk_buff *skb) - */ - if (refcount_read(&meta_sk->sk_wmem_alloc) > - min(meta_sk->sk_wmem_queued + (meta_sk->sk_wmem_queued >> 2), meta_sk->sk_sndbuf)) { -- return -EAGAIN; -+ err = -EAGAIN; -+ -+ goto failed; - } - - /* We need to make sure that the retransmitted segment can be sent on a -@@ -1699,9 +1719,6 @@ int mptcp_retransmit_skb(struct sock *meta_sk, struct sk_buff *skb) - if (!mptcp_skb_entail(subsk, skb, -1)) - goto failed; - -- /* Update global TCP statistics. */ -- MPTCP_INC_STATS(sock_net(meta_sk), MPTCP_MIB_RETRANSSEGS); -- - /* Diff to tcp_retransmit_skb */ - - /* Save stamp of the first retransmit. */ -@@ -1718,6 +1735,12 @@ int mptcp_retransmit_skb(struct sock *meta_sk, struct sk_buff *skb) - - failed: - NET_INC_STATS(sock_net(meta_sk), LINUX_MIB_TCPRETRANSFAIL); -+ /* Save stamp of the first attempted retransmit. */ -+ if (!meta_tp->retrans_stamp) { -+ tcp_mstamp_refresh(meta_tp); -+ meta_tp->retrans_stamp = tcp_time_stamp(meta_tp); -+ } -+ - return err; - } - From 792fff96ed074907c1c938b4bd409deb4776651f Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 15 Sep 2022 09:08:56 +0200 Subject: [PATCH 6/7] Disable lsusb from Busybox --- config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config b/config index 1f7ed841..b9f6112f 100644 --- a/config +++ b/config @@ -29,7 +29,7 @@ CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y CONFIG_BUSYBOX_CONFIG_IOSTAT=y CONFIG_BUSYBOX_CONFIG_LOADKMAP=y CONFIG_BUSYBOX_CONFIG_LSPCI=y -CONFIG_BUSYBOX_CONFIG_LSUSB=y +# CONFIG_BUSYBOX_CONFIG_LSUSB is not set CONFIG_BUSYBOX_CONFIG_NOHUP=y CONFIG_BUSYBOX_CONFIG_PKILL=y CONFIG_BUSYBOX_CONFIG_STAT=y From 7d35b264f7326be3c48397b68f45dc86d547bdfa Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Fri, 16 Sep 2022 16:59:37 +0200 Subject: [PATCH 7/7] Disable lspci from Busybox --- config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config b/config index b9f6112f..86c585e8 100644 --- a/config +++ b/config @@ -28,7 +28,7 @@ CONFIG_BUSYBOX_CONFIG_FEATURE_VI_UNDO_QUEUE_MAX=32 CONFIG_BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_PARALLEL=y CONFIG_BUSYBOX_CONFIG_IOSTAT=y CONFIG_BUSYBOX_CONFIG_LOADKMAP=y -CONFIG_BUSYBOX_CONFIG_LSPCI=y +# CONFIG_BUSYBOX_CONFIG_LSPCI is not set # CONFIG_BUSYBOX_CONFIG_LSUSB is not set CONFIG_BUSYBOX_CONFIG_NOHUP=y CONFIG_BUSYBOX_CONFIG_PKILL=y