diff options
Diffstat (limited to 'usr.sbin/mfiutil/mfi_flash.c')
-rw-r--r-- | usr.sbin/mfiutil/mfi_flash.c | 199 |
1 files changed, 0 insertions, 199 deletions
diff --git a/usr.sbin/mfiutil/mfi_flash.c b/usr.sbin/mfiutil/mfi_flash.c deleted file mode 100644 index 5dd93f1..0000000 --- a/usr.sbin/mfiutil/mfi_flash.c +++ /dev/null @@ -1,199 +0,0 @@ -/*- - * Copyright (c) 2008, 2009 Yahoo!, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The names of the authors may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/param.h> -#include <sys/errno.h> -#include <sys/stat.h> -#include <err.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "mfiutil.h" - -#define FLASH_BUF_SIZE (64 * 1024) - -int fw_name_width, fw_version_width, fw_date_width, fw_time_width; - -static void -scan_firmware(struct mfi_info_component *comp) -{ - int len; - - len = strlen(comp->name); - if (fw_name_width < len) - fw_name_width = len; - len = strlen(comp->version); - if (fw_version_width < len) - fw_version_width = len; - len = strlen(comp->build_date); - if (fw_date_width < len) - fw_date_width = len; - len = strlen(comp->build_time); - if (fw_time_width < len) - fw_time_width = len; -} - -static void -display_firmware(struct mfi_info_component *comp) -{ - - printf("%-*s %-*s %-*s %-*s\n", fw_name_width, comp->name, - fw_version_width, comp->version, fw_date_width, comp->build_date, - fw_time_width, comp->build_time); -} - -static void -display_pending_firmware(int fd) -{ - struct mfi_ctrl_info info; - struct mfi_info_component header; - u_int i; - - if (mfi_ctrl_get_info(fd, &info, NULL) < 0) { - warn("Failed to get controller info"); - return; - } - - printf("mfi%d Pending Firmware Images:\n", mfi_unit); - strcpy(header.name, "Name"); - strcpy(header.version, "Version"); - strcpy(header.build_date, "Date"); - strcpy(header.build_time, "Time"); - scan_firmware(&header); - if (info.pending_image_component_count > 8) - info.pending_image_component_count = 8; - for (i = 0; i < info.pending_image_component_count; i++) - scan_firmware(&info.pending_image_component[i]); - display_firmware(&header); - for (i = 0; i < info.pending_image_component_count; i++) - display_firmware(&info.pending_image_component[i]); -} - -static void -mbox_store_word(uint8_t *mbox, uint32_t val) -{ - - mbox[0] = val & 0xff; - mbox[1] = val >> 8 & 0xff; - mbox[2] = val >> 16 & 0xff; - mbox[3] = val >> 24; -} - -static int -flash_adapter(int ac, char **av) -{ - struct mfi_progress dummy; - off_t offset; - size_t nread; - char *buf; - struct stat sb; - int fd, flash; - uint8_t mbox[4], status; - - if (ac != 2) { - warnx("flash: Firmware file required"); - return (EINVAL); - } - - flash = open(av[1], O_RDONLY); - if (flash < 0) { - warn("flash: Failed to open %s", av[1]); - return (errno); - } - - if (fstat(flash, &sb) < 0) { - warn("fstat(%s)", av[1]); - return (errno); - } - if (sb.st_size % 1024 != 0 || sb.st_size > 0x7fffffff) { - warnx("Invalid flash file size"); - return (EINVAL); - } - - fd = mfi_open(mfi_unit); - if (fd < 0) { - warn("mfi_open"); - return (errno); - } - - /* First, ask the firmware to allocate space for the flash file. */ - mbox_store_word(mbox, sb.st_size); - mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_OPEN, NULL, 0, mbox, 4, &status); - if (status != MFI_STAT_OK) { - warnx("Failed to alloc flash memory: %s", mfi_status(status)); - return (EIO); - } - - /* Upload the file 64k at a time. */ - buf = malloc(FLASH_BUF_SIZE); - offset = 0; - while (sb.st_size > 0) { - nread = read(flash, buf, FLASH_BUF_SIZE); - if (nread <= 0 || nread % 1024 != 0) { - warnx("Bad read from flash file"); - mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_CLOSE, NULL, 0, - NULL, 0, NULL); - return (ENXIO); - } - - mbox_store_word(mbox, offset); - mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_DOWNLOAD, buf, nread, - mbox, 4, &status); - if (status != MFI_STAT_OK) { - warnx("Flash download failed: %s", mfi_status(status)); - mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_CLOSE, NULL, 0, - NULL, 0, NULL); - return (ENXIO); - } - sb.st_size -= nread; - offset += nread; - } - close(flash); - - /* Kick off the flash. */ - printf("WARNING: Firmware flash in progress, do not reboot machine... "); - fflush(stdout); - mfi_dcmd_command(fd, MFI_DCMD_FLASH_FW_FLASH, &dummy, sizeof(dummy), - NULL, 0, &status); - if (status != MFI_STAT_OK) { - printf("failed:\n\t%s\n", mfi_status(status)); - return (ENXIO); - } - printf("finished\n"); - display_pending_firmware(fd); - - close(fd); - - return (0); -} -MFI_COMMAND(top, flash, flash_adapter); |