From bf4630076762d9c20c16c80c1c791f352b046dd1 Mon Sep 17 00:00:00 2001 From: Brad Bishop Date: Mon, 30 Jun 2014 22:10:16 -0500 Subject: Port FFS tools over from Building Block repository. --- fcp/src/cmd_probe.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 fcp/src/cmd_probe.c (limited to 'fcp/src/cmd_probe.c') diff --git a/fcp/src/cmd_probe.c b/fcp/src/cmd_probe.c new file mode 100644 index 0000000..b0e55a8 --- /dev/null +++ b/fcp/src/cmd_probe.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) International Business Machines Corp., 2012 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * File: cmd_probe.c + * Author: Shaun Wetzstein + * Descr: probe implementation + * Date: 01/30/2013 + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include "misc.h" +#include "main.h" + +static int aa_probe(int verbose) +{ + int size = 16; + + uint16_t ports[size]; + uint32_t unique_ids[size]; + + int rc = aa_find_devices_ext(size, ports, size, unique_ids); + + fprintf(stdout, "%d aardvark(s) found:\n", rc); + + for (int i = 0; i < min(rc, 16); i++) { + if (ports[i] & AA_PORT_NOT_FREE) { + fprintf(stdout, " %d: [%04d-%06d] ===> BUSY", + ports[i] & ~AA_PORT_NOT_FREE, + unique_ids[i] / 1000000, + unique_ids[i] % 1000000); + + continue; + } + + spinor_t * nor = spinor_open(ports[i]); + if (nor == NULL) { + debug("unable to open aaflash on port '%d'\n", ports[i]); + continue; + } + + if (spinor_configure(nor) < 0) { + debug("unable to configure Aardvark on port '%d'\n", + ports[i]); + continue; + } + + fprintf(stdout, " %d: [%04d-%06d] => ", + ports[i] & ~AA_PORT_NOT_FREE, + unique_ids[i] / 1000000, unique_ids[i] % 1000000); + + spinor_id_t id; + if (spinor_read_id(nor, id) < 0) { + debug("unable to read device id\n"); + continue; + } + + fprintf(stdout, "%s %s %s", + spinor_id_mfg(id), spinor_id_type(id), + spinor_id_capacity(id)); + + fprintf(stdout, " [%2.2x %2.2x %2.2x]\n", + id[0], id[1], id[2]); + + if (spinor_close(nor) < 0) { + debug("unable to read device id\n"); + continue; + } + + nor = NULL; + } + + fprintf(stdout, "\n"); + + return 0; +} + +static int rw_probe(const char * host, int verbose) +{ + assert(host != NULL); + + rwflash_cookie_t * cookie = rwflash_cookie_open(host, verbose); + if (cookie == NULL) { + debug("unable to open rwflash on host '%s'\n", host); + return -1; + } + + if (rwflash_cookie_init(cookie) < 0) { + debug("unable to init rwflash on host '%s'\n", host); + return -1; + } + + if (rwflash_cookie_probe(cookie) < 0) { + debug("unable to probe rwflash on host '%s'\n", host); + return -1; + } + + uint8_t * id = spinor_id(rwflash_cookie_spinor(cookie)); + if (id == NULL) { + debug("invalid id rwflash on host '%s'\n", host); + return -1; + } + + fprintf(stdout, " %s ===> %s %s %s", + host, + spinor_id_mfg(id), spinor_id_type(id), + spinor_id_capacity(id)); + + fprintf(stdout, " [%2.2x %2.2x %2.2x]\n", + id[0], id[1], id[2]); + + return 0; +} + +int command_probe(args_t * args) +{ + assert(args != NULL); + + int rc = 0; + + char * type = args->dst_type; + char * target = args->dst_target; + + int verbose = args->verbose == f_VERBOSE; + + if (strcasecmp(type, TYPE_AA) == 0) { + rc = aa_probe(verbose); + } else if (strcasecmp(type, TYPE_RW) == 0) { + rc = rw_probe(target, verbose); + } else { + UNEXPECTED("NOT IMPLEMENTED YET!"); + rc = -1; + } + + return rc; +} -- cgit v1.2.1