summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/configs/am335x_defconfig6
-rw-r--r--arch/sandbox/board/Makefile2
-rw-r--r--arch/sandbox/board/poweroff.c17
-rw-r--r--arch/sandbox/board/restart.c17
-rw-r--r--arch/sandbox/configs/sandbox_defconfig2
-rw-r--r--commands/ubi.c2
-rw-r--r--common/Kconfig1
-rw-r--r--common/boot.c2
-rw-r--r--common/bootargs.c6
-rw-r--r--common/env.c2
-rw-r--r--common/filetype.c10
-rw-r--r--common/startup.c6
-rw-r--r--common/state/state.c14
-rw-r--r--common/state/state.h2
-rw-r--r--crypto/rsa.c8
-rw-r--r--drivers/i2c/i2c.c4
-rw-r--r--drivers/net/phy/phy.c21
-rw-r--r--fs/devfs-core.c8
-rw-r--r--fs/fs.c14
-rw-r--r--fs/pstore/ram_core.c2
-rw-r--r--include/driver.h2
-rw-r--r--include/filetype.h1
-rw-r--r--include/parseopt.h2
-rw-r--r--lib/parseopt.c30
-rw-r--r--scripts/remote/main.py14
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;
diff --git a/fs/fs.c b/fs/fs.c
index 6f15e93ba9..d188fa995f 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -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],