summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeLines
...
* imx: mx6sllevk: add MAINTAINERS filePeng Fan2016-12-27-0/+7
| | | | | | | add MAINTAINERS files Signed-off-by: Peng Fan <peng.fan@nxp.com> Cc: Stefano Babic <sbabic@denx.de>
* board: samsung: update the MAINTAINERS fileJaehoon Chung2016-12-27-5/+5
| | | | | | Update the maintainer from Przemyslaw and Lukasz to me. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
* cmd: net: fix function name in commentBaruch Siach2016-12-27-1/+1
| | | | | | | | | In commit 7044c6bb6 (net: cosmetic: Clean up DHCP variables and functions) BootpCopyNetParams() was renamed to store_net_params(). Update the reference in comment. Cc: Joe Hershberger <joe.hershberger@ni.com> Signed-off-by: Baruch Siach <baruch@tkos.co.il>
* fs/ext4: Initialize group descriptor size for revision level 0 filesystemsStefan Brüns2016-12-27-0/+1
| | | | | | | | | | | genext2fs creates revision level 0 filesystems, which are not readable by u-boot due to the initialized group descriptor size field. f798b1dda1c5de818b806189e523d1b75db7e72d Reported-by: Kever Yang <kever.yang@rock-chips.com> Reported-by: FrostyBytes@protonmail.com Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Tested-by: Kever Yang <kever.yang@rock-chips.com>
* disk: Fixed capacity messageJean-Jacques Hiblot2016-12-27-2/+2
| | | | | | | | | | With capacities getting bigger, we can see see messages with negative numbers like "Capacity: 1907729.0 MB = 1863.0 GB (-387938128 x 512)". Here the printed LBA is -387938128 when it should have been 3907029168. To fix this, use the right format when displaying the unsigned integers. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Reported-by: Yan Liu <yan-liu@ti.com>
* Update Maintainer and Author's email addressAjay Bhargav2016-12-27-13/+13
| | | | | | | | I am not longer using my old email address "ajay.bhargav@einfochips.com". For U-Boot development email address is now updated to contact@8051projects.net Signed-off-by: Ajay Bhargav <contact@8051projects.net>
* tools: mkimage: Call fclose in error pathMichal Simek2016-12-27-4/+12
| | | | | | | | | | | This patch is fixing missing fclose() calls in error patch introduced by: "tools: mkimage: Use fstat instead of stat to avoid malicious hacks" (sha1: ebe0f53f48e8f9ecc823e533a85b05c13638c350) Reported-by: Coverity (CID: 155064, 155065) Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* README: remove description about CONFIG_USE_ARCH_MEMCPY/SETMasahiro Yamada2016-12-27-6/+0
| | | | | | | | | These options are now described in the Kconfig help. We do not want to maintain duplicated documentation. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com> Reviewed-by: Tom Rini <trini@konsulko.com>
* ARM: revive CONFIG_USE_ARCH_MEMCPY/MEMSET for UniPhier and TegraMasahiro Yamada2016-12-27-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit be72591bcd64 ("Kconfig: Move USE_ARCH_MEMCPY/MEMSET to Kconfig") is misconversion. The original logic in include/configs/uniphier.h was as follows: #if !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_ARM64) #define CONFIG_USE_ARCH_MEMSET #define CONFIG_USE_ARCH_MEMCPY #endif This means those configs were enabled when building U-Boot proper, but disabled when building SPL. Likewise for Tegra. Now "depends on !SPL" prevents any boards with SPL support from reaching these options. This changed the behavior for UniPhier and Tegra SoC family. Please notice these two options only control the U-Boot proper build. As you see arch/arm/Makefile, ARM-specific memset/memcpy are never compiled for SPL. So, __HAVE_ARCH_MEMCPY/MEMSET should not set for SPL. Fixes: be72591bcd64 ("Kconfig: Move USE_ARCH_MEMCPY/MEMSET to Kconfig") Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com>
* MAINTAINERS, git-mailrc: update the Power maintainerJaehoon Chung2016-12-27-2/+7
| | | | | | | | Przemyslaw didn't maintain the PMIC anymore. Update the pmic maintainer from Przeymyslaw to me. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* fs/fat: simplify get_fatent for FAT12Stefan Brüns2016-12-27-29/+5
| | | | | | | Instead of shuffling bits from two adjacent 16 bit words, use one 16 bit word with the appropriate byte offset in the buffer. Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
* fs/fat: merge readwrite get_fatent_value() with readonly get_fatent()Stefan Brüns2016-12-27-116/+27
| | | | | | | | | | | | | get_fatent_value(...) flushes changed FAT entries to disk when fetching the next FAT blocks, in every other aspect it is identical to get_fatent(...). Provide a stub implementation for flush_dirty_fat_buffer if CONFIG_FAT_WRITE is not set. Calling flush_dirty_fat_buffer during read only operation is fine as it checks if any buffers needs flushing. Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
* fs/fat: Avoid corruption of sectors following the FATStefan Brüns2016-12-27-10/+13
| | | | | | | | The FAT is read/flushed in segments of 6 (FATBUFBLOCKS) disk sectors. The last segment may be less than 6 sectors, cap the length. Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
* cmd/Kconfig: Fix typo in CMD_MEMORY help textFabio Estevam2016-12-27-2/+2
| | | | | | | Fix "Memory" and "initialize" typos in the CMD_MEMORY help text. Signed-off-by: Fabio Estevam <fabio.estevam@nxp.com> Reviewed-by: Tom Rini <trini@konsulko.com>
* fat: fatwrite: fix the command for FAT12Philipp Skadorov2016-12-27-8/+53
| | | | | | | | | | | | | | | | | | | The u-boot command fatwrite empties FAT clusters from the beginning till the end of the file. Specifically for FAT12 it fails to detect the end of the file and goes beyond the file bounds thus corrupting the file system. Additionally, FAT entry chaining-up into a file is not implemented for FAT12. The users normally workaround this by re-formatting the partition as FAT16/FAT32, like here: https://github.com/FEDEVEL/openrex-uboot-v2015.10/issues/1 The patch fixes the bounds of a file and FAT12 entries chaining into a file, including EOF markup. Signed-off-by: Philipp Skadorov <philipp.skadorov@savoirfairelinux.com>
* relocate-rela: use compiler.h endian macrosJonathan Gray2016-12-27-37/+4
| | | | | | | | | | Use the endian macros from u-boot's compiler.h instead of duplicating the definitions. This also avoids a build error on OpenBSD by removing swap64 which collides with a system definition in endian.h pulled in by inttypes.h. Signed-off-by: Jonathan Gray <jsg@jsg.id.au>
* timer: Support clocks via phandleZakharov Vlad2016-12-27-3/+14
| | | | | | | | | | | | | Earlier timer driver needed a clock-frequency property in compatible device-tree nodes. Another way is to reference a clock via a phandle. So now timer_pre_probe tries to get clock by reference through device tree. In case it is impossible to get clock device through the reference, clock-frequency property of the timer node is read to provide backward compatibility. Signed-off-by: Vlad Zakharov <vzakhar@synopsys.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* regulator: fixed: Add support to handle enable-active-high DT propertyVignesh R2016-12-27-1/+10
| | | | | | | | | Add support to handle enable-active-high DT property. This property is used to drive the gpio controlling fixed regulator as active high when claiming gpio line. Signed-off-by: Vignesh R <vigneshr@ti.com> Acked-by: Simon Glass <sjg@chromium.org>
* binman: Remove hard-coded file name for x86 CMC/FSP/VGABin Meng2016-12-26-9/+0
| | | | | | | | Now that we have added file names from Kconfig in x86 u-boot.dtsi, update binman to avoid using hard-coded names. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* x86: Add file names from Kconfig in CMC/FSP/VGA nodes in u-boot.dtsiBin Meng2016-12-26-0/+3
| | | | | | | | Since we already have a bunch of Kconfig options for CMC/FSP/VGA file names, add these from Kconfig in the corresponding dts nodes. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* x86: quark: Fix build error for quark-based boardsBin Meng2016-12-26-0/+17
| | | | | | | | | With the conversion to use binman to build x86 boards, Intel Galileo board does not build anymore due to missing ucode entry. In fact ucode is not needed for quark-based boards. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* Merge branch 'master' of git://git.denx.de/u-boot-sunxiTom Rini2016-12-23-0/+45
|\
| * sunxi: fix SID read on H3Icenowy Zheng2016-12-20-0/+45
| | | | | | | | | | | | | | | | | | | | | | | | | | H3 SID controller has some bug, which makes the initial SID value at SUNXI_SID_BASE wrong when boot. Change the SID retrieve code to call the SID Controller directly on H3, which can get the correct value, and also fix the SID value at SUNXI_SID_BASE, so that it can be used by further operations. Signed-off-by: Icenowy Zheng <icenowy@aosc.xyz> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Reviewed-by: Jagan Teki <jagan@openedev.com>
* | Merge branch 'master' of git://git.denx.de/u-boot-spiTom Rini2016-12-23-744/+2
|\ \
| * | spi: Zap armada100_spi.c and envJagan Teki2016-12-21-218/+1
| | | | | | | | | | | | | | | | | | | | | | | | armada100_spi.c and related env is zapping becuase of "no DM conversion". Cc: Ajay Bhargav <ajay.bhargav@einfochips.com> Signed-off-by: Jagan Teki <jagan@openedev.com>
| * | spi: Zap mpc52xx_spi.c, config and related codeJagan Teki2016-12-21-526/+1
| |/ | | | | | | | | | | | | | | | | armada100_spi.c, related config options and related codes are zapping becuase of "no DM conversion". Cc: Werner Pfister <Pfister_Werner@intercontrol.de> Signed-off-by: Jagan Teki <jagan@openedev.com> Reviewed-by: Tom Rini <trini@konsulko.com>
* | Merge branch 'master' of git://git.denx.de/u-boot-samsungTom Rini2016-12-23-0/+237
|\ \
| * | configs: enable the DM_PMIC and DM_I2C_GPIO for max8998 pmicJaehoon Chung2016-12-22-0/+3
| | | | | | | | | | | | | | | | | | | | | Enable the DM_PMIC and DM_I2C_GPIO for using max8998 pmic. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
| * | arm: dts: s5pc1xx-goni: add the pmic node for using DMJaehoon Chung2016-12-22-0/+165
| | | | | | | | | | | | | | | | | | | | | | | | To use driver-model adds the pmic node for max8998. This is used as kerel device-tree in Linux. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
| * | power: pmic: add the max8998 controller for DMJaehoon Chung2016-12-22-0/+69
| | | | | | | | | | | | | | | | | | | | | | | | | | | Add the max8998 controller for Driver model. Samsung S5P series are using max8998 pmic controller. In future, it should be supported the regulator framework. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
* | | mmc: Extend dependencies for zynq sdhciMichal Simek2016-12-22-1/+1
| | | | | | | | | | | | | | | | | | | | | There is hard dependency on BLK and DM_MMC which is also used by ATMEL and ROCKCHIP. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
* | | mmc: spear: remove the entire spear_sdhci.c fileJaehoon Chung2016-12-22-28/+0
|/ / | | | | | | | | | | | | | | | | Remove the entire spear_sdhci.c file. There is no use case. This is dead codes. Also there is no place to call "spear_sdhci_init()" anywhere. Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com> Reviewed-by: Tom Rini <trini@konsulko.com>
* | arm64: mvebu: Fix A8K memory mapping and add documentationKonstantin Porotchkin2016-12-21-13/+101
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix the MMU mapping for A8K device family: - Separate A7K and A8K memory mappings - Fix memory regions by including IO mapping for all 3 PCIe interfaces existing on each connected CP110 controller Add A8K memory mapping documentation with all regions configured by Marvell ATF. Change-Id: I9c930569b1853900f5fba2d5db319b092cc7a2a6 Signed-off-by: Konstantin Porotchkin <kostap@marvell.com> Signed-off-by: Stefan Roese <sr@denx.de> Cc: Stefan Roese <sr@denx.de> Cc: Nadav Haklai <nadavh@marvell.com> Cc: Neta Zur Hershkovits <neta@marvell.com> Cc: Omri Itach <omrii@marvell.com> Cc: Igal Liberman <igall@marvell.com> Cc: Haim Boot <hayim@marvell.com> Cc: Hanna Hawa <hannah@marvell.com>
* | Merge git://git.denx.de/u-boot-mpc85xxTom Rini2016-12-20-25/+36
|\ \
| * | powerpc: Retain compatible property for L2 cacheChris Packham2016-12-20-25/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | When setting the compatible property for the L2 cache ensure that we follow the documented binding by setting both "<chip>-l2-cache-controller" and "cache" as values. Signed-off-by: Chris Packham <judge.packham@gmail.com> Reviewed-by: York Sun <york.sun@nxp.com>
* | | Merge branch 'master' of git://www.denx.de/git/u-boot-microblazeTom Rini2016-12-20-263/+346
|\ \ \
| * | | ARM64: zynqmp: Replace board specific with generic memory bank decodingNathan Rossi2016-12-20-109/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The dram_init and dram_init_banksize functions were using a board specific implementation for decoding the memory banks from the fdt. This board specific implementation uses a static variable 'tmp' which makes these functions unsafe for execution from within the board_init_f context. This change makes the dram_init* functions use a generic implementation of decoding and populating memory bank and size data. Signed-off-by: Nathan Rossi <nathan@nathanrossi.com> Fixes: 8d59d7f63b ("ARM64: zynqmp: Read RAM information from DT") Cc: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | ARM: zynq: Replace board specific with generic memory bank decodingNathan Rossi2016-12-20-109/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The dram_init and dram_init_banksize functions were using a board specific implementation for decoding the memory banks from the fdt. This board specific implementation uses a static variable 'tmp' which makes these functions unsafe for execution from within the board_init_f context. This unsafe use of a static variable was causing a specific bug when using the zynq_zybo configuration, U-Boot would generate the following error during image load. This was caused due to dram_init overwriting the relocations for the 'image' variable within the do_bootm function. Out of coincidence the un-initialized memory has a compression type which is the same as the value for the relocation type R_ARM_RELATIVE. Uncompressing Invalid Image ... Unimplemented compression type 23 It should be noted that this is just one way the issue could surface, other cases my not be observed in normal boot flow. Depending on the size of various sections, and location of relocations within __rel_dyn and the compiler/linker the outcome of this bug can differ greatly. This change makes the dram_init* functions use a generic implementation of decoding and populating memory bank and size data. Signed-off-by: Nathan Rossi <nathan@nathanrossi.com> Fixes: 758f29d0f8 ("ARM: zynq: Support systems with more memory banks") Cc: Michal Simek <monstr@monstr.eu> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | fdt: add memory bank decoding functions for board setupNathan Rossi2016-12-20-0/+90
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add two functions for use by board implementations to decode the memory banks of the /memory node so as to populate the global data with ram_size and board info for memory banks. The fdtdec_setup_memory_size() function decodes the first memory bank and sets up the gd->ram_size with the size of the memory bank. This function should be called from the boards dram_init(). The fdtdec_setup_memory_banksize() function decode the memory banks (up to the CONFIG_NR_DRAM_BANKS) and populates the base address and size into the gd->bd->bi_dram array of banks. This function should be called from the boards dram_init_banksize(). Signed-off-by: Nathan Rossi <nathan@nathanrossi.com> Cc: Simon Glass <sjg@chromium.org> Cc: Michal Simek <monstr@monstr.eu> Reviewed-by: Simon Glass <sjg@chromium.org> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | ARM64: zynqmp: Add one empty line between license and nodesMichal Simek2016-12-20-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | Sync with Linux kernel. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | ARM64: zynqmp: Add missing SPL dependency for boot.bin generationMichal Simek2016-12-20-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | boot.bin file is generated only when SPL is selected. Reflect this depency in Kconfig. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | common: Fix logic in fpga programmingMichal Simek2016-12-20-4/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Stop boot process if fpga programming fails. Without this patch boot process continues even if fpga programming failed. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Simon Glass <sjg@chromium.org>
| * | | gpio: zynq: Remove empty lineMichal Simek2016-12-20-1/+0
| | | | | | | | | | | | | | | | | | | | | | | | Trivial coding style fix. Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | block: Move ceva driver to DMMichal Simek2016-12-20-19/+54
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch also includes ARM64 zynqmp changes: - Remove platform non DM initialization - Remove hardcoded sata base address Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Simon Glass <sjg@chromium.org>
| * | | dm: Add support for scsi/sata based devicesMichal Simek2016-12-20-13/+165
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | All sata based drivers are bind and corresponding block device is created. Based on this find_scsi_device() is able to get back block device based on scsi_curr_dev pointer. intr_scsi() is commented now but it can be replaced by calling find_scsi_device() and scsi_scan(). scsi_dev_desc[] is commented out but common/scsi.c heavily depends on it. That's why CONFIG_SYS_SCSI_MAX_DEVICE is hardcoded to 1 and symbol is reassigned to a block description allocated by uclass. There is only one block description by device now but it doesn't need to be correct when more devices are present. scsi_bind() ensures corresponding block device creation. uclass post_probe (scsi_post_probe()) is doing low level init. SCSI/SATA DM based drivers requires to have 64bit base address as the first entry in platform data structure to setup mmio_base. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Simon Glass <sjg@chromium.org>
| * | | ARM: dt: zynq: Add labels to cpu nodes to allow overriding OPPs.Moritz Fischer2016-12-20-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | By adding labels to the cpu nodes in the dtsi, a dts that includes it can change the OPPs by referencing the cpu0 through the label. [Based on linux (400b6a0cbef55d1ae32808eaa1ef1c28820bf6ac)] Signed-off-by: Moritz Fischer <moritz.fischer@ettus.com> Cc: Michal Simek <michal.simek@xilinx.com> Cc: u-boot@lists.denx.de Signed-off-by: Michal Simek <michal.simek@xilinx.com>
| * | | net: xilinx: Use mdio_register_seq() to support multiple instancesMichal Simek2016-12-20-6/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | axi_emac, emaclite and gem have the same issue with registering multiple instances with mdio busses. mdio bus name has to be uniq but drivers are setting up only one name for all. Use mdio_register_seq() and pass dev->seq number to allow multiple mdio instances registration. Reported-by: Phani Kiran Kara <phanikiran.kara@gmail.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
| * | | common: miiphyutil: Add helper function for mdio bus nameMichal Simek2016-12-20-0/+21
| | |/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The most of ethernet drivers are using this mdio registration sequence. strcpy(priv->bus->name, "emac"); mdio_register(priv->bus); Where driver can be used only with one MDIO bus because only unique name should be used. Other drivers are using unique device name for MDIO registration to support multiple instances. snprintf(priv->bus->name, sizeof(bus->name), "%s", name); With DM dev->seq is used more even in logs (like random MAC address generation: printf("\nWarning: %s (eth%d) using random MAC address - %pM\n", dev->name, dev->seq, pdata->enetaddr); ) where eth%d prefix is used. Simplify driver code to register mdio device with dev->seq number to simplify mdio registration and reduce code duplication across all drivers. With DM_SEQ_ALIAS enabled dev->seq reflects alias setting. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> Reviewed-by: Simon Glass <sjg@chromium.org>
* | | Merge git://git.denx.de/u-boot-dmTom Rini2016-12-20-300/+3709
|\ \ \
| * | | binman: Drop microcode features from ifdtoolSimon Glass2016-12-20-249/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now that binman supports creating images with microcode, drop the code from ifdtool. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com>