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