xref: /freebsd/usr.sbin/mfiutil/mfi_properties.c (revision ee7a2acac549fefc0e50354e431086f258637b3a)
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