diff --git a/Documentation/user/barebox.rst b/Documentation/user/barebox.rst index 32cec3d..1203c10 100644 --- a/Documentation/user/barebox.rst +++ b/Documentation/user/barebox.rst @@ -28,9 +28,11 @@ 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 14a631e..822389c 100644 --- a/arch/arm/mach-omap/xload.c +++ b/arch/arm/mach-omap/xload.c @@ -231,8 +231,10 @@ 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 @@ 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 a539a90..8155a79 100644 --- a/arch/sandbox/Makefile +++ b/arch/sandbox/Makefile @@ -31,11 +31,6 @@ 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 6a3121a..08366b4 100644 --- a/commands/tftp.c +++ b/commands/tftp.c @@ -36,6 +36,7 @@ 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 @@ 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 82b61f8..ec63ddb 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -306,7 +306,7 @@ 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 @@ * 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 aee21ea..2dab7d1 100644 --- a/common/complete.c +++ b/common/complete.c @@ -279,7 +279,7 @@ struct env_context *c; char *instr_param; int len; - char end = '='; + char end = '=', *pos, *dot; char *begin = ""; if (!instr) @@ -290,7 +290,6 @@ end = ' '; } - instr_param = strchr(instr, '.'); len = strlen(instr); c = get_current_context(); @@ -312,20 +311,21 @@ 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 6f736d5..df8a4df 100644 --- a/common/env.c +++ b/common/env.c @@ -135,25 +135,45 @@ return NULL; } -const char *getenv (const char *name) +static const char *dev_getenv(const char *name) +{ + 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 (dev) { + val = dev_get_param(dev, varname); + if (val) + return val; + } + + pos = dot + 1; + } + + return NULL; +} + +const char *getenv(const char *name) { struct env_context *c; const char *val; - 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); - } - free(devstr); - return ret; - } + if (strchr(name, '.')) + return dev_getenv(name); c = context; diff --git a/common/environment.c b/common/environment.c index db127d7..c9cef63 100644 --- a/common/environment.c +++ b/common/environment.c @@ -382,7 +382,7 @@ 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 4527d27..b119778 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 @@ 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 @@ 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 1e874d5..97f01cf 100644 --- a/fs/nfs.c +++ b/fs/nfs.c @@ -1314,10 +1314,9 @@ 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 @@ 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 8f857c8..632b6d5 100644 --- a/include/net.h +++ b/include/net.h @@ -62,6 +62,7 @@ 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 @@ 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 @@ 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 529d7ab..9f96d07 100644 --- a/lib/parameter.c +++ b/lib/parameter.c @@ -777,7 +777,7 @@ } 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 f3885a8..fa9fb75 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -191,6 +191,27 @@ } 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 @@ * * 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 @@ 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 792ece4..c5386fe 100644 --- a/net/dhcp.c +++ b/net/dhcp.c @@ -613,13 +613,13 @@ 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 2acdb93..700c6b0 100644 --- a/net/dns.c +++ b/net/dns.c @@ -221,7 +221,7 @@ 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 @@ 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 6f8e78d..dac2400 100644 --- a/net/eth.c +++ b/net/eth.c @@ -384,6 +384,8 @@ 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 30ac3f5..5113d13 100644 --- a/net/ifup.c +++ b/net/ifup.c @@ -106,12 +106,21 @@ 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 f1c60c9..d4343bc 100644 --- a/net/lib.c +++ b/net/lib.c @@ -57,25 +57,6 @@ 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 df1d677..3c0e715 100644 --- a/net/net.c +++ b/net/net.c @@ -78,9 +78,9 @@ 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 0ee6a76..ce3c418 100644 --- a/net/netconsole.c +++ b/net/netconsole.c @@ -137,7 +137,7 @@ 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; }