X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fplatform-powerpc.c;h=dc4abb8dccc8ce0f88285a6097d86d230895ef9b;hp=a0ddd1e106abb3f7429ec90c4ff86920e873845f;hb=fbe876dd19e4c289ba940b2e7f0ae0b23b790025;hpb=41ed6ff3d8821de44e576147e5d2402d56018af3 diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c index a0ddd1e..dc4abb8 100644 --- a/discover/platform-powerpc.c +++ b/discover/platform-powerpc.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "hostboot.h" #include "platform.h" @@ -25,7 +26,7 @@ static const char *partition = "common"; static const char *sysparams_dir = "/sys/firmware/opal/sysparams/"; static const char *devtree_dir = "/proc/device-tree/"; -static const int ipmi_timeout = 5000; /* milliseconds. */ +static const int ipmi_timeout = 10000; /* milliseconds. */ struct param { char *name; @@ -287,7 +288,7 @@ static int parse_one_interface_config(struct config *config, char *confstr) { struct interface_config *ifconf; - char *tok, *saveptr; + char *tok, *tok_gw, *tok_url, *saveptr; ifconf = talloc_zero(config, struct interface_config); @@ -320,18 +321,26 @@ static int parse_one_interface_config(struct config *config, ifconf->static_config.address = talloc_strdup(ifconf, tok); - tok = strtok_r(NULL, ",", &saveptr); - if (tok) { - ifconf->static_config.gateway = - talloc_strdup(ifconf, tok); + /* + * If a url is set but not a gateway, we can accidentally + * interpret the url as the gateway. To avoid changing the + * parameter format check if the "gateway" is actually a + * pb-url if it's the last token. + */ + tok_gw = strtok_r(NULL, ",", &saveptr); + tok_url = strtok_r(NULL, ",", &saveptr); + + if (tok_gw) { + if (tok_url || !is_url(tok_gw)) + ifconf->static_config.gateway = + talloc_strdup(ifconf, tok_gw); + else + tok_url = tok_gw; } - tok = strtok_r(NULL, ",", &saveptr); - if (tok) { + if (tok_url) ifconf->static_config.url = - talloc_strdup(ifconf, tok); - } - + talloc_strdup(ifconf, tok_url); } else { pb_log("Unknown network configuration method %s\n", tok); goto out_err; @@ -492,19 +501,6 @@ static void populate_bootdev_config(struct platform_powerpc *platform, config->n_autoboot_opts = n_new; } -static void set_proxy_variables(struct config *config) -{ - if (config->http_proxy) - setenv("http_proxy", config->http_proxy, 1); - else - unsetenv("http_proxy"); - - if (config->https_proxy) - setenv("https_proxy", config->https_proxy, 1); - else - unsetenv("https_proxy"); -} - static void populate_config(struct platform_powerpc *platform, struct config *config) { @@ -560,7 +556,6 @@ static void populate_config(struct platform_powerpc *platform, val = get_param(platform, "petitboot,https_proxy"); if (val) config->https_proxy = talloc_strdup(config, val); - set_proxy_variables(config); } static char *iface_config_str(void *ctx, struct interface_config *config) @@ -740,7 +735,6 @@ static int update_config(struct platform_powerpc *platform, update_string_config(platform, "petitboot,http_proxy", val); val = config->https_proxy ?: ""; update_string_config(platform, "petitboot,https_proxy", val); - set_proxy_variables(config); update_network_config(platform, config); @@ -1033,7 +1027,6 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info) struct platform_powerpc *platform = p->platform_data; uint16_t resp_len = 16; uint8_t resp[16], bcd; - uint32_t aux_version; int i, rc; /* Retrieve info from current side */ @@ -1051,7 +1044,7 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info) pb_debug("\n"); } - if (rc == 0 && resp_len == 16) { + if (rc == 0 && (resp_len == 12 || resp_len == 16)) { info->bmc_current = talloc_array(info, char *, 4); info->n_bmc_current = 4; @@ -1061,10 +1054,16 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info) resp[2]); bcd = resp[4] & 0x0f; bcd += 10 * (resp[4] >> 4); - memcpy(&aux_version, &resp[12], sizeof(aux_version)); + /* rev1.rev2.aux_revision */ info->bmc_current[2] = talloc_asprintf(info, - "Firmware version: %u.%02u.%05u", - resp[3], bcd, aux_version); + "Firmware version: %u.%02u", + resp[3], bcd); + if (resp_len == 16) { + info->bmc_current[2] = talloc_asprintf_append( + info->bmc_current[2], + ".%02x%02x%02x%02x", + resp[12], resp[13], resp[14], resp[15]); + } bcd = resp[5] & 0x0f; bcd += 10 * (resp[5] >> 4); info->bmc_current[3] = talloc_asprintf(info, "IPMI version: %u", @@ -1089,7 +1088,7 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info) pb_debug("\n"); } - if (rc == 0 && resp_len == 16) { + if (rc == 0 && (resp_len == 12 || resp_len == 16)) { info->bmc_golden = talloc_array(info, char *, 4); info->n_bmc_golden = 4; @@ -1099,10 +1098,16 @@ static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info) resp[2]); bcd = resp[4] & 0x0f; bcd += 10 * (resp[4] >> 4); - memcpy(&aux_version, &resp[12], sizeof(aux_version)); + /* rev1.rev2.aux_revision */ info->bmc_golden[2] = talloc_asprintf(info, - "Firmware version: %u.%02u.%u", - resp[3], bcd, aux_version); + "Firmware version: %u.%02u", + resp[3], bcd); + if (resp_len == 16) { + info->bmc_golden[2] = talloc_asprintf_append( + info->bmc_golden[2], + ".%02x%02x%02x%02x", + resp[12], resp[13], resp[14], resp[15]); + } bcd = resp[5] & 0x0f; bcd += 10 * (resp[5] >> 4); info->bmc_golden[3] = talloc_asprintf(info, "IPMI version: %u",