1ee7a2acaSSean Bruno /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 31de7b4b8SPedro F. Giffuni * 4ee7a2acaSSean Bruno * Copyright (c) 2013 Yahoo!, Inc. 5ee7a2acaSSean Bruno * All rights reserved. 6ee7a2acaSSean Bruno * 7ee7a2acaSSean Bruno * Redistribution and use in source and binary forms, with or without 8ee7a2acaSSean Bruno * modification, are permitted provided that the following conditions 9ee7a2acaSSean Bruno * are met: 10ee7a2acaSSean Bruno * 1. Redistributions of source code must retain the above copyright 11ee7a2acaSSean Bruno * notice, this list of conditions and the following disclaimer. 12ee7a2acaSSean Bruno * 2. Redistributions in binary form must reproduce the above copyright 13ee7a2acaSSean Bruno * notice, this list of conditions and the following disclaimer in the 14ee7a2acaSSean Bruno * documentation and/or other materials provided with the distribution. 15ee7a2acaSSean Bruno * 16ee7a2acaSSean Bruno * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17ee7a2acaSSean Bruno * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18ee7a2acaSSean Bruno * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19ee7a2acaSSean Bruno * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20ee7a2acaSSean Bruno * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21ee7a2acaSSean Bruno * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22ee7a2acaSSean Bruno * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23ee7a2acaSSean Bruno * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24ee7a2acaSSean Bruno * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25ee7a2acaSSean Bruno * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ee7a2acaSSean Bruno * SUCH DAMAGE. 27ee7a2acaSSean Bruno * 28ee7a2acaSSean Bruno * 29ee7a2acaSSean Bruno * $FreeBSD$ 30ee7a2acaSSean Bruno */ 31ee7a2acaSSean Bruno 32ee7a2acaSSean Bruno #include <sys/errno.h> 33ee7a2acaSSean Bruno #include <sys/ioctl.h> 34ee7a2acaSSean Bruno #include <sys/param.h> 35ee7a2acaSSean Bruno #include <sys/sysctl.h> 36ee7a2acaSSean Bruno #include <sys/uio.h> 37ee7a2acaSSean Bruno 38ee7a2acaSSean Bruno #include <err.h> 39ee7a2acaSSean Bruno #include <fcntl.h> 40ee7a2acaSSean Bruno #include <stdio.h> 41ee7a2acaSSean Bruno #include <stdlib.h> 42ee7a2acaSSean Bruno #include <string.h> 43ee7a2acaSSean Bruno #include <unistd.h> 44ee7a2acaSSean Bruno 45ee7a2acaSSean Bruno #include "mfiutil.h" 46ee7a2acaSSean Bruno #include <dev/mfi/mfi_ioctl.h> 47ee7a2acaSSean Bruno 48ee7a2acaSSean Bruno MFI_TABLE(top, ctrlprop); 49ee7a2acaSSean Bruno 50ee7a2acaSSean Bruno static int 51ee7a2acaSSean Bruno mfi_ctrl_get_properties(int fd, struct mfi_ctrl_props *info) 52ee7a2acaSSean Bruno { 53ee7a2acaSSean Bruno 54ee7a2acaSSean Bruno return (mfi_dcmd_command(fd, MFI_DCMD_CTRL_GET_PROPS, info, 55ee7a2acaSSean Bruno sizeof(struct mfi_ctrl_props), NULL, 0, NULL)); 56ee7a2acaSSean Bruno } 57ee7a2acaSSean Bruno 58ee7a2acaSSean Bruno static int 59ee7a2acaSSean Bruno mfi_ctrl_set_properties(int fd, struct mfi_ctrl_props *info) 60ee7a2acaSSean Bruno { 61ee7a2acaSSean Bruno 62ee7a2acaSSean Bruno return (mfi_dcmd_command(fd, MFI_DCMD_CTRL_SET_PROPS, info, 63ee7a2acaSSean Bruno sizeof(struct mfi_ctrl_props), NULL, 0, NULL)); 64ee7a2acaSSean Bruno } 65ee7a2acaSSean Bruno 66ee7a2acaSSean Bruno /* 67*56ca9ef0SElyes Haouas * aquite the controller properties data structure modify the 68*56ca9ef0SElyes Haouas * rebuild rate if requested and then return 69ee7a2acaSSean Bruno */ 70ee7a2acaSSean Bruno static int 71ee7a2acaSSean Bruno mfi_ctrl_rebuild_rate(int ac, char **av) 72ee7a2acaSSean Bruno { 73ee7a2acaSSean Bruno int error, fd; 74ee7a2acaSSean Bruno struct mfi_ctrl_props ctrl_props; 75ee7a2acaSSean Bruno 76ee7a2acaSSean Bruno if (ac > 2) { 77ee7a2acaSSean Bruno warn("mfi_ctrl_set_rebuild_rate"); 78ee7a2acaSSean Bruno return(-1); 79ee7a2acaSSean Bruno } 80ee7a2acaSSean Bruno 817e0f8b79SDoug Ambrisko fd = mfi_open(mfi_device, O_RDWR); 82ee7a2acaSSean Bruno if (fd < 0) { 83ee7a2acaSSean Bruno error = errno; 84ee7a2acaSSean Bruno warn("mfi_open"); 85ee7a2acaSSean Bruno return (error); 86ee7a2acaSSean Bruno } 87ee7a2acaSSean Bruno 88ee7a2acaSSean Bruno error = mfi_ctrl_get_properties(fd, &ctrl_props); 89ee7a2acaSSean Bruno if ( error < 0) { 90ee7a2acaSSean Bruno error = errno; 91ee7a2acaSSean Bruno warn("Failed to get controller properties"); 92ee7a2acaSSean Bruno close(fd); 93ee7a2acaSSean Bruno return (error); 94ee7a2acaSSean Bruno } 95ee7a2acaSSean Bruno /* 96ee7a2acaSSean Bruno * User requested a change to the rebuild rate 97ee7a2acaSSean Bruno */ 98ee7a2acaSSean Bruno if (ac > 1) { 99ee7a2acaSSean Bruno ctrl_props.rebuild_rate = atoi(av[ac - 1]); 100ee7a2acaSSean Bruno error = mfi_ctrl_set_properties(fd, &ctrl_props); 101ee7a2acaSSean Bruno if ( error < 0) { 102ee7a2acaSSean Bruno error = errno; 103ee7a2acaSSean Bruno warn("Failed to set controller properties"); 104ee7a2acaSSean Bruno close(fd); 105ee7a2acaSSean Bruno return (error); 106ee7a2acaSSean Bruno } 107ee7a2acaSSean Bruno 108ee7a2acaSSean Bruno error = mfi_ctrl_get_properties(fd, &ctrl_props); 109ee7a2acaSSean Bruno if ( error < 0) { 110ee7a2acaSSean Bruno error = errno; 111ee7a2acaSSean Bruno warn("Failed to get controller properties"); 112ee7a2acaSSean Bruno close(fd); 113ee7a2acaSSean Bruno return (error); 114ee7a2acaSSean Bruno } 115ee7a2acaSSean Bruno } 116ee7a2acaSSean Bruno printf ("controller rebuild rate: %%%u \n", 117ee7a2acaSSean Bruno ctrl_props.rebuild_rate); 118ee7a2acaSSean Bruno return (0); 119ee7a2acaSSean Bruno } 120ee7a2acaSSean Bruno MFI_COMMAND(ctrlprop, rebuild, mfi_ctrl_rebuild_rate); 121ee7a2acaSSean Bruno 122ee7a2acaSSean Bruno static int 123ee7a2acaSSean Bruno mfi_ctrl_alarm_enable(int ac, char **av) 124ee7a2acaSSean Bruno { 125ee7a2acaSSean Bruno int error, fd; 126ee7a2acaSSean Bruno struct mfi_ctrl_props ctrl_props; 127ee7a2acaSSean Bruno 128ee7a2acaSSean Bruno if (ac > 2) { 129ee7a2acaSSean Bruno warn("mfi_ctrl_alarm_enable"); 130ee7a2acaSSean Bruno return(-1); 131ee7a2acaSSean Bruno } 132ee7a2acaSSean Bruno 1337e0f8b79SDoug Ambrisko fd = mfi_open(mfi_device, O_RDWR); 134ee7a2acaSSean Bruno if (fd < 0) { 135ee7a2acaSSean Bruno error = errno; 136ee7a2acaSSean Bruno warn("mfi_open"); 137ee7a2acaSSean Bruno return (error); 138ee7a2acaSSean Bruno } 139ee7a2acaSSean Bruno 140ee7a2acaSSean Bruno error = mfi_ctrl_get_properties(fd, &ctrl_props); 141ee7a2acaSSean Bruno if ( error < 0) { 142ee7a2acaSSean Bruno error = errno; 143ee7a2acaSSean Bruno warn("Failed to get controller properties"); 144ee7a2acaSSean Bruno close(fd); 145ee7a2acaSSean Bruno return (error); 146ee7a2acaSSean Bruno } 147ee7a2acaSSean Bruno printf ("controller alarm was : %s\n", 148ee7a2acaSSean Bruno (ctrl_props.alarm_enable ? "enabled" : "disabled")); 149ee7a2acaSSean Bruno 150ee7a2acaSSean Bruno if (ac > 1) { 151ee7a2acaSSean Bruno ctrl_props.alarm_enable = atoi(av[ac - 1]); 152ee7a2acaSSean Bruno error = mfi_ctrl_set_properties(fd, &ctrl_props); 153ee7a2acaSSean Bruno if ( error < 0) { 154ee7a2acaSSean Bruno error = errno; 155ee7a2acaSSean Bruno warn("Failed to set controller properties"); 156ee7a2acaSSean Bruno close(fd); 157ee7a2acaSSean Bruno return (error); 158ee7a2acaSSean Bruno } 159ee7a2acaSSean Bruno 160ee7a2acaSSean Bruno error = mfi_ctrl_get_properties(fd, &ctrl_props); 161ee7a2acaSSean Bruno if ( error < 0) { 162ee7a2acaSSean Bruno error = errno; 163ee7a2acaSSean Bruno warn("Failed to get controller properties"); 164ee7a2acaSSean Bruno close(fd); 165ee7a2acaSSean Bruno return (error); 166ee7a2acaSSean Bruno } 167ee7a2acaSSean Bruno } 168ee7a2acaSSean Bruno printf ("controller alarm was : %s\n", 169ee7a2acaSSean Bruno (ctrl_props.alarm_enable ? "enabled" : "disabled")); 170ee7a2acaSSean Bruno return (0); 171ee7a2acaSSean Bruno } 172ee7a2acaSSean Bruno 173ee7a2acaSSean Bruno MFI_COMMAND(ctrlprop, alarm, mfi_ctrl_alarm_enable); 174