1219820Sjeff/*-
2219820Sjeff * Copyright (c) 2010 Isilon Systems, Inc.
3219820Sjeff * Copyright (c) 2010 iX Systems, Inc.
4219820Sjeff * Copyright (c) 2010 Panasas, Inc.
5271127Shselasky * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd.
6219820Sjeff * All rights reserved.
7219820Sjeff *
8219820Sjeff * Redistribution and use in source and binary forms, with or without
9219820Sjeff * modification, are permitted provided that the following conditions
10219820Sjeff * are met:
11219820Sjeff * 1. Redistributions of source code must retain the above copyright
12219820Sjeff *    notice unmodified, this list of conditions, and the following
13219820Sjeff *    disclaimer.
14219820Sjeff * 2. Redistributions in binary form must reproduce the above copyright
15219820Sjeff *    notice, this list of conditions and the following disclaimer in the
16219820Sjeff *    documentation and/or other materials provided with the distribution.
17219820Sjeff *
18219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19219820Sjeff * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20219820Sjeff * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21219820Sjeff * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22219820Sjeff * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23219820Sjeff * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24219820Sjeff * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25219820Sjeff * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26219820Sjeff * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27219820Sjeff * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28219820Sjeff */
29271127Shselasky
30219820Sjeff#ifndef	_LINUX_MODULEPARAM_H_
31219820Sjeff#define	_LINUX_MODULEPARAM_H_
32219820Sjeff
33219820Sjeff#include <linux/types.h>
34219820Sjeff
35219820Sjeff/*
36219820Sjeff * These are presently not hooked up to anything.  In linux the parameters
37219820Sjeff * can be set when modules are loaded.  On FreeBSD these could be mapped
38219820Sjeff * to kenv in the future.
39219820Sjeff */
40219820Sjeffstruct kernel_param;
41219820Sjeff
42219820Sjefftypedef int (*param_set_fn)(const char *val, struct kernel_param *kp);
43219820Sjefftypedef int (*param_get_fn)(char *buffer, struct kernel_param *kp);
44219820Sjeff
45219820Sjeffstruct kernel_param {
46219820Sjeff	const char	*name;
47219820Sjeff	u16		perm;
48219820Sjeff	u16		flags;
49219820Sjeff	param_set_fn	set;
50219820Sjeff	param_get_fn	get;
51219820Sjeff	union {
52219820Sjeff		void	*arg;
53219820Sjeff		struct kparam_string	*str;
54219820Sjeff		struct kparam_array	*arr;
55219820Sjeff	} un;
56219820Sjeff};
57219820Sjeff
58219820Sjeff#define	KPARAM_ISBOOL	2
59219820Sjeff
60219820Sjeffstruct kparam_string {
61219820Sjeff	unsigned int maxlen;
62219820Sjeff	char *string;
63219820Sjeff};
64219820Sjeff
65219820Sjeffstruct kparam_array
66219820Sjeff{
67219820Sjeff	unsigned int	max;
68219820Sjeff	unsigned int	*num;
69219820Sjeff	param_set_fn	set;
70219820Sjeff	param_get_fn	get;
71219820Sjeff	unsigned int	elemsize;
72219820Sjeff	void 		*elem;
73219820Sjeff};
74219820Sjeff
75219820Sjeffstatic inline void
76219820Sjeffparam_sysinit(struct kernel_param *param)
77219820Sjeff{
78219820Sjeff}
79219820Sjeff
80219820Sjeff#define	module_param_call(name, set, get, arg, perm)			\
81219820Sjeff	static struct kernel_param __param_##name =			\
82219820Sjeff	    { #name, perm, 0, set, get, { arg } };			\
83219820Sjeff	SYSINIT(name##_param_sysinit, SI_SUB_DRIVERS, SI_ORDER_FIRST,	\
84219820Sjeff	    param_sysinit, &__param_##name);
85219820Sjeff
86271127Shselasky#define module_param_string(name, string, len, perm)
87271127Shselasky
88219820Sjeff#define	module_param_named(name, var, type, mode)			\
89219820Sjeff	module_param_call(name, param_set_##type, param_get_##type, &var, mode)
90219820Sjeff
91219820Sjeff#define	module_param(var, type, mode)					\
92219820Sjeff	module_param_named(var, var, type, mode)
93219820Sjeff
94255932Salfred#define module_param_array(var, type, addr_argc, mode)                  \
95255932Salfred        module_param_named(var, var, type, mode)
96255932Salfred
97219820Sjeff#define	MODULE_PARM_DESC(name, desc)
98219820Sjeff
99219820Sjeffstatic inline int
100219820Sjeffparam_set_byte(const char *val, struct kernel_param *kp)
101219820Sjeff{
102219820Sjeff
103219820Sjeff	return 0;
104219820Sjeff}
105219820Sjeff
106219820Sjeffstatic inline int
107219820Sjeffparam_get_byte(char *buffer, struct kernel_param *kp)
108219820Sjeff{
109219820Sjeff
110219820Sjeff	return 0;
111219820Sjeff}
112219820Sjeff
113219820Sjeff
114219820Sjeffstatic inline int
115219820Sjeffparam_set_short(const char *val, struct kernel_param *kp)
116219820Sjeff{
117219820Sjeff
118219820Sjeff	return 0;
119219820Sjeff}
120219820Sjeff
121219820Sjeffstatic inline int
122219820Sjeffparam_get_short(char *buffer, struct kernel_param *kp)
123219820Sjeff{
124219820Sjeff
125219820Sjeff	return 0;
126219820Sjeff}
127219820Sjeff
128219820Sjeff
129219820Sjeffstatic inline int
130219820Sjeffparam_set_ushort(const char *val, struct kernel_param *kp)
131219820Sjeff{
132219820Sjeff
133219820Sjeff	return 0;
134219820Sjeff}
135219820Sjeff
136219820Sjeffstatic inline int
137219820Sjeffparam_get_ushort(char *buffer, struct kernel_param *kp)
138219820Sjeff{
139219820Sjeff
140219820Sjeff	return 0;
141219820Sjeff}
142219820Sjeff
143219820Sjeff
144219820Sjeffstatic inline int
145219820Sjeffparam_set_int(const char *val, struct kernel_param *kp)
146219820Sjeff{
147219820Sjeff
148219820Sjeff	return 0;
149219820Sjeff}
150219820Sjeff
151219820Sjeffstatic inline int
152219820Sjeffparam_get_int(char *buffer, struct kernel_param *kp)
153219820Sjeff{
154219820Sjeff
155219820Sjeff	return 0;
156219820Sjeff}
157219820Sjeff
158219820Sjeff
159219820Sjeffstatic inline int
160219820Sjeffparam_set_uint(const char *val, struct kernel_param *kp)
161219820Sjeff{
162219820Sjeff
163219820Sjeff	return 0;
164219820Sjeff}
165219820Sjeff
166219820Sjeffstatic inline int
167219820Sjeffparam_get_uint(char *buffer, struct kernel_param *kp)
168219820Sjeff{
169219820Sjeff
170219820Sjeff	return 0;
171219820Sjeff}
172219820Sjeff
173219820Sjeff
174219820Sjeffstatic inline int
175219820Sjeffparam_set_long(const char *val, struct kernel_param *kp)
176219820Sjeff{
177219820Sjeff
178219820Sjeff	return 0;
179219820Sjeff}
180219820Sjeff
181219820Sjeffstatic inline int
182219820Sjeffparam_get_long(char *buffer, struct kernel_param *kp)
183219820Sjeff{
184219820Sjeff
185219820Sjeff	return 0;
186219820Sjeff}
187219820Sjeff
188219820Sjeff
189219820Sjeffstatic inline int
190219820Sjeffparam_set_ulong(const char *val, struct kernel_param *kp)
191219820Sjeff{
192219820Sjeff
193219820Sjeff	return 0;
194219820Sjeff}
195219820Sjeff
196219820Sjeffstatic inline int
197219820Sjeffparam_get_ulong(char *buffer, struct kernel_param *kp)
198219820Sjeff{
199219820Sjeff
200219820Sjeff	return 0;
201219820Sjeff}
202219820Sjeff
203219820Sjeff
204219820Sjeffstatic inline int
205219820Sjeffparam_set_charp(const char *val, struct kernel_param *kp)
206219820Sjeff{
207219820Sjeff
208219820Sjeff	return 0;
209219820Sjeff}
210219820Sjeff
211219820Sjeffstatic inline int
212219820Sjeffparam_get_charp(char *buffer, struct kernel_param *kp)
213219820Sjeff{
214219820Sjeff
215219820Sjeff	return 0;
216219820Sjeff}
217219820Sjeff
218219820Sjeff
219219820Sjeffstatic inline int
220219820Sjeffparam_set_bool(const char *val, struct kernel_param *kp)
221219820Sjeff{
222219820Sjeff
223219820Sjeff	return 0;
224219820Sjeff}
225219820Sjeff
226219820Sjeffstatic inline int
227219820Sjeffparam_get_bool(char *buffer, struct kernel_param *kp)
228219820Sjeff{
229219820Sjeff
230219820Sjeff	return 0;
231219820Sjeff}
232219820Sjeff
233219820Sjeff#endif	/* _LINUX_MODULEPARAM_H_ */
234