summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/user/barebox.rst8
-rw-r--r--arch/arm/mach-omap/xload.c9
-rw-r--r--arch/sandbox/Makefile5
-rw-r--r--commands/tftp.c4
-rw-r--r--common/blspec.c4
-rw-r--r--common/complete.c16
-rw-r--r--common/env.c48
-rw-r--r--common/environment.c2
-rw-r--r--drivers/firmware/altera_serial.c26
-rw-r--r--fs/nfs.c12
-rw-r--r--include/net.h7
-rw-r--r--lib/parameter.c2
-rw-r--r--lib/vsprintf.c29
-rw-r--r--net/dhcp.c6
-rw-r--r--net/dns.c6
-rw-r--r--net/eth.c2
-rw-r--r--net/ifup.c9
-rw-r--r--net/lib.c19
-rw-r--r--net/net.c4
-rw-r--r--net/netconsole.c2
20 files changed, 130 insertions, 90 deletions
diff --git a/Documentation/user/barebox.rst b/Documentation/user/barebox.rst
index 32cec3d97c..1203c10cd1 100644
--- a/Documentation/user/barebox.rst
+++ b/Documentation/user/barebox.rst
@@ -28,9 +28,11 @@ can be checked out as follows:
Checking connectivity... done.
Checking out files: 100% (5651/5651), done.
-After this, make sure to check out the appropriate branch. If you want to
-develop for barebox, it's best to check out the ``next`` branch rather than
-the ``master`` branch:
+By default, the master branch is checked out. If you want to develop for
+barebox, this is the right branch to send patches against.
+
+If you want to see which patches are already selected for the next release,
+you can look at the ``next`` branch:
.. code-block:: sh
diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
index 14a631ebfc..822389c38c 100644
--- a/arch/arm/mach-omap/xload.c
+++ b/arch/arm/mach-omap/xload.c
@@ -231,8 +231,10 @@ static void *am33xx_net_boot(void)
int err;
int len;
struct dhcp_req_param dhcp_param;
- const char *bootfile, *ip;
+ const char *bootfile;
+ IPaddr_t ip;
char *file;
+ char ip4_str[sizeof("255.255.255.255")];
am33xx_register_ethaddr(0, 0);
@@ -258,8 +260,9 @@ static void *am33xx_net_boot(void)
if (err)
return NULL;
- ip = ip_to_string(net_get_serverip());
- err = mount(ip, "tftp", TFTP_MOUNT, NULL);
+ ip = net_get_serverip();
+ sprintf(ip4_str, "%pI4", &ip);
+ err = mount(ip4_str, "tftp", TFTP_MOUNT, NULL);
if (err < 0) {
printf("Unable to mount.\n");
return NULL;
diff --git a/arch/sandbox/Makefile b/arch/sandbox/Makefile
index a539a901fc..8155a790eb 100644
--- a/arch/sandbox/Makefile
+++ b/arch/sandbox/Makefile
@@ -31,11 +31,6 @@ else
CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(machdirs))
endif
-SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
- -e s/arm.*/arm/ -e s/sa110/arm/ \
- -e s/s390x/s390/ -e s/parisc64/parisc/ \
- -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
-
archprepare: maketools
PHONY += maketools
diff --git a/commands/tftp.c b/commands/tftp.c
index 6a3121ad56..08366b476f 100644
--- a/commands/tftp.c
+++ b/commands/tftp.c
@@ -36,6 +36,7 @@ static int do_tftpb(int argc, char *argv[])
int tftp_push = 0;
int ret;
IPaddr_t ip;
+ char ip4_str[sizeof("255.255.255.255")];
while ((opt = getopt(argc, argv, "p")) > 0) {
switch(opt) {
@@ -73,7 +74,8 @@ static int do_tftpb(int argc, char *argv[])
goto err_free;
ip = net_get_serverip();
- ret = mount(ip_to_string(ip), "tftp", TFTP_MOUNT_PATH, NULL);
+ sprintf(ip4_str, "%pI4", &ip);
+ ret = mount(ip4_str, "tftp", TFTP_MOUNT_PATH, NULL);
if (ret)
goto err_rmdir;
diff --git a/common/blspec.c b/common/blspec.c
index 82b61f8741..ec63ddb407 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -306,7 +306,7 @@ static char *parse_nfs_url(const char *url)
if (ip == 0)
goto out;
- hostpath = basprintf("%s:%s", ip_to_string(ip), path);
+ hostpath = basprintf("%pI4:%s", &ip, path);
prevpath = nfs_find_mountpath(hostpath);
@@ -348,7 +348,7 @@ out:
* entry_is_of_compatible - check if a bootspec entry is compatible with
* the current machine.
*
- * returns true is the entry is compatible, false otherwise
+ * returns true if the entry is compatible, false otherwise
*/
static bool entry_is_of_compatible(struct blspec_entry *entry)
{
diff --git a/common/complete.c b/common/complete.c
index aee21ea183..2dab7d1dde 100644
--- a/common/complete.c
+++ b/common/complete.c
@@ -279,7 +279,7 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval)
struct env_context *c;
char *instr_param;
int len;
- char end = '=';
+ char end = '=', *pos, *dot;
char *begin = "";
if (!instr)
@@ -290,7 +290,6 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval)
end = ' ';
}
- instr_param = strchr(instr, '.');
len = strlen(instr);
c = get_current_context();
@@ -312,20 +311,21 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval)
c = c->parent;
}
- if (instr_param) {
+ pos = instr;
+ while ((dot = strchr(pos, '.'))) {
char *devname;
- len = (instr_param - instr);
-
- devname = xstrndup(instr, len);
+ devname = xstrndup(instr, dot - instr);
instr_param++;
dev = get_device_by_name(devname);
free(devname);
+
if (dev)
- device_param_complete(dev, sl, instr_param, eval);
- return 0;
+ device_param_complete(dev, sl, dot + 1, eval);
+
+ pos = dot + 1;
}
len = strlen(instr);
diff --git a/common/env.c b/common/env.c
index 6f736d5add..df8a4dff60 100644
--- a/common/env.c
+++ b/common/env.c
@@ -135,26 +135,46 @@ static const char *getenv_raw(struct list_head *l, const char *name)
return NULL;
}
-const char *getenv (const char *name)
+static const char *dev_getenv(const char *name)
{
- struct env_context *c;
- const char *val;
+ const char *pos, *val, *dot, *varname;
+ char *devname;
+ struct device_d *dev;
+
+ pos = name;
+
+ while (1) {
+ dot = strchr(pos, '.');
+ if (!dot)
+ break;
+
+ devname = xstrndup(name, dot - name);
+ varname = dot + 1;
+
+ dev = get_device_by_name(devname);
+
+ free(devname);
- if (strchr(name, '.')) {
- const char *ret = NULL;
- char *devstr = strdup(name);
- char *par = strchr(devstr, '.');
- struct device_d *dev;
- *par = 0;
- dev = get_device_by_name(devstr);
if (dev) {
- par++;
- ret = dev_get_param(dev, par);
+ val = dev_get_param(dev, varname);
+ if (val)
+ return val;
}
- free(devstr);
- return ret;
+
+ pos = dot + 1;
}
+ return NULL;
+}
+
+const char *getenv(const char *name)
+{
+ struct env_context *c;
+ const char *val;
+
+ if (strchr(name, '.'))
+ return dev_getenv(name);
+
c = context;
val = getenv_raw(&c->local, name);
diff --git a/common/environment.c b/common/environment.c
index db127d71ad..c9cef6322a 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -382,7 +382,7 @@ EXPORT_SYMBOL(envfs_save);
static int envfs_check_super(struct envfs_super *super, size_t *size)
{
if (ENVFS_32(super->magic) != ENVFS_MAGIC) {
- printf("envfs: wrong magic\n");
+ printf("envfs: no envfs (magic mismatch) - envfs newer written?\n");
return -EIO;
}
diff --git a/drivers/firmware/altera_serial.c b/drivers/firmware/altera_serial.c
index 4527d27c5c..b119778d72 100644
--- a/drivers/firmware/altera_serial.c
+++ b/drivers/firmware/altera_serial.c
@@ -35,9 +35,9 @@
*
* fpga@0 {
* compatible = "altr,fpga-passive-serial";
- * nstat-gpio = <&gpio4 18 0>;
- * confd-gpio = <&gpio4 19 0>;
- * nconfig-gpio = <&gpio4 20 0>;
+ * nstat-gpios = <&gpio4 18 0>;
+ * confd-gpios = <&gpio4 19 0>;
+ * nconfig-gpios = <&gpio4 20 0>;
* spi-max-frequency = <10000000>;
* reg = <0>;
* };
@@ -220,26 +220,24 @@ static int altera_spi_of(struct device_d *dev, struct fpga_spi *this)
const char *name;
int ret;
- name = "nstat-gpio";
- if (!of_get_property(n, name, NULL)) {
+ name = "nstat-gpios";
+ this->nstat_gpio = of_get_named_gpio(n, name, 0);
+ if (this->nstat_gpio == -ENOENT) {
dev_info(dev, "nstat-gpio is not specified, assuming it is not connected\n");
this->nstat_gpio = -1;
- } else {
- this->nstat_gpio = of_get_named_gpio(n, name, 0);
- if (this->nstat_gpio < 0) {
- ret = this->nstat_gpio;
- goto out;
- }
+ } else if (this->nstat_gpio < 0) {
+ ret = this->nstat_gpio;
+ goto out;
}
- name = "confd-gpio";
+ name = "confd-gpios";
this->confd_gpio = of_get_named_gpio(n, name, 0);
if (this->confd_gpio < 0) {
ret = this->confd_gpio;
goto out;
}
- name = "nconfig-gpio";
+ name = "nconfig-gpios";
this->nconfig_gpio = of_get_named_gpio(n, name, 0);
if (this->nconfig_gpio < 0) {
ret = this->nconfig_gpio;
@@ -330,7 +328,7 @@ out:
static struct of_device_id altera_spi_id_table[] = {
{
- .compatible = "altr,passive-serial",
+ .compatible = "altr,fpga-passive-serial",
},
};
diff --git a/fs/nfs.c b/fs/nfs.c
index 1e874d541e..97f01cfb34 100644
--- a/fs/nfs.c
+++ b/fs/nfs.c
@@ -1314,10 +1314,9 @@ static char *rootnfsopts;
static void nfs_set_rootarg(struct nfs_priv *npriv, struct fs_device_d *fsdev)
{
char *str, *tmp;
- const char *ip;
+ const char *bootargs;
- ip = ip_to_string(npriv->server);
- str = basprintf("root=/dev/nfs nfsroot=%s:%s%s%s", ip, npriv->path,
+ str = basprintf("root=/dev/nfs nfsroot=%pI4:%s%s%s", &npriv->server, npriv->path,
rootnfsopts[0] ? "," : "", rootnfsopts);
/* forward specific mount options on demand */
@@ -1333,6 +1332,13 @@ static void nfs_set_rootarg(struct nfs_priv *npriv, struct fs_device_d *fsdev)
str = tmp;
}
+ bootargs = dev_get_param(&npriv->con->edev->dev, "linux.bootargs");
+ if (bootargs) {
+ tmp = basprintf("%s %s", str, bootargs);
+ free(str);
+ str = tmp;
+ }
+
fsdev_set_linux_rootarg(fsdev, str);
free(str);
diff --git a/include/net.h b/include/net.h
index 8f857c8f85..632b6d5410 100644
--- a/include/net.h
+++ b/include/net.h
@@ -62,6 +62,7 @@ struct eth_device {
IPaddr_t netmask;
IPaddr_t gateway;
char ethaddr[6];
+ char *bootarg;
};
#define dev_to_edev(d) container_of(d, struct eth_device, dev)
@@ -257,9 +258,6 @@ static inline int net_eth_to_udplen(char *pkt)
int net_checksum_ok(unsigned char *, int); /* Return true if cksum OK */
uint16_t net_checksum(unsigned char *, int); /* Calculate the checksum */
-/* Print an IP address on the console */
-void print_IPaddr (IPaddr_t);
-
/*
* The following functions are a bit ugly, but necessary to deal with
* alignment restrictions on ARM.
@@ -308,9 +306,6 @@ static inline void net_copy_uint32(uint32_t *to, uint32_t *from)
memcpy(to, from, sizeof(uint32_t));
}
-/* Convert an IP address to a string */
-char *ip_to_string (IPaddr_t x);
-
/* Convert a string to ip address */
int string_to_ip(const char *s, IPaddr_t *ip);
diff --git a/lib/parameter.c b/lib/parameter.c
index 529d7ab92a..9f96d0760d 100644
--- a/lib/parameter.c
+++ b/lib/parameter.c
@@ -777,7 +777,7 @@ static const char *param_ip_get(struct device_d *dev, struct param_d *p)
}
free(p->value);
- p->value = xstrdup(ip_to_string(*pi->ip));
+ p->value = xasprintf("%pI4", pi->ip);
return p->value;
}
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index f3885a8201..fa9fb75800 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -191,6 +191,27 @@ static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int
}
static noinline_for_stack
+char *ip4_addr_string(char *buf, char *end, const u8 *addr, int field_width,
+ int precision, int flags, const char *fmt)
+{
+ char ip4_addr[sizeof("255.255.255.255")];
+ char *pos;
+ int i;
+
+ pos = ip4_addr;
+
+ for (i = 0; i < 4; i++) {
+ pos = number(pos, pos + 3, addr[i], 10, 0, 0, LEFT);
+ if (i < 3)
+ *pos++ = '.';
+ }
+
+ *pos = 0;
+
+ return string(buf, end, ip4_addr, field_width, precision, flags);
+}
+
+static noinline_for_stack
char *uuid_string(char *buf, char *end, const u8 *addr, int field_width,
int precision, int flags, const char *fmt)
{
@@ -267,6 +288,8 @@ char *address_val(char *buf, char *end, const void *addr,
*
* Right now we handle:
*
+ * - 'I' [4] for IPv4 addresses printed in the usual way
+ * IPv4 uses dot-separated decimal without leading 0's (1.2.3.4)
* - 'S' For symbolic direct pointers
* - 'U' For a 16 byte UUID/GUID, it prints the UUID/GUID in the form
* "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
@@ -297,6 +320,12 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field
break;
case 'a':
return address_val(buf, end, ptr, field_width, precision, flags, fmt);
+ case 'I':
+ switch (fmt[1]) {
+ case '4':
+ return ip4_addr_string(buf, end, ptr, field_width, precision, flags, fmt);
+ }
+ break;
}
flags |= SMALL;
if (field_width == -1) {
diff --git a/net/dhcp.c b/net/dhcp.c
index 792ece491b..c5386fe942 100644
--- a/net/dhcp.c
+++ b/net/dhcp.c
@@ -613,13 +613,13 @@ static void dhcp_handler(void *ctx, char *packet, unsigned int len)
debug ("%s: State REQUESTING\n", __func__);
if (dhcp_message_type((u8 *)bp->bp_vend) == DHCP_ACK ) {
+ IPaddr_t ip;
if (net_read_uint32((uint32_t *)&bp->bp_vend[0]) == htonl(BOOTP_VENDOR_MAGIC))
dhcp_options_process((u8 *)&bp->bp_vend[4], bp);
bootp_copy_net_params(bp); /* Store net params from reply */
dhcp_state = BOUND;
- puts ("DHCP client bound to address ");
- print_IPaddr(net_get_ip());
- putchar('\n');
+ ip = net_get_ip();
+ printf("DHCP client bound to address %pI4\n", &ip);
return;
}
break;
diff --git a/net/dns.c b/net/dns.c
index 2acdb935ed..700c6b0259 100644
--- a/net/dns.c
+++ b/net/dns.c
@@ -221,7 +221,7 @@ IPaddr_t resolv(const char *host)
if (string_to_ip(ns, &ip))
return 0;
- debug("resolving host %s via nameserver %s\n", host, ip_to_string(ip));
+ debug("resolving host %s via nameserver %pI4\n", host, &ip);
dns_con = net_udp_new(ip, DNS_PORT, dns_handler, NULL);
if (IS_ERR(dns_con))
@@ -258,9 +258,7 @@ static int do_host(int argc, char *argv[])
if (!ip)
printf("unknown host %s\n", argv[1]);
else {
- printf("%s is at ", argv[1]);
- print_IPaddr(ip);
- printf("\n");
+ printf("%s is at %pI4\n", argv[1], &ip);
}
return 0;
diff --git a/net/eth.c b/net/eth.c
index 6f8e78d8d3..dac2400b81 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -384,6 +384,8 @@ int eth_register(struct eth_device *edev)
dev_add_param_ip(dev, "netmask", NULL, NULL, &edev->netmask, edev);
dev_add_param_mac(dev, "ethaddr", eth_param_set_ethaddr, NULL,
edev->ethaddr, edev);
+ edev->bootarg = xstrdup("");
+ dev_add_param_string(dev, "linux.bootargs", NULL, NULL, &edev->bootarg, NULL);
if (edev->init)
edev->init(edev);
diff --git a/net/ifup.c b/net/ifup.c
index 30ac3f5861..5113d13832 100644
--- a/net/ifup.c
+++ b/net/ifup.c
@@ -106,12 +106,21 @@ int ifup(const char *name, unsigned flags)
ret = eth_set_param(dev, "serverip");
if (ret)
goto out;
+ dev_set_param(dev, "linux.bootargs", "ip=dhcp");
} else if (!strcmp(ip, "static")) {
+ char *bootarg;
for (i = 0; i < ARRAY_SIZE(vars); i++) {
ret = eth_set_param(dev, vars[i]);
if (ret)
goto out;
}
+ bootarg = basprintf("ip=%pI4:%pI4:%pI4:%pI4:::",
+ &edev->ipaddr,
+ &edev->serverip,
+ &edev->gateway,
+ &edev->netmask);
+ dev_set_param(dev, "linux.bootargs", bootarg);
+ free(bootarg);
} else {
pr_err("unknown ip type: %s\n", ip);
ret = -EINVAL;
diff --git a/net/lib.c b/net/lib.c
index f1c60c9a74..d4343bcedd 100644
--- a/net/lib.c
+++ b/net/lib.c
@@ -57,25 +57,6 @@ void ethaddr_to_string(const u8 enetaddr[6], char *str)
enetaddr[4], enetaddr[5]);
}
-void print_IPaddr(IPaddr_t x)
-{
- puts(ip_to_string(x));
-}
-
-char *ip_to_string(IPaddr_t x)
-{
- static char s[sizeof("xxx.xxx.xxx.xxx")];
-
- x = ntohl(x);
- sprintf(s, "%d.%d.%d.%d",
- (int) ((x >> 24) & 0xff),
- (int) ((x >> 16) & 0xff),
- (int) ((x >> 8) & 0xff), (int) ((x >> 0) & 0xff)
- );
-
- return s;
-}
-
int string_to_ip(const char *s, IPaddr_t *ip)
{
IPaddr_t addr = 0;
diff --git a/net/net.c b/net/net.c
index df1d677ba6..3c0e715601 100644
--- a/net/net.c
+++ b/net/net.c
@@ -78,9 +78,9 @@ IPaddr_t getenv_ip(const char *name)
int setenv_ip(const char *name, IPaddr_t ip)
{
- const char *str;
+ char str[sizeof("255.255.255.255")];
- str = ip_to_string(ip);
+ sprintf(str, "%pI4", &ip);
setenv(name, str);
diff --git a/net/netconsole.c b/net/netconsole.c
index 0ee6a7655b..ce3c418798 100644
--- a/net/netconsole.c
+++ b/net/netconsole.c
@@ -137,7 +137,7 @@ static int nc_set_active(struct console_device *cdev, unsigned flags)
net_udp_bind(priv->con, priv->port);
- pr_info("netconsole initialized with %s:%d\n", ip_to_string(priv->ip), priv->port);
+ pr_info("netconsole initialized with %pI4:%d\n", &priv->ip, priv->port);
return 0;
}