]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/tools/ath/athradar/athradar.c
Merge ^/vendor/llvm-openmp/dist up to its last change, and resolve conflicts.
[FreeBSD/FreeBSD.git] / tools / tools / ath / athradar / athradar.c
1 /*
2  * Copyright (c) 2011 Adrian Chadd, Xenion Pty Ltd.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  * $FreeBSD$
26  */
27
28 #include "diag.h"
29
30 #include "ah.h"
31 #include "ah_internal.h"
32
33 #include <getopt.h>
34 #include <errno.h>
35 #include <err.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <ctype.h>
39 #include <unistd.h>
40
41 struct radarhandler {
42         struct          ath_diag atd;
43         int             s;
44         struct ifreq    ifr;
45         int             ah_devid;
46 };
47
48 int
49 radar_opendev(struct radarhandler *radar, const char *devid)
50 {
51         HAL_REVS revs;
52
53         radar->s = socket(AF_INET, SOCK_DGRAM, 0);
54         if (radar->s < 0) {
55                 warn("socket");
56                 return 0;
57         }
58
59         strncpy(radar->atd.ad_name, devid, sizeof (radar->atd.ad_name));
60
61         /* Get the hardware revision, just to verify things are working */
62         radar->atd.ad_id = HAL_DIAG_REVS;
63         radar->atd.ad_out_data = (caddr_t) &revs;
64         radar->atd.ad_out_size = sizeof(revs);
65         if (ioctl(radar->s, SIOCGATHDIAG, &radar->atd) < 0) {
66                 warn(radar->atd.ad_name);
67                 return 0;
68         }
69         radar->ah_devid = revs.ah_devid;
70         return 1;
71 }
72
73 void
74 radar_closedev(struct radarhandler *radar)
75 {
76         close(radar->s);
77         radar->s = -1;
78 }
79
80 void
81 radarset(struct radarhandler *radar, int op, u_int32_t param)
82 {
83         HAL_PHYERR_PARAM pe;
84
85         pe.pe_firpwr = HAL_PHYERR_PARAM_NOVAL;
86         pe.pe_rrssi = HAL_PHYERR_PARAM_NOVAL;
87         pe.pe_height = HAL_PHYERR_PARAM_NOVAL;
88         pe.pe_prssi = HAL_PHYERR_PARAM_NOVAL;
89         pe.pe_inband = HAL_PHYERR_PARAM_NOVAL;
90         pe.pe_enabled = HAL_PHYERR_PARAM_NOVAL;
91
92         pe.pe_relpwr = HAL_PHYERR_PARAM_NOVAL;
93         pe.pe_relstep = HAL_PHYERR_PARAM_NOVAL;
94         pe.pe_maxlen = HAL_PHYERR_PARAM_NOVAL;
95         pe.pe_usefir128 = HAL_PHYERR_PARAM_NOVAL;
96         pe.pe_blockradar = HAL_PHYERR_PARAM_NOVAL;
97         pe.pe_enmaxrssi = HAL_PHYERR_PARAM_NOVAL;
98
99         pe.pe_extchannel = HAL_PHYERR_PARAM_NOVAL;
100         pe.pe_enrelpwr = HAL_PHYERR_PARAM_NOVAL;
101         pe.pe_en_relstep_check = HAL_PHYERR_PARAM_NOVAL;
102
103         switch (op) {
104         case DFS_PARAM_ENABLE:
105                 pe.pe_enabled = param;
106                 break;
107         case DFS_PARAM_FIRPWR:
108                 pe.pe_firpwr = param;
109                 break;
110         case DFS_PARAM_RRSSI:
111                 pe.pe_rrssi = param;
112                 break;
113         case DFS_PARAM_HEIGHT:
114                 pe.pe_height = param;
115                 break;
116         case DFS_PARAM_PRSSI:
117                 pe.pe_prssi = param;
118                 break;
119         case DFS_PARAM_INBAND:
120                 pe.pe_inband = param;
121                 break;
122         case DFS_PARAM_RELPWR:
123                 pe.pe_relpwr = param;
124                 break;
125         case DFS_PARAM_RELSTEP:
126                 pe.pe_relstep = param;
127                 break;
128         case DFS_PARAM_MAXLEN:
129                 pe.pe_maxlen = param;
130                 break;
131         case DFS_PARAM_USEFIR128:
132                 pe.pe_usefir128 = param;
133                 break;
134         case DFS_PARAM_BLOCKRADAR:
135                 pe.pe_blockradar = param;
136                 break;
137         case DFS_PARAM_MAXRSSI_EN:
138                 pe.pe_enmaxrssi = param;
139                 break;
140         case DFS_PARAM_EN_EXTCH:
141                 pe.pe_extchannel = param;
142                 break;
143         case DFS_PARAM_RELPWR_EN:
144                 pe.pe_enrelpwr = param;
145                 break;
146         case DFS_PARAM_RELSTEP_EN:
147                 pe.pe_en_relstep_check = param;
148                 break;
149         }
150
151         radar->atd.ad_id = DFS_SET_THRESH | ATH_DIAG_IN;
152         radar->atd.ad_out_data = NULL;
153         radar->atd.ad_out_size = 0;
154         radar->atd.ad_in_data = (caddr_t) &pe;
155         radar->atd.ad_in_size = sizeof(HAL_PHYERR_PARAM);
156         if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0)
157                 err(1, radar->atd.ad_name);
158 }
159
160 static void
161 radar_get(struct radarhandler *radar)
162 {
163         HAL_PHYERR_PARAM pe;
164
165         radar->atd.ad_id = DFS_GET_THRESH | ATH_DIAG_DYN;
166         memset(&pe, 0, sizeof(pe));
167
168         radar->atd.ad_in_data = NULL;
169         radar->atd.ad_in_size = 0;
170         radar->atd.ad_out_data = (caddr_t) &pe;
171         radar->atd.ad_out_size = sizeof(pe);
172
173         if (ioctl(radar->s, SIOCGATHPHYERR, &radar->atd) < 0)
174                 err(1, radar->atd.ad_name);
175
176         printf("Radar parameters (raw):\n");
177         printf("    pe_enabled: %d\n", pe.pe_enabled);
178         printf("    pe_firpwr: %d\n", pe.pe_firpwr);
179         printf("    pe_rrssi: %d\n", pe.pe_rrssi);
180         printf("    pe_height: %d\n", pe.pe_height);
181         printf("    pe_prssi: %d\n", pe.pe_prssi);
182         printf("    pe_inband: %d\n", pe.pe_inband);
183         printf("    pe_relpwr: %d\n", pe.pe_relpwr);
184         printf("    pe_relstep: %d\n", pe.pe_relstep);
185         printf("    pe_maxlen: %d\n", pe.pe_maxlen);
186         printf("    pe_usefir128: %d\n", pe.pe_usefir128);
187         printf("    pe_blockradar: %d\n", pe.pe_blockradar);
188         printf("    pe_enmaxrssi: %d\n", pe.pe_enmaxrssi);
189         printf("    pe_extchannel: %d\n", pe.pe_extchannel);
190         printf("    pe_enrelpwr: %d\n", pe.pe_enrelpwr);
191         printf("    pe_en_relstep_check: %d\n", pe.pe_en_relstep_check);
192 }
193
194 static int
195 radar_set_param(struct radarhandler *radar, const char *param,
196     const char *val)
197 {
198         int v;
199
200         v = atoi(val);
201
202         if (strcmp(param, "enabled") == 0) {
203                 radarset(radar, DFS_PARAM_ENABLE, v);
204         } else if (strcmp(param, "firpwr") == 0) {
205                 radarset(radar, DFS_PARAM_FIRPWR, v);
206         } else if (strcmp(param, "rrssi") == 0) {
207                 radarset(radar, DFS_PARAM_RRSSI, v);
208         } else if (strcmp(param, "height") == 0) {
209                 radarset(radar, DFS_PARAM_HEIGHT, v);
210         } else if (strcmp(param, "prssi") == 0) {
211                 radarset(radar, DFS_PARAM_PRSSI, v);
212         } else if (strcmp(param, "inband") == 0) {
213                 radarset(radar, DFS_PARAM_INBAND, v);
214         } else if (strcmp(param, "relpwr") == 0) {
215                 radarset(radar, DFS_PARAM_RELPWR, v);
216         } else if (strcmp(param, "relstep") == 0) {
217                 radarset(radar, DFS_PARAM_RELSTEP, v);
218         } else if (strcmp(param, "maxlen") == 0) {
219                 radarset(radar, DFS_PARAM_MAXLEN, v);
220         } else if (strcmp(param, "usefir128") == 0) {
221                 radarset(radar, DFS_PARAM_USEFIR128, v);
222         } else if (strcmp(param, "blockradar") == 0) {
223                 radarset(radar, DFS_PARAM_BLOCKRADAR, v);
224         } else if (strcmp(param, "enmaxrssi") == 0) {
225                 radarset(radar, DFS_PARAM_MAXRSSI_EN, v);
226         } else if (strcmp(param, "extchannel") == 0) {
227                 radarset(radar, DFS_PARAM_EN_EXTCH, v);
228         } else if (strcmp(param, "enrelpwr") == 0) {
229                 radarset(radar, DFS_PARAM_RELPWR_EN, v);
230         } else if (strcmp(param, "en_relstep_check") == 0) {
231                 radarset(radar, DFS_PARAM_RELSTEP_EN, v);
232         } else {
233                 return 0;
234         }
235
236         return 1;
237 }
238
239 void
240 usage(const char *progname)
241 {
242         printf("Usage:\n");
243         printf("\t%s: [-i <interface>] <cmd> (<arg>)\n", progname);
244         printf("\t%s: [-h]\n", progname);
245         printf("\n");
246         printf("Valid commands:\n");
247         printf("\tget:\t\tGet current radar parameters\n");
248         printf("\tset <param> <value>:\t\tSet radar parameter\n");
249 }
250
251 int
252 main(int argc, char *argv[])
253 {
254         struct radarhandler radar;
255         const char *devname = ATH_DEFAULT;
256         const char *progname = argv[0];
257
258         memset(&radar, 0, sizeof(radar));
259
260         /* Parse command line options */
261         if (argc >= 2 && strcmp(argv[1], "-h") == 0) {
262                 usage(progname);
263                 exit(0);
264         }
265         if (argc >= 2 && strcmp(argv[1], "-?") == 0) {
266                 usage(progname);
267                 exit(0);
268         }
269
270         if (argc >= 2 && strcmp(argv[1], "-i") == 0) {
271                 if (argc == 2) {
272                         usage(progname);
273                         exit(127);
274                 }
275                 devname = argv[2];
276                 argc -= 2; argv += 2;
277         }
278
279         /* At this point we require at least one command */
280         if (argc == 1) {
281                 usage(progname);
282                 exit(127);
283         }
284
285         if (radar_opendev(&radar, devname) == 0)
286                 exit(127);
287
288         if (strcasecmp(argv[1], "get") == 0) {
289                 radar_get(&radar);
290         } else if (strcasecmp(argv[1], "set") == 0) {
291                 if (argc < 4) {
292                         usage(progname);
293                         exit(127);
294                 }
295                 if (radar_set_param(&radar, argv[2], argv[3]) == 0) {
296                         usage(progname);
297                         exit(127);
298                 }
299         } else {
300                 usage(progname);
301                 exit(127);
302         }
303
304         /* wrap up */
305         radar_closedev(&radar);
306         exit(0);
307 }