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