[OpenWrt-Devel] [PATCH v5] Add support for Ubiquiti EdgeRouter X (UBNT-ERX)

Yousong Zhou yszhou4tech at gmail.com
Fri Dec 11 00:36:08 EST 2015


                yousong


On 11 December 2015 at 13:33, Yousong Zhou <yszhou4tech at gmail.com> wrote:
> Hi, Nikolay,
>
> On 3 December 2015 at 15:16, Nikolay Martynov <mar.kolya at gmail.com> wrote:
>> 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.
>
> Try enabling SWCONFIG_LEDS and configure the trigger with
> ucidef_set_led_switch like other platforms have done.  This works for
> me with a mt7620 board.
>
>> * 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.
>
> Most of these info should go to a wiki page for the device.
>
>>
>> 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.
>
> The changelog should go below the three-dashes line (---).
>
> A few indentation issues were spotted and pointed out inline.
>
>>
>> Signed-off-by: Nikolay Martynov <mar.kolya at gmail.com>
>> ---
>>  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"
>
> bad indentation (tab replaced with blank spaces).  And this should be
> in a separate patch
>
>> +       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"
>
> bad indentation
>
>> +               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)
>
> bad indentation
>
>> +               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
>
> Indentation issues exist in this file.
>
>> @@ -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 "')
>
> hexdump alone can do the job with option -s <offset> -n <count>
>
>> +
>> +       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'
>
> Should echo to stderr >&2
>
>> +            exit 1
>
> Can we "return 1" and let the caller make the decision?
>
>> +       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
>
> ditto
>
>> +       fi
>> +}
>> +
>> +platform_upgrade_ubnt_erx() {
>> +       local factory_mtd=$(find_mtd_part factory)
>
> find_mtd_part is in another file, so better source it again here.
>
>> +       if [ ! -n "$factory_mtd" ]; then
>
> [ -z xxx ] should do
>
>> +               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}
>
> this variable is not referenced in the whole patch?

ok, it's a global defined by procd nand.sh.  the comment still slipped in...

>
>> +
>> +       #Remove volume possibly left over from stock firmware
>> +       local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
>> +       if [ ! "$ubidev" ]; then
>
> I thought [ -z "$ubidev" ] is the convention
>
>> +               local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
>> +               if [ ! "$mtdnum" ]; then
>
> ditto
>
>> +                       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
>
> ditto
>
>> +       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 at 1e003000 {
>> +               partition at 0 {
>> +                       label = "uboot";
>> +                       reg = <0x00000 0x80000>; /* 64 KB */
>> +               };
>> +
>> +               partition at 80000 {
>> +                       label = "uboot_env";
>> +                       reg = <0x80000 0x80000>; /* 64 KB */
>> +               };
>> +
>> +               partition at 100000 {
>> +                       label = "factory";
>> +                       reg = <0x100000 0x40000>;
>> +               };
>> +
>> +               partition at 140000 {
>> +                       label = "rootfs";
>> +                       reg = <0x140000 0xec0000>;
>> +               };
>> +       };
>>  };
>
> moving something from mt7621.dtsi to MT7621.dts should be in a
> separate patch with explanation.
>
>> 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 at 0 {
>> +               device_type = "memory";
>> +               reg = <0x0 0x10000000>;
>> +       };
>> +
>> +       chosen {
>> +               bootargs = "console=ttyS0,57600";
>> +       };
>> +
>> +       palmbus at 1E000000 {
>> +               spi at 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 at 0 {
>> +                               #address-cells = <1>;
>> +                               #size-cells = <1>;
>> +                               compatible = "m25p80";
>> +                               reg = <1>;
>> +                               linux,modalias = "m25p80";
>> +                               spi-max-frequency = <10000000>;
>> +
>> +                               partition at 0 {
>> +                                       label = "spi";
>> +                                       reg = <0x0 0x200000>;
>> +                                       read-only;
>> +                               };
>> +                       };
>> +               };
>> +       };
>> +
>> +       nand at 1e003000 {
>> +               compatible = "mtk,mt7621-nand";
>> +               bank-width = <2>;
>> +               reg = <0x1e003000 0x800
>> +                      0x1e003800 0x800>;
>> +               #address-cells = <1>;
>> +               #size-cells = <1>;
>> +
>> +               partition at 0 {
>> +                       label = "u-boot";
>> +                       reg = <0x0 0x80000>;
>> +                       read-only;
>> +               };
>> +
>> +               partition at 80000 {
>> +                       label = "u-boot-env";
>> +                       reg = <0x80000 0x60000>;
>> +                       read-only;
>> +               };
>> +
>> +               factory: partition at e0000 {
>> +                       label = "factory";
>> +                       reg = <0xe0000 0x60000>;
>> +               };
>> +
>> +               partition at 140000 {
>> +                       label = "kernel1";
>> +                       reg = <0x140000 0x300000>;
>> +               };
>> +
>> +               partition at 440000 {
>> +                       label = "kernel2";
>> +                       reg = <0x440000 0x300000>;
>> +               };
>> +
>> +               partition at 740000 {
>> +                       label = "ubi";
>> +                       reg = <0x740000 0xf7c0000>;
>> +               };
>> +
>> +       };
>> +
>> +       ethernet at 1e100000 {
>> +               mtd-mac-address = <&factory 0x22>;
>> +       };
>> +
>> +       pinctrl {
>> +               state_default: pinctrl0 {
>> +                       gpio {
>> +                               ralink,group = "uart2", "uart3", "i2c", "pcie", "rgmii2", "jtag";
>> +                               ralink,function = "gpio";
>> +                       };
>> +               };
>> +       };
>> +
>> +       sdhci at 1E130000 {
>> +               status = "disabled";
>> +       };
>> +
>> +       pcie at 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 at 0 {
>> -                       label = "uboot";
>> -                       reg = <0x00000 0x80000>; /* 64 KB */
>> -               };
>> -
>> -               partition at 80000 {
>> -                       label = "uboot_env";
>> -                       reg = <0x80000 0x80000>; /* 64 KB */
>> -               };
>> -
>> -               partition at 100000 {
>> -                       label = "factory";
>> -                       reg = <0x100000 0x40000>;
>> -               };
>> -
>> -               partition at 140000 {
>> -                       label = "rootfs";
>> -                       reg = <0x140000 0xec0000>;
>> -               };
>>         };
>>
>>         ethernet at 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 <mar.kolya at gmail.com>
>> +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 <mar.kolya at gmail.com>
>> +---
>> + 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:
>> --
>> 2.6.3
>> _______________________________________________
>> openwrt-devel mailing list
>> openwrt-devel at lists.openwrt.org
>> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list