From patchwork Thu Dec 3 07:16:24 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikolay Martynov X-Patchwork-Id: 552051 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id D93B51402D2 for ; Thu, 3 Dec 2015 18:17:03 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=mUJ1HE8D; dkim-atps=neutral Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 3685328749D; Thu, 3 Dec 2015 08:16:46 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=unavailable version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id 414CF28749D for ; Thu, 3 Dec 2015 08:16:34 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 CL_IP_EQ_HELO_IP=-2 (check from: .gmail. - helo: .mail-io0-f170.google. - helo-domain: .google.) FROM/MX_MATCHES_HELO(DOMAIN)=-2; rate: -8.5 Received: from mail-io0-f170.google.com (mail-io0-f170.google.com [209.85.223.170]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Thu, 3 Dec 2015 08:16:33 +0100 (CET) Received: by ioc74 with SMTP id 74so71920823ioc.2 for ; Wed, 02 Dec 2015 23:16:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ZrgWBxpRxkZ0iISN0NmuaOAoSnp5GZmCm0kw4k+msCU=; b=mUJ1HE8Dpco5REAT92ZJ4Q93/T9dHddiqz68pE7y9DlC76eePjdaPa1ZwoaAlhEkY9 2DtN61K9j+x4nJ/PoOYR5T790cgZOyyN6V1LgPZWQorPyXgRui26mO9whn195lquxr9u cWBctf/va14y46DN7qxD+ApVoTdnVF4++zVd6Qq/wEwz+Vs6cb8YHwFuF0yHsrrZ/55o 3TFXFwjQnWpBZL1ghGkHAlqbKvsnFVvy8mJSrSTS7NWYiyfCKczM6QC5LzIKlJpP4gsW 7bJQ85HHXRDTNDw+6V999VN3e7B4B1OSs+QXKzBBXcDpKtridNwjYKPNpSpYYx5P0JU1 3Jkg== X-Received: by 10.107.155.149 with SMTP id d143mr7648712ioe.145.1449126996001; Wed, 02 Dec 2015 23:16:36 -0800 (PST) Received: from kolya-laptop.shuttercorp.net (dhcp-108-170-142-183.cable.user.start.ca. [108.170.142.183]) by smtp.gmail.com with ESMTPSA id j17sm2567847ioe.41.2015.12.02.23.16.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 02 Dec 2015 23:16:35 -0800 (PST) From: Nikolay Martynov To: blogic@openwrt.org Date: Thu, 3 Dec 2015 02:16:24 -0500 Message-Id: <1449126984-4711-1-git-send-email-mar.kolya@gmail.com> X-Mailer: git-send-email 2.6.3 In-Reply-To: <1449111828-3408-1-git-send-email-mar.kolya@gmail.com> References: <1449111828-3408-1-git-send-email-mar.kolya@gmail.com> Cc: openwrt-devel@lists.openwrt.org Subject: [OpenWrt-Devel] [PATCH v5] Add support for Ubiquiti EdgeRouter X (UBNT-ERX) X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" This router is based on MT7621 SoC, no wifi, nand. Works: * Boots. * Ethernet. * Switch. * Button (reset). * Flashing OpenWrt from stock firmware. * Upgrading OpenWrt. Doesn't work: * No GPIO leds. All leds are controlled by switch, but stock firmware was able to control them. * SoC has crypto engine but no open driver. * SoC has nat acceleration, but no open driver. * This router has 2MB spi flash soldered in but MT nand/spi drivers do not support pin sharing, so it is not accessable and disabled. Stock firmware could read it and it was empty. Unknown status: PoE support. Router has serial pins populated. If looking at the top of the router, then counting from Eth sockets pins go as: 'GND, RX, TX, GND'. 3.3v, 57600. U-boot bootloader supports tftpboot, controlled from serial. This router has two kernel partitions: 'live' and 'backup'. They are swapped during flashing (on both stock and OpenWrt). Active partition is controlled by a flag in factory partition. U-boot has cusotm command to switch active kernel partition. Kernel partitions are 'bare flash' 3MB. Stock bootloader has no UBI support. Stock rootfs is UBIFS. Flashing procedure. Stock firmware uses custom kernel patch to mount squashfs from a file that is located on UBIFS volume. This makes wiping out this volume from within stock firmware difficult. Instead this patch builds image that is flashable by stock firmware and contains initrams image (with minimal set of packages to fit into kernel partition). Once this is flashed one can reboot into initramfs OpenWrt and use sysupgrade to flash OpenWrt including rootfs into nand. Note: factory image is only built if initramfs image is enabled. v2: Fix building all mt7621 targets along with ubnt-erx. v3: Undo change to MT7621 nand partitions, make nand detection less likely to affect other nands. v4: Update as per Piotr Dymacz comments. v5: Fix upgrading code to actually upgrade kernel. Signed-off-by: Nikolay Martynov --- package/system/procd/files/nand.sh | 4 + .../linux/ramips/base-files/etc/board.d/02_network | 1 + target/linux/ramips/base-files/lib/ramips.sh | 5 +- .../ramips/base-files/lib/upgrade/platform.sh | 24 +++++ target/linux/ramips/base-files/lib/upgrade/ubnt.sh | 71 +++++++++++++ target/linux/ramips/dts/MT7621.dts | 22 ++++ target/linux/ramips/dts/UBNT-ERX.dts | 117 +++++++++++++++++++++ target/linux/ramips/dts/mt7621.dtsi | 20 ---- target/linux/ramips/image/Makefile | 61 ++++++++++- target/linux/ramips/mt7621/profiles/ubnt.mk | 17 +++ .../patches-3.18/0901-spansion_nand_id_fix.patch | 43 ++++++++ 11 files changed, 363 insertions(+), 22 deletions(-) create mode 100644 target/linux/ramips/base-files/lib/upgrade/ubnt.sh create mode 100644 target/linux/ramips/dts/UBNT-ERX.dts create mode 100644 target/linux/ramips/mt7621/profiles/ubnt.mk create mode 100644 target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch diff --git a/package/system/procd/files/nand.sh b/package/system/procd/files/nand.sh index 0c179cb..67867da 100644 --- a/package/system/procd/files/nand.sh +++ b/package/system/procd/files/nand.sh @@ -275,6 +275,10 @@ nand_upgrade_tar() { nand_do_upgrade_stage2() { local file_type=$(identify $1) + if type 'platform_nand_pre_upgrade' >/dev/null 2>/dev/null; then + platform_nand_pre_upgrade "$1" + fi + [ ! "$(find_mtd_index "$CI_UBIPART")" ] && CI_UBIPART="rootfs" case "$file_type" in diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network index 7e51229..de81553 100755 --- a/target/linux/ramips/base-files/etc/board.d/02_network +++ b/target/linux/ramips/base-files/etc/board.d/02_network @@ -122,6 +122,7 @@ ramips_setup_interfaces() f5d8235-v2|\ hg255d|\ rt-n14u|\ + ubnt-erx|\ ur-326n4g|\ wrtnode|\ wt3020|\ diff --git a/target/linux/ramips/base-files/lib/ramips.sh b/target/linux/ramips/base-files/lib/ramips.sh index 92e13c0..ba23939 100755 --- a/target/linux/ramips/base-files/lib/ramips.sh +++ b/target/linux/ramips/base-files/lib/ramips.sh @@ -349,6 +349,9 @@ ramips_board_detect() { *"TEW-692GR") name="tew-692gr" ;; + *"UBNT-ERX") + name="ubnt-erx" + ;; *"UR-326N4G") name="ur-326n4g" ;; @@ -396,7 +399,7 @@ ramips_board_detect() { ;; *"WizFi630A") name="wizfi630a" - ;; + ;; *"WL-330N") name="wl-330n" ;; diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh index 073593a..b0d624e 100755 --- a/target/linux/ramips/base-files/lib/upgrade/platform.sh +++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh @@ -181,12 +181,36 @@ platform_check_image() { } return 0 ;; + ubnt-erx) + nand_do_platform_check "$board" "$1" + return $?; + ;; esac echo "Sysupgrade is not yet supported on $board." return 1 } +platform_nand_pre_upgrade() { + local board=$(ramips_board_name) + + case "$board" in + ubnt-erx) + platform_upgrade_ubnt_erx "$ARGV" + ;; + esac +} + +platform_pre_upgrade() { + local board=$(ramips_board_name) + + case "$board" in + ubnt-erx) + nand_do_upgrade "$ARGV" + ;; + esac +} + platform_do_upgrade() { local board=$(ramips_board_name) diff --git a/target/linux/ramips/base-files/lib/upgrade/ubnt.sh b/target/linux/ramips/base-files/lib/upgrade/ubnt.sh new file mode 100644 index 0000000..0dc602b --- /dev/null +++ b/target/linux/ramips/base-files/lib/upgrade/ubnt.sh @@ -0,0 +1,71 @@ +# +# Copyright (C) 2015 OpenWrt.org +# + +UBNT_ERX_KERNEL_INDEX_OFFSET=160 + +ubnt_get_target_kernel() { + local factory_mtd=$1 + local current_kernel_index=$(dd if=${factory_mtd} bs=1 count=1 skip=$UBNT_ERX_KERNEL_INDEX_OFFSET 2>/dev/null|hexdump -e '/1 "%X "') + + if [ $current_kernel_index == "0" ]; then + echo 'kernel2' + elif [ $current_kernel_index == "1" ]; then + echo 'kernel1' + fi +} + +ubnt_update_target_kernel() { + local factory_mtd=$1 + local kernel_part=$2 + + local new_kernel_index + if [ $kernel_part == "kernel1" ]; then + new_kernel_index="\x00" + elif [ $kernel_part == "kernel2" ]; then + new_kernel_index="\x01" + else + echo 'Unknown kernel image index' + exit 1 + fi + + if ! (echo -e $new_kernel_index | dd of=${factory_mtd} bs=1 count=1 seek=$UBNT_ERX_KERNEL_INDEX_OFFSET); then + echo 'Failed to update kernel bootup index' + exit 1 + fi +} + +platform_upgrade_ubnt_erx() { + local factory_mtd=$(find_mtd_part factory) + if [ ! -n "$factory_mtd" ]; then + echo "cannot find factory partition" + exit 1 + fi + + local kernel_part="$(ubnt_get_target_kernel ${factory_mtd})" + if [ ! -n "$kernel_part" ]; then + echo "cannot find factory partition" + exit 1 + fi + + CI_KERNPART=${kernel_part} + + #Remove volume possibly left over from stock firmware + local ubidev="$( nand_find_ubi "$CI_UBIPART" )" + if [ ! "$ubidev" ]; then + local mtdnum="$( find_mtd_index "$CI_UBIPART" )" + if [ ! "$mtdnum" ]; then + echo "cannot find ubi mtd partition $CI_UBIPART" + return 1 + fi + ubiattach -m "$mtdnum" + sync + ubidev="$( nand_find_ubi "$CI_UBIPART" )" + fi + if [ -n "$ubidev" ]; then + local troot_ubivol="$( nand_find_volume $ubidev troot )" + [ "$troot_ubivol" ] && ubirmvol /dev/$ubidev -N troot || true + fi + + ubnt_update_target_kernel ${factory_mtd} ${kernel_part} +} diff --git a/target/linux/ramips/dts/MT7621.dts b/target/linux/ramips/dts/MT7621.dts index c90fc95..96f3416 100644 --- a/target/linux/ramips/dts/MT7621.dts +++ b/target/linux/ramips/dts/MT7621.dts @@ -31,4 +31,26 @@ }; }; }; + + nand@1e003000 { + partition@0 { + label = "uboot"; + reg = <0x00000 0x80000>; /* 64 KB */ + }; + + partition@80000 { + label = "uboot_env"; + reg = <0x80000 0x80000>; /* 64 KB */ + }; + + partition@100000 { + label = "factory"; + reg = <0x100000 0x40000>; + }; + + partition@140000 { + label = "rootfs"; + reg = <0x140000 0xec0000>; + }; + }; }; diff --git a/target/linux/ramips/dts/UBNT-ERX.dts b/target/linux/ramips/dts/UBNT-ERX.dts new file mode 100644 index 0000000..4aa3be9 --- /dev/null +++ b/target/linux/ramips/dts/UBNT-ERX.dts @@ -0,0 +1,117 @@ +/dts-v1/; + +/include/ "mt7621.dtsi" + +/ { + compatible = "mediatek,mt7621-eval-board", "mediatek,mt7621-soc"; + model = "UBNT-ERX"; + + memory@0 { + device_type = "memory"; + reg = <0x0 0x10000000>; + }; + + chosen { + bootargs = "console=ttyS0,57600"; + }; + + palmbus@1E000000 { + spi@b00 { + /* This board has 2Mb spi flash soldered in and visible + from manufacturer's firmware. + But this SoC shares spi and nand pins, + and current driver desn't handle this sharing well */ + status = "disabled"; + m25p80@0 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "m25p80"; + reg = <1>; + linux,modalias = "m25p80"; + spi-max-frequency = <10000000>; + + partition@0 { + label = "spi"; + reg = <0x0 0x200000>; + read-only; + }; + }; + }; + }; + + nand@1e003000 { + compatible = "mtk,mt7621-nand"; + bank-width = <2>; + reg = <0x1e003000 0x800 + 0x1e003800 0x800>; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x0 0x80000>; + read-only; + }; + + partition@80000 { + label = "u-boot-env"; + reg = <0x80000 0x60000>; + read-only; + }; + + factory: partition@e0000 { + label = "factory"; + reg = <0xe0000 0x60000>; + }; + + partition@140000 { + label = "kernel1"; + reg = <0x140000 0x300000>; + }; + + partition@440000 { + label = "kernel2"; + reg = <0x440000 0x300000>; + }; + + partition@740000 { + label = "ubi"; + reg = <0x740000 0xf7c0000>; + }; + + }; + + ethernet@1e100000 { + mtd-mac-address = <&factory 0x22>; + }; + + pinctrl { + state_default: pinctrl0 { + gpio { + ralink,group = "uart2", "uart3", "i2c", "pcie", "rgmii2", "jtag"; + ralink,function = "gpio"; + }; + }; + }; + + sdhci@1E130000 { + status = "disabled"; + }; + + pcie@1e140000 { + status = "disabled"; + }; + + gpio-keys-polled { + compatible = "gpio-keys-polled"; + #address-cells = <1>; + #size-cells = <0>; + poll-interval = <20>; + + reset { + label = "reset"; + gpios = <&gpio0 12 1>; + linux,code = <0x198>; + }; + }; +}; diff --git a/target/linux/ramips/dts/mt7621.dtsi b/target/linux/ramips/dts/mt7621.dtsi index fd2e100..c29a040 100644 --- a/target/linux/ramips/dts/mt7621.dtsi +++ b/target/linux/ramips/dts/mt7621.dtsi @@ -241,26 +241,6 @@ 0x1e003800 0x800>; #address-cells = <1>; #size-cells = <1>; - - partition@0 { - label = "uboot"; - reg = <0x00000 0x80000>; /* 64 KB */ - }; - - partition@80000 { - label = "uboot_env"; - reg = <0x80000 0x80000>; /* 64 KB */ - }; - - partition@100000 { - label = "factory"; - reg = <0x100000 0x40000>; - }; - - partition@140000 { - label = "rootfs"; - reg = <0x140000 0xec0000>; - }; }; ethernet@1e100000 { diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile index 00a2923..6230688 100644 --- a/target/linux/ramips/image/Makefile +++ b/target/linux/ramips/image/Makefile @@ -69,6 +69,51 @@ define Build/relocate-kernel mv $@.new $@ endef +define Build/ubnt-erx-factory-compat + echo '21001:6' > $@.compat + $(TAR) -cf $@ --transform='s/^.*/compat/' $@.compat + $(RM) $@.compat +endef + +define Build/ubnt-erx-factory-kernel + if [ -e $(BIN_DIR)/$(KERNEL_INITRAMFS_IMAGE) ]; then \ + $(TAR) -rf $@ --transform='s/^.*/vmlinux.tmp/' $(BIN_DIR)/$(KERNEL_INITRAMFS_IMAGE); \ + \ + md5sum --binary $(BIN_DIR)/$(KERNEL_INITRAMFS_IMAGE) | awk '{print $$1}'> $@.md5; \ + $(TAR) -rf $@ --transform='s/^.*/vmlinux.tmp.md5/' $@.md5; \ + $(RM) $@.md5; \ + fi +endef + +define Build/ubnt-erx-factory-rootfs + echo "dummy" > $@.rootfs + $(TAR) -rf $@ --transform='s/^.*/squashfs.tmp/' $@.rootfs + + md5sum --binary $@.rootfs | awk '{print $$1}'> $@.md5 + $(TAR) -rf $@ --transform='s/^.*/squashfs.tmp.md5/' $@.md5 + $(RM) $@.md5 + $(RM) $@.rootfs +endef + +define Build/ubnt-erx-factory-version + echo '$(BOARD) $(VERSION_CODE) $(VERSION_NUMBER)' > $@.version + $(TAR) -rf $@ --transform='s/^.*/version.tmp/' $@.version + $(RM) $@.version +endef + +#We need kernel+initrams fit into kernel partition +define Build/ubnt-erx-factory-check-size + @[ $$(($(subst k,* 1024,$(subst m, * 1024k,$(1))))) -ge "$$($(TAR) -xf $@ vmlinux.tmp -O | wc -c)" ] || { \ + echo "WARNING: Initramfs kernel for image $@ is too big (kernel size: $$($(TAR) -xf $@ vmlinux.tmp -O | wc -c), max size $(1))" >&2; \ + $(RM) -f $@; \ + } + + @[ "$$($(TAR) -xf $@ vmlinux.tmp -O | wc -c)" -gt 0 ] || { \ + echo "WARNING: Kernel for image $@ not found" >&2; \ + $(RM) -f $@; \ + } +endef + define MkCombineduImage $(call PatchKernelLzma,$(2),$(3)) if [ `stat -c%s "$(KDIR)/vmlinux-$(2).bin.lzma"` -gt `expr $(4) - 64` ]; then \ @@ -954,7 +999,7 @@ endif # ifeq ($(SUBTARGET),mt7621) - TARGET_DEVICES += mt7621 wsr-600 wsr-1166 dir-860l-b1 firewrt pbr-m1 re6500 sap-g3200u3 zbt-wg2626 wf-2881 + TARGET_DEVICES += mt7621 wsr-600 wsr-1166 dir-860l-b1 firewrt pbr-m1 re6500 sap-g3200u3 zbt-wg2626 wf-2881 ubnt-erx endif define Device/mt7621 @@ -1018,6 +1063,20 @@ define Device/wf-2881 IMAGE/sysupgrade.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | check-size $$$$(IMAGE_SIZE) endef +define Device/ubnt-erx + DTS := UBNT-ERX + FILESYSTEMS := squashfs + KERNEL_SIZE := 3145728 + KERNEL := $(KERNEL_DTB) | uImage lzma + IMAGES := sysupgrade.tar factory-initramfs.tar + IMAGE/factory-initramfs.tar := ubnt-erx-factory-compat | \ + ubnt-erx-factory-kernel | \ + ubnt-erx-factory-rootfs | \ + ubnt-erx-factory-version | \ + ubnt-erx-factory-check-size $$$$(KERNEL_SIZE) + IMAGE/sysupgrade.tar := sysupgrade-nand +endef + # # MT7628 Profiles # diff --git a/target/linux/ramips/mt7621/profiles/ubnt.mk b/target/linux/ramips/mt7621/profiles/ubnt.mk new file mode 100644 index 0000000..67efa60 --- /dev/null +++ b/target/linux/ramips/mt7621/profiles/ubnt.mk @@ -0,0 +1,17 @@ +# +# Copyright (C) 2015 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +define Profile/UBNT-ERX + NAME:=Ubiquiti EdgeRouter X + FEATURES += nand + PACKAGES:=-kmod-mt76 -wpad-mini +endef + +define Profile/UBNT-ERX/Description + Package set compatible with the Ubiquiti EdgeRouter X +endef +$(eval $(call Profile,UBNT-ERX)) diff --git a/target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch b/target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch new file mode 100644 index 0000000..a327674 --- /dev/null +++ b/target/linux/ramips/patches-3.18/0901-spansion_nand_id_fix.patch @@ -0,0 +1,43 @@ +From 8b61a1a33e41456ebeafa0ebe7ec0fccf859861e Mon Sep 17 00:00:00 2001 +From: Nikolay Martynov +Date: Wed, 25 Nov 2015 20:43:46 -0500 +Subject: [PATCH] mtd: nand: Fix Spansion sparearea size detection + +According to datasheet S34ML02G2 and S34ML04G2 have +larger sparea area size than was detected. + +Signed-off-by: Nikolay Martynov +--- + drivers/mtd/nand/nand_base.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/drivers/mtd/nand/nand_base.c ++++ b/drivers/mtd/nand/nand_base.c +@@ -3399,6 +3399,7 @@ static void nand_decode_ext_id(struct mt + /* + * Field definitions are in the following datasheets: + * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32) ++ * Spansion S34ML02G2 (p.33) + * New Samsung (6 byte ID): Samsung K9GAG08U0F (p.44) + * Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22) + * +@@ -3496,6 +3497,19 @@ static void nand_decode_ext_id(struct mt + *busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0; + + /* ++ * Spansion S34ML0[24]G2 have oobsize twice as large ++ * as S34ML01G2 encoded in the same bit. We ++ * differinciate them by their ID length ++ */ ++ if (id_data[0] == NAND_MFR_AMD ++ && (id_data[1] == 0xda ++ || id_data[1] == 0xdc ++ || id_data[1] == 0xca ++ || id_data[1] == 0xcc)) { ++ mtd->oobsize *= 2; ++ } ++ ++ /* + * Toshiba 24nm raw SLC (i.e., not BENAND) have 32B OOB per + * 512B page. For Toshiba SLC, we decode the 5th/6th byte as + * follows: