diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-02-08 09:03:46 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-02-08 09:03:46 +0100 |
commit | 490a3c496454cea131dbd5edadbe7d7cfce4cfa8 (patch) | |
tree | 5222ffde63801a98ce90168d6be2247cc39bcfa7 | |
parent | b84f8a712ffe04def5f3d402ef9be990d485ecce (diff) | |
parent | 5316da0098c913b1e548801a57b7d5d9fd5a4d6d (diff) | |
download | barebox-490a3c496454cea131dbd5edadbe7d7cfce4cfa8.tar.gz barebox-490a3c496454cea131dbd5edadbe7d7cfce4cfa8.tar.xz |
Merge branch 'for-next/misc'
-rw-r--r-- | arch/arm/configs/am335x_defconfig | 6 | ||||
-rw-r--r-- | arch/sandbox/board/Makefile | 2 | ||||
-rw-r--r-- | arch/sandbox/board/poweroff.c | 17 | ||||
-rw-r--r-- | arch/sandbox/board/restart.c | 17 | ||||
-rw-r--r-- | arch/sandbox/configs/sandbox_defconfig | 2 | ||||
-rw-r--r-- | commands/ubi.c | 2 | ||||
-rw-r--r-- | common/Kconfig | 1 | ||||
-rw-r--r-- | common/boot.c | 2 | ||||
-rw-r--r-- | common/bootargs.c | 6 | ||||
-rw-r--r-- | common/env.c | 2 | ||||
-rw-r--r-- | common/filetype.c | 10 | ||||
-rw-r--r-- | common/startup.c | 6 | ||||
-rw-r--r-- | common/state/state.c | 14 | ||||
-rw-r--r-- | common/state/state.h | 2 | ||||
-rw-r--r-- | crypto/rsa.c | 8 | ||||
-rw-r--r-- | drivers/i2c/i2c.c | 4 | ||||
-rw-r--r-- | drivers/net/phy/phy.c | 21 | ||||
-rw-r--r-- | fs/devfs-core.c | 8 | ||||
-rw-r--r-- | fs/fs.c | 14 | ||||
-rw-r--r-- | fs/pstore/ram_core.c | 2 | ||||
-rw-r--r-- | include/driver.h | 2 | ||||
-rw-r--r-- | include/filetype.h | 1 | ||||
-rw-r--r-- | include/parseopt.h | 2 | ||||
-rw-r--r-- | lib/parseopt.c | 30 | ||||
-rw-r--r-- | scripts/remote/main.py | 14 |
25 files changed, 137 insertions, 58 deletions
diff --git a/arch/arm/configs/am335x_defconfig b/arch/arm/configs/am335x_defconfig index 5a236fbae6..09dde908a3 100644 --- a/arch/arm/configs/am335x_defconfig +++ b/arch/arm/configs/am335x_defconfig @@ -29,12 +29,14 @@ CONFIG_BOOTM_OFTREE=y CONFIG_BLSPEC=y CONFIG_CONSOLE_ACTIVATE_NONE=y CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y +CONFIG_STATE=y CONFIG_RESET_SOURCE=y CONFIG_DEBUG_INFO=y CONFIG_LONGHELP=y CONFIG_CMD_IOMEM=y CONFIG_CMD_MEMINFO=y CONFIG_CMD_ARM_MMUINFO=y +CONFIG_CMD_MMC_EXTCSD=y # CONFIG_CMD_BOOTU is not set CONFIG_CMD_BOOTZ=y CONFIG_CMD_GO=y @@ -87,7 +89,6 @@ CONFIG_CMD_OF_DISPLAY_TIMINGS=y CONFIG_CMD_OF_FIXUP_STATUS=y CONFIG_CMD_OFTREE=y CONFIG_CMD_TIME=y -CONFIG_CMD_MMC_EXTCSD=y CONFIG_CMD_STATE=y CONFIG_NET=y CONFIG_NET_NFS=y @@ -124,6 +125,7 @@ CONFIG_USB_MUSB_GADGET=y CONFIG_MCI=y CONFIG_MCI_STARTUP=y CONFIG_MCI_OMAP_HSMMC=y +CONFIG_STATE_DRV=y CONFIG_LED=y CONFIG_LED_GPIO=y CONFIG_LED_GPIO_OF=y @@ -143,5 +145,3 @@ CONFIG_FS_FAT_LFN=y CONFIG_FS_UBIFS=y CONFIG_FS_UBIFS_COMPRESSION_LZO=y CONFIG_FS_UBIFS_COMPRESSION_ZLIB=y -CONFIG_STATE=y -CONFIG_STATE_DRV=y diff --git a/arch/sandbox/board/Makefile b/arch/sandbox/board/Makefile index 333638ced6..b6c271c858 100644 --- a/arch/sandbox/board/Makefile +++ b/arch/sandbox/board/Makefile @@ -4,6 +4,6 @@ obj-y += hostfile.o obj-y += console.o obj-y += devices.o obj-y += dtb.o -obj-y += restart.o +obj-y += poweroff.o extra-y += barebox.lds diff --git a/arch/sandbox/board/poweroff.c b/arch/sandbox/board/poweroff.c new file mode 100644 index 0000000000..6b5a6dff15 --- /dev/null +++ b/arch/sandbox/board/poweroff.c @@ -0,0 +1,17 @@ +#include <common.h> +#include <init.h> +#include <poweroff.h> +#include <mach/linux.h> + +static void sandbox_poweroff(struct poweroff_handler *poweroff) +{ + linux_exit(); +} + +static int poweroff_register_feature(void) +{ + poweroff_handler_register_fn(sandbox_poweroff); + + return 0; +} +coredevice_initcall(poweroff_register_feature); diff --git a/arch/sandbox/board/restart.c b/arch/sandbox/board/restart.c deleted file mode 100644 index 79bf79a556..0000000000 --- a/arch/sandbox/board/restart.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <common.h> -#include <init.h> -#include <restart.h> -#include <mach/linux.h> - -static void sandbox_restart_cpu(struct restart_handler *restart) -{ - linux_exit(); -} - -static int restart_register_feature(void) -{ - restart_handler_register_fn(sandbox_restart_cpu); - - return 0; -} -coredevice_initcall(restart_register_feature); diff --git a/arch/sandbox/configs/sandbox_defconfig b/arch/sandbox/configs/sandbox_defconfig index dbaff12bfb..12b2479435 100644 --- a/arch/sandbox/configs/sandbox_defconfig +++ b/arch/sandbox/configs/sandbox_defconfig @@ -13,7 +13,6 @@ CONFIG_CMD_IMD=y CONFIG_CMD_MEMINFO=y # CONFIG_CMD_BOOTM is not set CONFIG_CMD_GO=y -CONFIG_CMD_RESET=y CONFIG_CMD_UIMAGE=y CONFIG_CMD_PARTITION=y CONFIG_CMD_EXPORT=y @@ -53,6 +52,7 @@ CONFIG_CMD_CRC_CMP=y CONFIG_CMD_MM=y CONFIG_CMD_DETECT=y CONFIG_CMD_FLASH=y +CONFIG_CMD_POWEROFF=y CONFIG_CMD_2048=y CONFIG_CMD_OF_NODE=y CONFIG_CMD_OF_PROPERTY=y diff --git a/commands/ubi.c b/commands/ubi.c index 5e2758400a..de5633c458 100644 --- a/commands/ubi.c +++ b/commands/ubi.c @@ -82,7 +82,7 @@ error: close(fd_vol); error_img: close(fd_img); - return ret; + return ret ? 1 : 0; } diff --git a/common/Kconfig b/common/Kconfig index 57418cadc6..93b1d89274 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -947,7 +947,6 @@ config STATE_BACKWARD_COMPATIBLE config BOOTCHOOSER bool "bootchooser infrastructure" - depends on !SHELL_NONE select BOOT select BOOTM select ENVIRONMENT_VARIABLES diff --git a/common/boot.c b/common/boot.c index cef3d5e514..41bf1ce64b 100644 --- a/common/boot.c +++ b/common/boot.c @@ -289,7 +289,7 @@ int bootentry_create_from_name(struct bootentries *bootentries, found += ret; } - if (!found) { + if (IS_ENABLED(CONFIG_COMMAND_SUPPORT) && !found) { char *path; if (*name != '/') diff --git a/common/bootargs.c b/common/bootargs.c index a89f23a3f2..f0ab689158 100644 --- a/common/bootargs.c +++ b/common/bootargs.c @@ -56,19 +56,21 @@ const char *linux_bootargs_get(void) bootargs = basprintf("%s mtdparts=%s", linux_bootargs, parts); free(linux_bootargs); - free(parts); linux_bootargs = bootargs; } + free(parts); + parts = globalvar_get_match("linux.blkdevparts.", ";"); if (strlen(parts)) { bootargs = basprintf("%s blkdevparts=%s", linux_bootargs, parts); free(linux_bootargs); - free(parts); linux_bootargs = bootargs; } + free(parts); + return linux_bootargs; } diff --git a/common/env.c b/common/env.c index 80d3f7ab50..323a82223e 100644 --- a/common/env.c +++ b/common/env.c @@ -266,7 +266,7 @@ int setenv(const char *_name, const char *value) if (strchr(name, '.')) { ret = dev_setenv(name, value); if (ret) - eprintf("Cannot set parameter: %s\n", strerror(-ret)); + eprintf("Cannot set parameter %s: %s\n", name, strerror(-ret)); goto out; } diff --git a/common/filetype.c b/common/filetype.c index f9c034ff2a..71691fd813 100644 --- a/common/filetype.c +++ b/common/filetype.c @@ -21,6 +21,7 @@ #include <asm/unaligned.h> #include <fcntl.h> #include <fs.h> +#include <libfile.h> #include <malloc.h> #include <errno.h> #include <envfs.h> @@ -343,13 +344,13 @@ enum filetype file_detect_type(const void *_buf, size_t bufsize) return filetype_unknown; } -enum filetype file_name_detect_type(const char *filename) +enum filetype file_name_detect_type_offset(const char *filename, loff_t pos) { int fd, ret; void *buf; enum filetype type = filetype_unknown; - fd = open(filename, O_RDONLY); + fd = open_and_lseek(filename, O_RDONLY, pos); if (fd < 0) return fd; @@ -368,6 +369,11 @@ err_out: return type; } +enum filetype file_name_detect_type(const char *filename) +{ + return file_name_detect_type_offset(filename, 0); +} + enum filetype cdev_detect_type(const char *name) { enum filetype type = filetype_unknown; diff --git a/common/startup.c b/common/startup.c index 432be67cd6..8b075422dd 100644 --- a/common/startup.c +++ b/common/startup.c @@ -66,6 +66,9 @@ static int mount_root(void) mount("none", "pstore", "/pstore", NULL); } + if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT)) + defaultenv_load("/env", 0); + return 0; } fs_initcall(mount_root); @@ -78,9 +81,6 @@ static int load_environment(void) default_environment_path = default_environment_path_get(); - if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT)) - defaultenv_load("/env", 0); - envfs_load(default_environment_path, "/env", 0); nvvar_load(); diff --git a/common/state/state.c b/common/state/state.c index 6399bd3736..cb979328c1 100644 --- a/common/state/state.c +++ b/common/state/state.c @@ -99,6 +99,7 @@ static int state_do_load(struct state *state, enum state_flags flags) goto out; } + state->init_from_defaults = 0; state->dirty = 0; out: @@ -153,6 +154,11 @@ void state_backend_set_readonly(struct state *state) state_storage_set_readonly(&state->storage); } +static int state_set_deny(struct param_d *p, void *priv) +{ + return -EROFS; +} + static struct state *state_new(const char *name) { struct state *state; @@ -172,12 +178,16 @@ static struct state *state_new(const char *name) } state->dirty = 1; - dev_add_param_bool(&state->dev, "dirty", NULL, NULL, &state->dirty, + dev_add_param_bool(&state->dev, "dirty", state_set_deny, NULL, &state->dirty, NULL); + state->save_on_shutdown = 1; dev_add_param_bool(&state->dev, "save_on_shutdown", NULL, NULL, &state->save_on_shutdown, NULL); + dev_add_param_bool(&state->dev, "init_from_defaults", state_set_deny, NULL, + &state->init_from_defaults, NULL); + list_add_tail(&state->list, &state_list); return state; @@ -638,6 +648,8 @@ struct state *state_new_from_node(struct device_node *node, char *path, goto out_release_state; } + state->init_from_defaults = 1; + ret = of_register_fixup(of_state_fixup, state); if (ret) { goto out_release_state; diff --git a/common/state/state.h b/common/state/state.h index fcc6b9f5cd..da1c6acaeb 100644 --- a/common/state/state.h +++ b/common/state/state.h @@ -107,7 +107,9 @@ struct state { uint32_t magic; struct list_head variables; /* Sorted list of variables */ + unsigned int dirty; + unsigned int init_from_defaults; unsigned int save_on_shutdown; struct state_backend_format *format; diff --git a/crypto/rsa.c b/crypto/rsa.c index 07bd5e34f1..591d15c415 100644 --- a/crypto/rsa.c +++ b/crypto/rsa.c @@ -341,27 +341,27 @@ int rsa_verify(const struct rsa_public_key *key, const uint8_t *sig, PS_end = T_offset - 1; if (buf[PS_end] != 0x00) { - pr_err(" = -EBADMSG [EM[T-1] == %02u]", buf[PS_end]); + pr_err(" = -EBADMSG [EM[T-1] == %02u]\n", buf[PS_end]); ret = -EBADMSG; goto out_free_digest; } for (i = 2; i < PS_end; i++) { if (buf[i] != 0xff) { - pr_err(" = -EBADMSG [EM[PS%x] == %02u]", i - 2, buf[i]); + pr_err(" = -EBADMSG [EM[PS%x] == %02u]\n", i - 2, buf[i]); ret = -EBADMSG; goto out_free_digest; } } if (memcmp(asn1_template, buf + T_offset, asn1_size) != 0) { - pr_err(" = -EBADMSG [EM[T] ASN.1 mismatch]"); + pr_err(" = -EBADMSG [EM[T] ASN.1 mismatch]\n"); ret = -EBADMSG; goto out_free_digest; } if (memcmp(hash, buf + T_offset + asn1_size, digest_length(d)) != 0) { - pr_err(" = -EKEYREJECTED [EM[T] hash mismatch]"); + pr_err(" = -EKEYREJECTED [EM[T] hash mismatch]\n"); ret = -EKEYREJECTED; goto out_free_digest; } diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c index fa2c0cd136..e9e7575585 100644 --- a/drivers/i2c/i2c.c +++ b/drivers/i2c/i2c.c @@ -184,7 +184,7 @@ int i2c_read_reg(struct i2c_client *client, u32 addr, u8 *buf, u16 count) msg->len = i; status = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); - dev_dbg(&client->dev, "%s: %u@%u --> %d\n", __func__, + dev_dbg(&client->adapter->dev, "%s: %u@%u --> %d\n", __func__, count, addr, status); if (status == ARRAY_SIZE(msg)) @@ -217,7 +217,7 @@ int i2c_write_reg(struct i2c_client *client, u32 addr, const u8 *buf, u16 count) memcpy(msg->buf + i, buf, count); status = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); - dev_dbg(&client->dev, "%s: %u@%u --> %d\n", __func__, + dev_dbg(&client->adapter->dev, "%s: %u@%u --> %d\n", __func__, count, addr, status); if (status == ARRAY_SIZE(msg)) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 35a9ce7ea8..42dcad9069 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -309,8 +309,13 @@ static struct phy_device *of_phy_register_fixed_link(struct device_node *np, phydev->dev.parent = &edev->dev; phydev->registered = 1; - phydev->speed = 1000; - phydev->duplex = 1; + phydev->link = 1; + + if (of_property_read_u32(np, "speed", &phydev->speed)) + return NULL; + phydev->duplex = of_property_read_bool(np,"full-duplex"); + phydev->pause = of_property_read_bool(np, "pause"); + phydev->asym_pause = of_property_read_bool(np, "asym-pause"); return phydev; } @@ -319,6 +324,8 @@ static struct phy_device *of_mdio_find_phy(struct eth_device *edev) { struct device_d *dev; struct device_node *phy_node; + struct mii_bus *bus; + int addr; if (!IS_ENABLED(CONFIG_OFDEVICE)) return NULL; @@ -340,6 +347,16 @@ static struct phy_device *of_mdio_find_phy(struct eth_device *edev) if (!phy_node) return NULL; + if (!of_property_read_u32(phy_node, "reg", &addr)) { + for_each_mii_bus(bus) { + if (bus->parent->device_node == phy_node->parent) { + struct phy_device *phy = mdiobus_scan(bus, addr); + if (!IS_ERR(phy)) + return phy; + } + } + } + bus_for_each_device(&mdio_bus_type, dev) { if (dev->device_node == phy_node) return container_of(dev, struct phy_device, dev); diff --git a/fs/devfs-core.c b/fs/devfs-core.c index be56edd18d..ea5887c720 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -464,7 +464,7 @@ static const struct file_operations loop_ops = { .lseek = dev_lseek_default, }; -struct cdev *cdev_create_loop(const char *path, ulong flags) +struct cdev *cdev_create_loop(const char *path, ulong flags, loff_t offset) { struct cdev *new; struct loop_priv *priv; @@ -486,15 +486,15 @@ struct cdev *cdev_create_loop(const char *path, ulong flags) new->priv = priv; ofs = lseek(priv->fd, 0, SEEK_END); - if (ofs < 0) { + if (ofs < 0 || ofs <= offset) { free(new); free(priv); return NULL; } - lseek(priv->fd, 0, SEEK_SET); + lseek(priv->fd, offset, SEEK_SET); new->size = ofs; - new->offset = 0; + new->offset = offset; new->dev = NULL; new->flags = 0; @@ -1279,11 +1279,13 @@ static const char *detect_fs(const char *filename, const char *fsoptions) enum filetype type; struct driver_d *drv; struct fs_driver_d *fdrv; - bool loop; + bool loop = false; + unsigned long long offset = 0; parseopt_b(fsoptions, "loop", &loop); + parseopt_llu_suffix(fsoptions, "offset", &offset); if (loop) - type = file_name_detect_type(filename); + type = file_name_detect_type_offset(filename, offset); else type = cdev_detect_type(filename); @@ -1302,9 +1304,13 @@ static const char *detect_fs(const char *filename, const char *fsoptions) int fsdev_open_cdev(struct fs_device_d *fsdev) { + unsigned long long offset = 0; + parseopt_b(fsdev->options, "loop", &fsdev->loop); + parseopt_llu_suffix(fsdev->options, "offset", &offset); if (fsdev->loop) - fsdev->cdev = cdev_create_loop(fsdev->backingstore, O_RDWR); + fsdev->cdev = cdev_create_loop(fsdev->backingstore, O_RDWR, + offset); else fsdev->cdev = cdev_open(fsdev->backingstore, O_RDWR); if (!fsdev->cdev) @@ -1392,6 +1398,8 @@ int mount(const char *device, const char *fsname, const char *_path, fsdev_set_linux_rootarg(fsdev, str); } + free(path); + return 0; err_no_driver: diff --git a/fs/pstore/ram_core.c b/fs/pstore/ram_core.c index d68d80900b..9de6dc614d 100644 --- a/fs/pstore/ram_core.c +++ b/fs/pstore/ram_core.c @@ -219,7 +219,7 @@ static int persistent_ram_init_ecc(struct persistent_ram_zone *prz, pr_info("error in header, %d\n", numerr); prz->corrected_bytes += numerr; } else if (numerr < 0) { - pr_info("uncorrectable error in header\n"); + pr_debug("No valid data in block, assuming it is empty\n"); prz->bad_blocks++; } diff --git a/include/driver.h b/include/driver.h index e571fbbec5..f37805db17 100644 --- a/include/driver.h +++ b/include/driver.h @@ -475,7 +475,7 @@ struct cdev *cdev_readlink(struct cdev *cdev); struct cdev *cdev_by_device_node(struct device_node *node); struct cdev *cdev_by_partuuid(const char *partuuid); struct cdev *cdev_open(const char *name, unsigned long flags); -struct cdev *cdev_create_loop(const char *path, ulong flags); +struct cdev *cdev_create_loop(const char *path, ulong flags, loff_t offset); void cdev_remove_loop(struct cdev *cdev); int cdev_do_open(struct cdev *, unsigned long flags); void cdev_close(struct cdev *cdev); diff --git a/include/filetype.h b/include/filetype.h index b98dcb5014..ec5aea2635 100644 --- a/include/filetype.h +++ b/include/filetype.h @@ -50,6 +50,7 @@ const char *file_type_to_short_string(enum filetype f); enum filetype file_detect_partition_table(const void *_buf, size_t bufsize); enum filetype file_detect_type(const void *_buf, size_t bufsize); enum filetype file_name_detect_type(const char *filename); +enum filetype file_name_detect_type_offset(const char *filename, loff_t pos); enum filetype cdev_detect_type(const char *name); enum filetype is_fat_or_mbr(const unsigned char *sector, unsigned long *bootsec); int is_fat_boot_sector(const void *_buf); diff --git a/include/parseopt.h b/include/parseopt.h index 1f9763f8c9..273a371ac3 100644 --- a/include/parseopt.h +++ b/include/parseopt.h @@ -1,5 +1,7 @@ #ifndef __PARSEOPT_H__ #define __PARSEOPT_H__ +void parseopt_llu_suffix(const char *options, const char *opt, + unsigned long long *val); void parseopt_b(const char *options, const char *opt, bool *val); void parseopt_hu(const char *options, const char *opt, unsigned short *val); diff --git a/lib/parseopt.c b/lib/parseopt.c index 8211733e3b..70983066d9 100644 --- a/lib/parseopt.c +++ b/lib/parseopt.c @@ -122,3 +122,33 @@ again: *val = xstrndup(parsed, endp - parsed); } + +void parseopt_llu_suffix(const char *options, const char *opt, + unsigned long long *val) +{ + const char *start; + size_t optlen = strlen(opt); + unsigned long long v; + char *endp; + +again: + start = strstr(options, opt); + + if (!start) + return; + + if (start > options && start[-1] != ',') { + options = start; + goto again; + } + + if (start[optlen] != '=') { + options = start; + goto again; + } + + v = strtoull_suffix(start + optlen + 1, &endp, 0); + + if (*endp == ',' || *endp == '\0') + *val = v; +} diff --git a/scripts/remote/main.py b/scripts/remote/main.py index bd304723bb..79203df05a 100644 --- a/scripts/remote/main.py +++ b/scripts/remote/main.py @@ -139,15 +139,15 @@ parser_run.set_defaults(func=handle_run) parser_ping = subparsers.add_parser('ping', help="test connection") parser_ping.set_defaults(func=handle_ping) -parser_ping = subparsers.add_parser('getenv', help="get a barebox environment variable") -parser_ping.add_argument('arg', nargs='+', help="variable name") -parser_ping.set_defaults(func=handle_getenv) +parser_getenv = subparsers.add_parser('getenv', help="get a barebox environment variable") +parser_getenv.add_argument('arg', nargs='+', help="variable name") +parser_getenv.set_defaults(func=handle_getenv) -parser_run = subparsers.add_parser('listen', help="listen for an incoming connection") -parser_run.set_defaults(func=handle_listen) +parser_listen = subparsers.add_parser('listen', help="listen for an incoming connection") +parser_listen.set_defaults(func=handle_listen) -parser_run = subparsers.add_parser('console', help="connect to the console") -parser_run.set_defaults(func=handle_console) +parser_console = subparsers.add_parser('console', help="connect to the console") +parser_console.set_defaults(func=handle_console) args = parser.parse_args() logging.basicConfig(level=VERBOSITY[args.verbose], |