xref: /freebsd/usr.sbin/bluetooth/hccontrol/host_controller_baseband.c (revision 0986ab12e44caea472245845f9a89ced4f137d73)
1878ed226SJulian Elischer /*
2878ed226SJulian Elischer  * host_controller_baseband.c
3878ed226SJulian Elischer  *
4878ed226SJulian Elischer  * Copyright (c) 2001-2002 Maksim Yevmenkin <m_evmenkin@yahoo.com>
5878ed226SJulian Elischer  * All rights reserved.
6878ed226SJulian Elischer  *
7878ed226SJulian Elischer  * Redistribution and use in source and binary forms, with or without
8878ed226SJulian Elischer  * modification, are permitted provided that the following conditions
9878ed226SJulian Elischer  * are met:
10878ed226SJulian Elischer  * 1. Redistributions of source code must retain the above copyright
11878ed226SJulian Elischer  *    notice, this list of conditions and the following disclaimer.
12878ed226SJulian Elischer  * 2. Redistributions in binary form must reproduce the above copyright
13878ed226SJulian Elischer  *    notice, this list of conditions and the following disclaimer in the
14878ed226SJulian Elischer  *    documentation and/or other materials provided with the distribution.
15878ed226SJulian Elischer  *
16878ed226SJulian Elischer  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17878ed226SJulian Elischer  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18878ed226SJulian Elischer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19878ed226SJulian Elischer  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20878ed226SJulian Elischer  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21878ed226SJulian Elischer  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22878ed226SJulian Elischer  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23878ed226SJulian Elischer  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24878ed226SJulian Elischer  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25878ed226SJulian Elischer  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26878ed226SJulian Elischer  * SUCH DAMAGE.
27878ed226SJulian Elischer  *
280986ab12SMaksim Yevmenkin  * $Id: host_controller_baseband.c,v 1.4 2003/08/18 19:19:53 max Exp $
29878ed226SJulian Elischer  * $FreeBSD$
30878ed226SJulian Elischer  */
31878ed226SJulian Elischer 
320986ab12SMaksim Yevmenkin #include <bluetooth.h>
33878ed226SJulian Elischer #include <errno.h>
34878ed226SJulian Elischer #include <stdio.h>
35878ed226SJulian Elischer #include <string.h>
36878ed226SJulian Elischer #include "hccontrol.h"
37878ed226SJulian Elischer 
38878ed226SJulian Elischer /* Convert hex ASCII to int4 */
39878ed226SJulian Elischer static int
40878ed226SJulian Elischer hci_hexa2int4(const char *a)
41878ed226SJulian Elischer {
42878ed226SJulian Elischer 	if ('0' <= *a && *a <= '9')
43878ed226SJulian Elischer 		return (*a - '0');
44878ed226SJulian Elischer 
45878ed226SJulian Elischer 	if ('A' <= *a && *a <= 'F')
46878ed226SJulian Elischer 		return (*a - 'A' + 0xa);
47878ed226SJulian Elischer 
48878ed226SJulian Elischer 	if ('a' <= *a && *a <= 'f')
49878ed226SJulian Elischer 		return (*a - 'a' + 0xa);
50878ed226SJulian Elischer 
51878ed226SJulian Elischer 	return (-1);
52878ed226SJulian Elischer }
53878ed226SJulian Elischer 
54878ed226SJulian Elischer /* Convert hex ASCII to int8 */
55878ed226SJulian Elischer static int
56878ed226SJulian Elischer hci_hexa2int8(const char *a)
57878ed226SJulian Elischer {
58878ed226SJulian Elischer 	int	hi = hci_hexa2int4(a);
59878ed226SJulian Elischer 	int	lo = hci_hexa2int4(a + 1);
60878ed226SJulian Elischer 
61878ed226SJulian Elischer 	if (hi < 0 || lo < 0)
62878ed226SJulian Elischer 		return (-1);
63878ed226SJulian Elischer 
64878ed226SJulian Elischer 	return ((hi << 4) | lo);
65878ed226SJulian Elischer }
66878ed226SJulian Elischer 
67878ed226SJulian Elischer /* Convert ascii hex string to the u_int8_t[] */
68878ed226SJulian Elischer static int
69878ed226SJulian Elischer hci_hexstring2array(char const *s, u_int8_t *a, int asize)
70878ed226SJulian Elischer {
71878ed226SJulian Elischer 	int	i, l, b;
72878ed226SJulian Elischer 
73878ed226SJulian Elischer 	l = strlen(s) / 2;
74878ed226SJulian Elischer 	if (l > asize)
75878ed226SJulian Elischer 		l = asize;
76878ed226SJulian Elischer 
77878ed226SJulian Elischer 	for (i = 0; i < l; i++) {
78878ed226SJulian Elischer 		b = hci_hexa2int8(s + i * 2);
79878ed226SJulian Elischer 		if (b < 0)
80878ed226SJulian Elischer 			return (-1);
81878ed226SJulian Elischer 
82878ed226SJulian Elischer 		a[i] = (b & 0xff);
83878ed226SJulian Elischer 	}
84878ed226SJulian Elischer 
85878ed226SJulian Elischer 	return (0);
86878ed226SJulian Elischer }
87878ed226SJulian Elischer 
88878ed226SJulian Elischer /* Send RESET to the unit */
89878ed226SJulian Elischer static int
90878ed226SJulian Elischer hci_reset(int s, int argc, char **argv)
91878ed226SJulian Elischer {
92878ed226SJulian Elischer 	ng_hci_status_rp	rp;
93878ed226SJulian Elischer 	int			n;
94878ed226SJulian Elischer 
95878ed226SJulian Elischer 	n = sizeof(rp);
96878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
97878ed226SJulian Elischer 			NG_HCI_OCF_RESET), (char *) &rp, &n) == ERROR)
98878ed226SJulian Elischer 		return (ERROR);
99878ed226SJulian Elischer 
100878ed226SJulian Elischer 	if (rp.status != 0x00) {
101878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
102878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
103878ed226SJulian Elischer 		return (FAILED);
104878ed226SJulian Elischer 	}
105878ed226SJulian Elischer 
106878ed226SJulian Elischer 	return (OK);
107878ed226SJulian Elischer } /* hci_reset */
108878ed226SJulian Elischer 
109878ed226SJulian Elischer /* Send Read_PIN_Type command to the unit */
110878ed226SJulian Elischer static int
111878ed226SJulian Elischer hci_read_pin_type(int s, int argc, char **argv)
112878ed226SJulian Elischer {
113878ed226SJulian Elischer 	ng_hci_read_pin_type_rp	rp;
114878ed226SJulian Elischer 	int			n;
115878ed226SJulian Elischer 
116878ed226SJulian Elischer 	n = sizeof(rp);
117878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
118878ed226SJulian Elischer 			NG_HCI_OCF_READ_PIN_TYPE),
119878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
120878ed226SJulian Elischer 		return (ERROR);
121878ed226SJulian Elischer 
122878ed226SJulian Elischer 	if (rp.status != 0x00) {
123878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
124878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
125878ed226SJulian Elischer 		return (FAILED);
126878ed226SJulian Elischer 	}
127878ed226SJulian Elischer 
128878ed226SJulian Elischer 	fprintf(stdout, "PIN type: %s [%#02x]\n",
129878ed226SJulian Elischer 			hci_pin2str(rp.pin_type), rp.pin_type);
130878ed226SJulian Elischer 
131878ed226SJulian Elischer 	return (OK);
132878ed226SJulian Elischer } /* hci_read_pin_type */
133878ed226SJulian Elischer 
134878ed226SJulian Elischer /* Send Write_PIN_Type command to the unit */
135878ed226SJulian Elischer static int
136878ed226SJulian Elischer hci_write_pin_type(int s, int argc, char **argv)
137878ed226SJulian Elischer {
138878ed226SJulian Elischer 	ng_hci_write_pin_type_cp	cp;
139878ed226SJulian Elischer 	ng_hci_write_pin_type_rp	rp;
140878ed226SJulian Elischer 	int				n;
141878ed226SJulian Elischer 
142878ed226SJulian Elischer 	/* parse command parameters */
143878ed226SJulian Elischer 	switch (argc) {
144878ed226SJulian Elischer 	case 1:
145878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
146878ed226SJulian Elischer 			return (USAGE);
147878ed226SJulian Elischer 
148878ed226SJulian Elischer 		cp.pin_type = (u_int8_t) n;
149878ed226SJulian Elischer 		break;
150878ed226SJulian Elischer 
151878ed226SJulian Elischer 	default:
152878ed226SJulian Elischer 		return (USAGE);
153878ed226SJulian Elischer 	}
154878ed226SJulian Elischer 
155878ed226SJulian Elischer 	/* send command */
156878ed226SJulian Elischer 	n = sizeof(rp);
157878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
158878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PIN_TYPE),
159878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
160878ed226SJulian Elischer 			(char *) &rp , &n) ==  ERROR)
161878ed226SJulian Elischer 		return (ERROR);
162878ed226SJulian Elischer 
163878ed226SJulian Elischer 	if (rp.status != 0x00) {
164878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
165878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
166878ed226SJulian Elischer 		return (FAILED);
167878ed226SJulian Elischer 	}
168878ed226SJulian Elischer 
169878ed226SJulian Elischer 	return (OK);
170878ed226SJulian Elischer } /* hci_write_pin_type */
171878ed226SJulian Elischer 
172878ed226SJulian Elischer /* Send Read_Stored_Link_Key command to the unit */
173878ed226SJulian Elischer static int
174878ed226SJulian Elischer hci_read_stored_link_key(int s, int argc, char **argv)
175878ed226SJulian Elischer {
176878ed226SJulian Elischer 	struct {
177878ed226SJulian Elischer 		ng_hci_cmd_pkt_t			hdr;
178878ed226SJulian Elischer 		ng_hci_read_stored_link_key_cp		cp;
179878ed226SJulian Elischer 	} __attribute__ ((packed))			cmd;
180878ed226SJulian Elischer 
181878ed226SJulian Elischer 	struct {
182878ed226SJulian Elischer 		ng_hci_event_pkt_t			hdr;
183878ed226SJulian Elischer 		union {
184878ed226SJulian Elischer 			ng_hci_command_compl_ep		cc;
185878ed226SJulian Elischer 			ng_hci_return_link_keys_ep	key;
186878ed226SJulian Elischer 			u_int8_t			b[NG_HCI_EVENT_PKT_SIZE];
187878ed226SJulian Elischer 		}					ep;
188878ed226SJulian Elischer 	} __attribute__ ((packed))			event;
189878ed226SJulian Elischer 
1900986ab12SMaksim Yevmenkin 	int						n, n1;
191878ed226SJulian Elischer 
192878ed226SJulian Elischer 	/* Send command */
193878ed226SJulian Elischer 	memset(&cmd, 0, sizeof(cmd));
194878ed226SJulian Elischer 	cmd.hdr.type = NG_HCI_CMD_PKT;
195878ed226SJulian Elischer 	cmd.hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
196878ed226SJulian Elischer 				NG_HCI_OCF_READ_STORED_LINK_KEY));
197878ed226SJulian Elischer 	cmd.hdr.length = sizeof(cmd.cp);
198878ed226SJulian Elischer 
199878ed226SJulian Elischer 	switch (argc) {
200878ed226SJulian Elischer 	case 1:
201878ed226SJulian Elischer 		/* parse BD_ADDR */
2020986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cmd.cp.bdaddr)) {
2030986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
2040986ab12SMaksim Yevmenkin 
2050986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
206878ed226SJulian Elischer 				return (USAGE);
207878ed226SJulian Elischer 
2080986ab12SMaksim Yevmenkin 			memcpy(&cmd.cp.bdaddr, he->h_addr, sizeof(cmd.cp.bdaddr));
2090986ab12SMaksim Yevmenkin 		}
210878ed226SJulian Elischer 		break;
211878ed226SJulian Elischer 
212878ed226SJulian Elischer 	default:
213878ed226SJulian Elischer 		cmd.cp.read_all = 1;
214878ed226SJulian Elischer 		break;
215878ed226SJulian Elischer 	}
216878ed226SJulian Elischer 
217878ed226SJulian Elischer 	if (hci_send(s, (char const *) &cmd, sizeof(cmd)) != OK)
218878ed226SJulian Elischer 		return (ERROR);
219878ed226SJulian Elischer 
220878ed226SJulian Elischer 	/* Receive events */
221878ed226SJulian Elischer again:
222878ed226SJulian Elischer 	memset(&event, 0, sizeof(event));
223878ed226SJulian Elischer 	n = sizeof(event);
224878ed226SJulian Elischer 	if (hci_recv(s, (char *) &event, &n) != OK)
225878ed226SJulian Elischer 		return (ERROR);
226878ed226SJulian Elischer 
227878ed226SJulian Elischer 	if (n <= sizeof(event.hdr)) {
228878ed226SJulian Elischer 		errno = EMSGSIZE;
229878ed226SJulian Elischer 		return (ERROR);
230878ed226SJulian Elischer 	}
231878ed226SJulian Elischer 
232878ed226SJulian Elischer 	if (event.hdr.type != NG_HCI_EVENT_PKT) {
233878ed226SJulian Elischer 		errno = EIO;
234878ed226SJulian Elischer 		return (ERROR);
235878ed226SJulian Elischer 	}
236878ed226SJulian Elischer 
237878ed226SJulian Elischer 	/* Parse event */
238878ed226SJulian Elischer 	switch (event.hdr.event) {
239878ed226SJulian Elischer 	case NG_HCI_EVENT_COMMAND_COMPL: {
240878ed226SJulian Elischer 		ng_hci_read_stored_link_key_rp	*rp = NULL;
241878ed226SJulian Elischer 
242878ed226SJulian Elischer 		if (event.ep.cc.opcode == 0x0000 ||
243878ed226SJulian Elischer 		    event.ep.cc.opcode != cmd.hdr.opcode)
244878ed226SJulian Elischer 			goto again;
245878ed226SJulian Elischer 
246878ed226SJulian Elischer 		rp = (ng_hci_read_stored_link_key_rp *)(event.ep.b +
247878ed226SJulian Elischer 				sizeof(event.ep.cc));
248878ed226SJulian Elischer 
249878ed226SJulian Elischer 		fprintf(stdout, "Complete: Status: %s [%#x]\n",
250878ed226SJulian Elischer 				hci_status2str(rp->status), rp->status);
251878ed226SJulian Elischer 		fprintf(stdout, "Maximum Number of keys: %d\n",
252878ed226SJulian Elischer 				le16toh(rp->max_num_keys));
253878ed226SJulian Elischer 		fprintf(stdout, "Number of keys read: %d\n",
254878ed226SJulian Elischer 				le16toh(rp->num_keys_read));
255878ed226SJulian Elischer 		} break;
256878ed226SJulian Elischer 
257878ed226SJulian Elischer 	case NG_HCI_EVENT_RETURN_LINK_KEYS: {
258878ed226SJulian Elischer 		struct _key {
259878ed226SJulian Elischer 			bdaddr_t	bdaddr;
260878ed226SJulian Elischer 			u_int8_t	key[NG_HCI_KEY_SIZE];
261878ed226SJulian Elischer 		} __attribute__ ((packed))	*k = NULL;
262878ed226SJulian Elischer 
263878ed226SJulian Elischer 		fprintf(stdout, "Event: Number of keys: %d\n",
264878ed226SJulian Elischer 			event.ep.key.num_keys);
265878ed226SJulian Elischer 
266878ed226SJulian Elischer 		k = (struct _key *)(event.ep.b + sizeof(event.ep.key));
267878ed226SJulian Elischer 		for (n = 0; n < event.ep.key.num_keys; n++) {
2680986ab12SMaksim Yevmenkin 			fprintf(stdout, "\t%d: %s ",
2690986ab12SMaksim Yevmenkin 				n + 1, hci_bdaddr2str(&k->bdaddr));
270878ed226SJulian Elischer 
2710986ab12SMaksim Yevmenkin 			for (n1 = 0; n1 < sizeof(k->key); n1++)
2720986ab12SMaksim Yevmenkin 				fprintf(stdout, "%02x", k->key[n1]);
273878ed226SJulian Elischer 			fprintf(stdout, "\n");
274878ed226SJulian Elischer 
275878ed226SJulian Elischer 			k ++;
276878ed226SJulian Elischer 		}
277878ed226SJulian Elischer 
278878ed226SJulian Elischer 		goto again;
279878ed226SJulian Elischer 
280878ed226SJulian Elischer 		} break;
281878ed226SJulian Elischer 
282878ed226SJulian Elischer 	default:
283878ed226SJulian Elischer 		goto again;
284878ed226SJulian Elischer 	}
285878ed226SJulian Elischer 
286878ed226SJulian Elischer 	return (OK);
287878ed226SJulian Elischer } /* hci_read_store_link_key */
288878ed226SJulian Elischer 
289878ed226SJulian Elischer /* Send Write_Stored_Link_Key command to the unit */
290878ed226SJulian Elischer static int
291878ed226SJulian Elischer hci_write_stored_link_key(int s, int argc, char **argv)
292878ed226SJulian Elischer {
293878ed226SJulian Elischer 	struct {
294878ed226SJulian Elischer 		ng_hci_write_stored_link_key_cp	p;
295878ed226SJulian Elischer 		bdaddr_t			bdaddr;
296878ed226SJulian Elischer 		u_int8_t			key[NG_HCI_KEY_SIZE];
297878ed226SJulian Elischer 	}					cp;
298878ed226SJulian Elischer 	ng_hci_write_stored_link_key_rp		rp;
2990986ab12SMaksim Yevmenkin 	int32_t					n;
300878ed226SJulian Elischer 
301878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
302878ed226SJulian Elischer 
303878ed226SJulian Elischer 	switch (argc) {
304878ed226SJulian Elischer 	case 2:
305878ed226SJulian Elischer 		cp.p.num_keys_write = 1;
306878ed226SJulian Elischer 
307878ed226SJulian Elischer 		/* parse BD_ADDR */
3080986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cp.bdaddr)) {
3090986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
3100986ab12SMaksim Yevmenkin 
3110986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
312878ed226SJulian Elischer 				return (USAGE);
313878ed226SJulian Elischer 
3140986ab12SMaksim Yevmenkin 			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
3150986ab12SMaksim Yevmenkin 		}
316878ed226SJulian Elischer 
317878ed226SJulian Elischer 		/* parse key */
318878ed226SJulian Elischer 		if (hci_hexstring2array(argv[1], cp.key, sizeof(cp.key)) < 0)
319878ed226SJulian Elischer 			return (USAGE);
320878ed226SJulian Elischer 		break;
321878ed226SJulian Elischer 
322878ed226SJulian Elischer 	default:
323878ed226SJulian Elischer 		return (USAGE);
324878ed226SJulian Elischer 	}
325878ed226SJulian Elischer 
326878ed226SJulian Elischer 	/* send command */
327878ed226SJulian Elischer 	n = sizeof(rp);
328878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
329878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_STORED_LINK_KEY),
330878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
331878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
332878ed226SJulian Elischer 		return (ERROR);
333878ed226SJulian Elischer 
334878ed226SJulian Elischer 	if (rp.status != 0x00) {
335878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
336878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
337878ed226SJulian Elischer 		return (FAILED);
338878ed226SJulian Elischer 	}
339878ed226SJulian Elischer 
340878ed226SJulian Elischer 	fprintf(stdout, "Number of keys written: %d\n", rp.num_keys_written);
341878ed226SJulian Elischer 
342878ed226SJulian Elischer 	return (OK);
343878ed226SJulian Elischer } /* hci_write_stored_link_key */
344878ed226SJulian Elischer 
345878ed226SJulian Elischer 
346878ed226SJulian Elischer /* Send Delete_Stored_Link_Key command to the unit */
347878ed226SJulian Elischer static int
348878ed226SJulian Elischer hci_delete_stored_link_key(int s, int argc, char **argv)
349878ed226SJulian Elischer {
350878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_cp	cp;
351878ed226SJulian Elischer 	ng_hci_delete_stored_link_key_rp	rp;
3520986ab12SMaksim Yevmenkin 	int32_t					n;
353878ed226SJulian Elischer 
354878ed226SJulian Elischer 	memset(&cp, 0, sizeof(cp));
355878ed226SJulian Elischer 
356878ed226SJulian Elischer 	switch (argc) {
357878ed226SJulian Elischer 	case 1:
358878ed226SJulian Elischer 		/* parse BD_ADDR */
3590986ab12SMaksim Yevmenkin 		if (!bt_aton(argv[0], &cp.bdaddr)) {
3600986ab12SMaksim Yevmenkin 			struct hostent	*he = NULL;
3610986ab12SMaksim Yevmenkin 
3620986ab12SMaksim Yevmenkin 			if ((he = bt_gethostbyname(argv[0])) == NULL)
363878ed226SJulian Elischer 				return (USAGE);
364878ed226SJulian Elischer 
3650986ab12SMaksim Yevmenkin 			memcpy(&cp.bdaddr, he->h_addr, sizeof(cp.bdaddr));
3660986ab12SMaksim Yevmenkin 		}
367878ed226SJulian Elischer 		break;
368878ed226SJulian Elischer 
369878ed226SJulian Elischer 	default:
370878ed226SJulian Elischer 		cp.delete_all = 1;
371878ed226SJulian Elischer 		break;
372878ed226SJulian Elischer 	}
373878ed226SJulian Elischer 
374878ed226SJulian Elischer 	/* send command */
375878ed226SJulian Elischer 	n = sizeof(cp);
376878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
377878ed226SJulian Elischer 			NG_HCI_OCF_DELETE_STORED_LINK_KEY),
378878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
379878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
380878ed226SJulian Elischer 		return (ERROR);
381878ed226SJulian Elischer 
382878ed226SJulian Elischer 	if (rp.status != 0x00) {
383878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
384878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
385878ed226SJulian Elischer 		return (FAILED);
386878ed226SJulian Elischer 	}
387878ed226SJulian Elischer 
388878ed226SJulian Elischer 	fprintf(stdout, "Number of keys deleted: %d\n", rp.num_keys_deleted);
389878ed226SJulian Elischer 
390878ed226SJulian Elischer 	return (OK);
391878ed226SJulian Elischer } /* hci_delete_stored_link_key */
392878ed226SJulian Elischer 
393878ed226SJulian Elischer /* Send Change_Local_Name command to the unit */
394878ed226SJulian Elischer static int
395878ed226SJulian Elischer hci_change_local_name(int s, int argc, char **argv)
396878ed226SJulian Elischer {
397878ed226SJulian Elischer 	ng_hci_change_local_name_cp	cp;
398878ed226SJulian Elischer 	ng_hci_change_local_name_rp	rp;
399878ed226SJulian Elischer 	int				n;
400878ed226SJulian Elischer 
401878ed226SJulian Elischer 	/* parse command parameters */
402878ed226SJulian Elischer 	switch (argc) {
403878ed226SJulian Elischer 	case 1:
404878ed226SJulian Elischer 		snprintf(cp.name, sizeof(cp.name), "%s", argv[0]);
405878ed226SJulian Elischer 		break;
406878ed226SJulian Elischer 
407878ed226SJulian Elischer 	default:
408878ed226SJulian Elischer 		return (USAGE);
409878ed226SJulian Elischer 	}
410878ed226SJulian Elischer 
411878ed226SJulian Elischer 	/* send command */
412878ed226SJulian Elischer 	n = sizeof(rp);
413878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
414878ed226SJulian Elischer 			NG_HCI_OCF_CHANGE_LOCAL_NAME),
415878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
416878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
417878ed226SJulian Elischer 		return (ERROR);
418878ed226SJulian Elischer 
419878ed226SJulian Elischer 	if (rp.status != 0x00) {
420878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
421878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
422878ed226SJulian Elischer 		return (FAILED);
423878ed226SJulian Elischer 	}
424878ed226SJulian Elischer 
425878ed226SJulian Elischer 	return (OK);
426878ed226SJulian Elischer } /* hci_change_local_name */
427878ed226SJulian Elischer 
428878ed226SJulian Elischer /* Send Read_Local_Name command to the unit */
429878ed226SJulian Elischer static int
430878ed226SJulian Elischer hci_read_local_name(int s, int argc, char **argv)
431878ed226SJulian Elischer {
432878ed226SJulian Elischer 	ng_hci_read_local_name_rp	rp;
433878ed226SJulian Elischer 	int				n;
434878ed226SJulian Elischer 
435878ed226SJulian Elischer 	n = sizeof(rp);
436878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
437878ed226SJulian Elischer 			NG_HCI_OCF_READ_LOCAL_NAME),
438878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
439878ed226SJulian Elischer 		return (ERROR);
440878ed226SJulian Elischer 
441878ed226SJulian Elischer 	if (rp.status != 0x00) {
442878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
443878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
444878ed226SJulian Elischer 		return (FAILED);
445878ed226SJulian Elischer 	}
446878ed226SJulian Elischer 
447878ed226SJulian Elischer 	fprintf(stdout, "Local name: %s\n", rp.name);
448878ed226SJulian Elischer 
449878ed226SJulian Elischer 	return (OK);
450878ed226SJulian Elischer } /* hci_read_local_name */
451878ed226SJulian Elischer 
452878ed226SJulian Elischer /* Send Read_Connection_Accept_Timeout to the unit */
453878ed226SJulian Elischer static int
454878ed226SJulian Elischer hci_read_connection_accept_timeout(int s, int argc, char **argv)
455878ed226SJulian Elischer {
456878ed226SJulian Elischer 	ng_hci_read_con_accept_timo_rp	rp;
457878ed226SJulian Elischer 	int				n;
458878ed226SJulian Elischer 
459878ed226SJulian Elischer 	n = sizeof(rp);
460878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
461878ed226SJulian Elischer 			NG_HCI_OCF_READ_CON_ACCEPT_TIMO),
462878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
463878ed226SJulian Elischer 		return (ERROR);
464878ed226SJulian Elischer 
465878ed226SJulian Elischer 	if (rp.status != 0x00) {
466878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
467878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
468878ed226SJulian Elischer 		return (FAILED);
469878ed226SJulian Elischer 	}
470878ed226SJulian Elischer 
471878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
472878ed226SJulian Elischer 	fprintf(stdout, "Connection accept timeout: %.2f msec [%d slots]\n",
473878ed226SJulian Elischer 			rp.timeout * 0.625, rp.timeout);
474878ed226SJulian Elischer 
475878ed226SJulian Elischer 	return (OK);
476878ed226SJulian Elischer } /* hci_read_connection_accept_timeout */
477878ed226SJulian Elischer 
478878ed226SJulian Elischer /* Send Write_Connection_Accept_Timeout to the unit */
479878ed226SJulian Elischer static int
480878ed226SJulian Elischer hci_write_connection_accept_timeout(int s, int argc, char **argv)
481878ed226SJulian Elischer {
482878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_cp	cp;
483878ed226SJulian Elischer 	ng_hci_write_con_accept_timo_rp	rp;
484878ed226SJulian Elischer 	int				n;
485878ed226SJulian Elischer 
486878ed226SJulian Elischer 	/* parse command parameters */
487878ed226SJulian Elischer 	switch (argc) {
488878ed226SJulian Elischer 	case 1:
489878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xb540)
490878ed226SJulian Elischer 			return (USAGE);
491878ed226SJulian Elischer 
492878ed226SJulian Elischer 		cp.timeout = (u_int16_t) n;
493878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
494878ed226SJulian Elischer 		break;
495878ed226SJulian Elischer 
496878ed226SJulian Elischer 	default:
497878ed226SJulian Elischer 		return (USAGE);
498878ed226SJulian Elischer 	}
499878ed226SJulian Elischer 
500878ed226SJulian Elischer 	/* send command */
501878ed226SJulian Elischer 	n = sizeof(rp);
502878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
503878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_CON_ACCEPT_TIMO),
504878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
505878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
506878ed226SJulian Elischer 		return (ERROR);
507878ed226SJulian Elischer 
508878ed226SJulian Elischer 	if (rp.status != 0x00) {
509878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
510878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
511878ed226SJulian Elischer 		return (FAILED);
512878ed226SJulian Elischer 	}
513878ed226SJulian Elischer 
514878ed226SJulian Elischer 	return (OK);
515878ed226SJulian Elischer } /* hci_write_connection_accept_timeout */
516878ed226SJulian Elischer 
517878ed226SJulian Elischer /* Send Read_Page_Timeout command to the unit */
518878ed226SJulian Elischer static int
519878ed226SJulian Elischer hci_read_page_timeout(int s, int argc, char **argv)
520878ed226SJulian Elischer {
521878ed226SJulian Elischer 	ng_hci_read_page_timo_rp	rp;
522878ed226SJulian Elischer 	int				n;
523878ed226SJulian Elischer 
524878ed226SJulian Elischer 	n = sizeof(rp);
525878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
526878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_TIMO),
527878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
528878ed226SJulian Elischer 		return (ERROR);
529878ed226SJulian Elischer 
530878ed226SJulian Elischer 	if (rp.status != 0x00) {
531878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
532878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
533878ed226SJulian Elischer 		return (FAILED);
534878ed226SJulian Elischer 	}
535878ed226SJulian Elischer 
536878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
537878ed226SJulian Elischer 	fprintf(stdout, "Page timeout: %.2f msec [%d slots]\n",
538878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
539878ed226SJulian Elischer 
540878ed226SJulian Elischer 	return (OK);
541878ed226SJulian Elischer } /* hci_read_page_timeoout */
542878ed226SJulian Elischer 
543878ed226SJulian Elischer /* Send Write_Page_Timeout command to the unit */
544878ed226SJulian Elischer static int
545878ed226SJulian Elischer hci_write_page_timeout(int s, int argc, char **argv)
546878ed226SJulian Elischer {
547878ed226SJulian Elischer 	ng_hci_write_page_timo_cp	cp;
548878ed226SJulian Elischer 	ng_hci_write_page_timo_rp	rp;
549878ed226SJulian Elischer 	int				n;
550878ed226SJulian Elischer 
551878ed226SJulian Elischer 	/* parse command parameters */
552878ed226SJulian Elischer 	switch (argc) {
553878ed226SJulian Elischer 	case 1:
554878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 1 || n > 0xffff)
555878ed226SJulian Elischer 			return (USAGE);
556878ed226SJulian Elischer 
557878ed226SJulian Elischer 		cp.timeout = (u_int16_t) n;
558878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
559878ed226SJulian Elischer 		break;
560878ed226SJulian Elischer 
561878ed226SJulian Elischer 	default:
562878ed226SJulian Elischer 		return (USAGE);
563878ed226SJulian Elischer 	}
564878ed226SJulian Elischer 
565878ed226SJulian Elischer 	/* send command */
566878ed226SJulian Elischer 	n = sizeof(rp);
567878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
568878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_TIMO),
569878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
570878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
571878ed226SJulian Elischer 		return (ERROR);
572878ed226SJulian Elischer 
573878ed226SJulian Elischer 	if (rp.status != 0x00) {
574878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
575878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
576878ed226SJulian Elischer 		return (FAILED);
577878ed226SJulian Elischer 	}
578878ed226SJulian Elischer 
579878ed226SJulian Elischer 	return (OK);
580878ed226SJulian Elischer } /* hci_write_page_timeout */
581878ed226SJulian Elischer 
582878ed226SJulian Elischer /* Send Read_Scan_Enable command to the unit */
583878ed226SJulian Elischer static int
584878ed226SJulian Elischer hci_read_scan_enable(int s, int argc, char **argv)
585878ed226SJulian Elischer {
586878ed226SJulian Elischer 	ng_hci_read_scan_enable_rp	rp;
587878ed226SJulian Elischer 	int				n;
588878ed226SJulian Elischer 
589878ed226SJulian Elischer 	n = sizeof(rp);
590878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
591878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCAN_ENABLE),
592878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
593878ed226SJulian Elischer 		return (ERROR);
594878ed226SJulian Elischer 
595878ed226SJulian Elischer 	if (rp.status != 0x00) {
596878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
597878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
598878ed226SJulian Elischer 		return (FAILED);
599878ed226SJulian Elischer 	}
600878ed226SJulian Elischer 
601878ed226SJulian Elischer 	fprintf(stdout, "Scan enable: %s [%#02x]\n",
602878ed226SJulian Elischer 		hci_scan2str(rp.scan_enable), rp.scan_enable);
603878ed226SJulian Elischer 
604878ed226SJulian Elischer 	return (OK);
605878ed226SJulian Elischer } /* hci_read_scan_enable */
606878ed226SJulian Elischer 
607878ed226SJulian Elischer /* Send Write_Scan_Enable command to the unit */
608878ed226SJulian Elischer static int
609878ed226SJulian Elischer hci_write_scan_enable(int s, int argc, char **argv)
610878ed226SJulian Elischer {
611878ed226SJulian Elischer 	ng_hci_write_scan_enable_cp	cp;
612878ed226SJulian Elischer 	ng_hci_write_scan_enable_rp	rp;
613878ed226SJulian Elischer 	int				n;
614878ed226SJulian Elischer 
615878ed226SJulian Elischer 	/* parse command parameters */
616878ed226SJulian Elischer 	switch (argc) {
617878ed226SJulian Elischer 	case 1:
618878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
619878ed226SJulian Elischer 			return (USAGE);
620878ed226SJulian Elischer 
621878ed226SJulian Elischer 		cp.scan_enable = (u_int8_t) n;
622878ed226SJulian Elischer 		break;
623878ed226SJulian Elischer 
624878ed226SJulian Elischer 	default:
625878ed226SJulian Elischer 		return (USAGE);
626878ed226SJulian Elischer 	}
627878ed226SJulian Elischer 
628878ed226SJulian Elischer 	n = sizeof(rp);
629878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
630878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCAN_ENABLE),
631878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
632878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
633878ed226SJulian Elischer 		return (ERROR);
634878ed226SJulian Elischer 
635878ed226SJulian Elischer 	if (rp.status != 0x00) {
636878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
637878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
638878ed226SJulian Elischer 		return (FAILED);
639878ed226SJulian Elischer 	}
640878ed226SJulian Elischer 
641878ed226SJulian Elischer 	return (OK);
642878ed226SJulian Elischer } /* hci_write_scan_enable */
643878ed226SJulian Elischer 
644878ed226SJulian Elischer /* Send Read_Page_Scan_Activity command to the unit */
645878ed226SJulian Elischer static int
646878ed226SJulian Elischer hci_read_page_scan_activity(int s, int argc, char **argv)
647878ed226SJulian Elischer {
648878ed226SJulian Elischer 	ng_hci_read_page_scan_activity_rp	rp;
649878ed226SJulian Elischer 	int					n;
650878ed226SJulian Elischer 
651878ed226SJulian Elischer 	n = sizeof(rp);
652878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
653878ed226SJulian Elischer 			NG_HCI_OCF_READ_PAGE_SCAN_ACTIVITY),
654878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
655878ed226SJulian Elischer 		return (ERROR);
656878ed226SJulian Elischer 
657878ed226SJulian Elischer 	if (rp.status != 0x00) {
658878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
659878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
660878ed226SJulian Elischer 		return (FAILED);
661878ed226SJulian Elischer 	}
662878ed226SJulian Elischer 
663878ed226SJulian Elischer 	rp.page_scan_interval = le16toh(rp.page_scan_interval);
664878ed226SJulian Elischer 	rp.page_scan_window = le16toh(rp.page_scan_window);
665878ed226SJulian Elischer 
666878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Interval: %.2f msec [%d slots]\n",
667878ed226SJulian Elischer 		rp.page_scan_interval * 0.625, rp.page_scan_interval);
668878ed226SJulian Elischer 	fprintf(stdout, "Page Scan Window: %.2f msec [%d slots]\n",
669878ed226SJulian Elischer 		rp.page_scan_window * 0.625, rp.page_scan_window);
670878ed226SJulian Elischer 
671878ed226SJulian Elischer 	return (OK);
672878ed226SJulian Elischer } /* hci_read_page_scan_activity */
673878ed226SJulian Elischer 
674878ed226SJulian Elischer /* Send Write_Page_Scan_Activity command to the unit */
675878ed226SJulian Elischer static int
676878ed226SJulian Elischer hci_write_page_scan_activity(int s, int argc, char **argv)
677878ed226SJulian Elischer {
678878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_cp	cp;
679878ed226SJulian Elischer 	ng_hci_write_page_scan_activity_rp	rp;
680878ed226SJulian Elischer 	int					n;
681878ed226SJulian Elischer 
682878ed226SJulian Elischer 	/* parse command parameters */
683878ed226SJulian Elischer 	switch (argc) {
684878ed226SJulian Elischer 	case 2:
685878ed226SJulian Elischer 		/* page scan interval */
686878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
687878ed226SJulian Elischer 			return (USAGE);
688878ed226SJulian Elischer 
689878ed226SJulian Elischer 		cp.page_scan_interval = (u_int16_t) n;
690878ed226SJulian Elischer 
691878ed226SJulian Elischer 		/* page scan window */
692878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
693878ed226SJulian Elischer 			return (USAGE);
694878ed226SJulian Elischer 
695878ed226SJulian Elischer 		cp.page_scan_window = (u_int16_t) n;
696878ed226SJulian Elischer 
697878ed226SJulian Elischer 		if (cp.page_scan_window > cp.page_scan_interval)
698878ed226SJulian Elischer 			return (USAGE);
699878ed226SJulian Elischer 
700878ed226SJulian Elischer 		cp.page_scan_interval = htole16(cp.page_scan_interval);
701878ed226SJulian Elischer 		cp.page_scan_window = htole16(cp.page_scan_window);
702878ed226SJulian Elischer 		break;
703878ed226SJulian Elischer 
704878ed226SJulian Elischer 	default:
705878ed226SJulian Elischer 		return (USAGE);
706878ed226SJulian Elischer 	}
707878ed226SJulian Elischer 
708878ed226SJulian Elischer 	/* send command */
709878ed226SJulian Elischer 	n = sizeof(rp);
710878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
711878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY),
712878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
713878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
714878ed226SJulian Elischer 		return (ERROR);
715878ed226SJulian Elischer 
716878ed226SJulian Elischer 	if (rp.status != 0x00) {
717878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
718878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
719878ed226SJulian Elischer 		return (FAILED);
720878ed226SJulian Elischer 	}
721878ed226SJulian Elischer 
722878ed226SJulian Elischer 	return (OK);
723878ed226SJulian Elischer } /* hci_write_page_scan_activity */
724878ed226SJulian Elischer 
725878ed226SJulian Elischer /* Send Read_Inquiry_Scan_Activity command to the unit */
726878ed226SJulian Elischer static int
727878ed226SJulian Elischer hci_read_inquiry_scan_activity(int s, int argc, char **argv)
728878ed226SJulian Elischer {
729878ed226SJulian Elischer 	ng_hci_read_inquiry_scan_activity_rp	rp;
730878ed226SJulian Elischer 	int					n;
731878ed226SJulian Elischer 
732878ed226SJulian Elischer 	n = sizeof(rp);
733878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
734878ed226SJulian Elischer 			NG_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY),
735878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
736878ed226SJulian Elischer 		return (ERROR);
737878ed226SJulian Elischer 
738878ed226SJulian Elischer 	if (rp.status != 0x00) {
739878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
740878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
741878ed226SJulian Elischer 		return (FAILED);
742878ed226SJulian Elischer 	}
743878ed226SJulian Elischer 
744878ed226SJulian Elischer 	rp.inquiry_scan_interval = le16toh(rp.inquiry_scan_interval);
745878ed226SJulian Elischer 	rp.inquiry_scan_window = le16toh(rp.inquiry_scan_window);
746878ed226SJulian Elischer 
747878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Interval: %.2f msec [%d slots]\n",
748878ed226SJulian Elischer 		rp.inquiry_scan_interval * 0.625, rp.inquiry_scan_interval);
749878ed226SJulian Elischer 	fprintf(stdout, "Inquiry Scan Window: %.2f msec [%d slots]\n",
750878ed226SJulian Elischer 		rp.inquiry_scan_window * 0.625, rp.inquiry_scan_interval);
751878ed226SJulian Elischer 
752878ed226SJulian Elischer 	return (OK);
753878ed226SJulian Elischer } /* hci_read_inquiry_scan_activity */
754878ed226SJulian Elischer 
755878ed226SJulian Elischer /* Send Write_Inquiry_Scan_Activity command to the unit */
756878ed226SJulian Elischer static int
757878ed226SJulian Elischer hci_write_inquiry_scan_activity(int s, int argc, char **argv)
758878ed226SJulian Elischer {
759878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_cp	cp;
760878ed226SJulian Elischer 	ng_hci_write_inquiry_scan_activity_rp	rp;
761878ed226SJulian Elischer 	int					n;
762878ed226SJulian Elischer 
763878ed226SJulian Elischer 	/* parse command parameters */
764878ed226SJulian Elischer 	switch (argc) {
765878ed226SJulian Elischer 	case 2:
766878ed226SJulian Elischer 		/* inquiry scan interval */
767878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
768878ed226SJulian Elischer 			return (USAGE);
769878ed226SJulian Elischer 
770878ed226SJulian Elischer 		cp.inquiry_scan_interval = (u_int16_t) n;
771878ed226SJulian Elischer 
772878ed226SJulian Elischer 		/* inquiry scan window */
773878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0x12 || n > 0x1000)
774878ed226SJulian Elischer 			return (USAGE);
775878ed226SJulian Elischer 
776878ed226SJulian Elischer 		cp.inquiry_scan_window = (u_int16_t) n;
777878ed226SJulian Elischer 
778878ed226SJulian Elischer 		if (cp.inquiry_scan_window > cp.inquiry_scan_interval)
779878ed226SJulian Elischer 			return (USAGE);
780878ed226SJulian Elischer 
781878ed226SJulian Elischer 		cp.inquiry_scan_interval =
782878ed226SJulian Elischer 			htole16(cp.inquiry_scan_interval);
783878ed226SJulian Elischer 		cp.inquiry_scan_window = htole16(cp.inquiry_scan_window);
784878ed226SJulian Elischer 		break;
785878ed226SJulian Elischer 
786878ed226SJulian Elischer 	default:
787878ed226SJulian Elischer 		return (USAGE);
788878ed226SJulian Elischer 	}
789878ed226SJulian Elischer 
790878ed226SJulian Elischer 	/* send command */
791878ed226SJulian Elischer 	n = sizeof(rp);
792878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
793878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY),
794878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
795878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
796878ed226SJulian Elischer 		return (ERROR);
797878ed226SJulian Elischer 
798878ed226SJulian Elischer 	if (rp.status != 0x00) {
799878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
800878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
801878ed226SJulian Elischer 		return (FAILED);
802878ed226SJulian Elischer 	}
803878ed226SJulian Elischer 
804878ed226SJulian Elischer 	return (OK);
805878ed226SJulian Elischer } /* hci_write_inquiry_scan_activity */
806878ed226SJulian Elischer 
807878ed226SJulian Elischer /* Send Read_Authentication_Enable command to the unit */
808878ed226SJulian Elischer static int
809878ed226SJulian Elischer hci_read_authentication_enable(int s, int argc, char **argv)
810878ed226SJulian Elischer {
811878ed226SJulian Elischer 	ng_hci_read_auth_enable_rp	rp;
812878ed226SJulian Elischer 	int				n;
813878ed226SJulian Elischer 
814878ed226SJulian Elischer 	n = sizeof(rp);
815878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
816878ed226SJulian Elischer 			NG_HCI_OCF_READ_AUTH_ENABLE),
817878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
818878ed226SJulian Elischer 		return (ERROR);
819878ed226SJulian Elischer 
820878ed226SJulian Elischer 	if (rp.status != 0x00) {
821878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
822878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
823878ed226SJulian Elischer 		return (FAILED);
824878ed226SJulian Elischer 	}
825878ed226SJulian Elischer 
826878ed226SJulian Elischer 	fprintf(stdout, "Authentication Enable: %s [%d]\n",
827878ed226SJulian Elischer 		rp.auth_enable? "Enabled" : "Disabled", rp.auth_enable);
828878ed226SJulian Elischer 
829878ed226SJulian Elischer 	return (OK);
830878ed226SJulian Elischer } /* hci_read_authentication_enable */
831878ed226SJulian Elischer 
832878ed226SJulian Elischer /* Send Write_Authentication_Enable command to the unit */
833878ed226SJulian Elischer static int
834878ed226SJulian Elischer hci_write_authentication_enable(int s, int argc, char **argv)
835878ed226SJulian Elischer {
836878ed226SJulian Elischer 	ng_hci_write_auth_enable_cp	cp;
837878ed226SJulian Elischer 	ng_hci_write_auth_enable_rp	rp;
838878ed226SJulian Elischer 	int				n;
839878ed226SJulian Elischer 
840878ed226SJulian Elischer 	/* parse command parameters */
841878ed226SJulian Elischer 	switch (argc) {
842878ed226SJulian Elischer 	case 1:
843878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
844878ed226SJulian Elischer 			return (USAGE);
845878ed226SJulian Elischer 
846878ed226SJulian Elischer 		cp.auth_enable = (u_int8_t) n;
847878ed226SJulian Elischer 		break;
848878ed226SJulian Elischer 
849878ed226SJulian Elischer 	default:
850878ed226SJulian Elischer 		return (USAGE);
851878ed226SJulian Elischer 	}
852878ed226SJulian Elischer 
853878ed226SJulian Elischer 	/* send command */
854878ed226SJulian Elischer 	n = sizeof(rp);
855878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
856878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_AUTH_ENABLE),
857878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
858878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
859878ed226SJulian Elischer 		return (ERROR);
860878ed226SJulian Elischer 
861878ed226SJulian Elischer 	if (rp.status != 0x00) {
862878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
863878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
864878ed226SJulian Elischer 		return (FAILED);
865878ed226SJulian Elischer 	}
866878ed226SJulian Elischer 
867878ed226SJulian Elischer 	return (OK);
868878ed226SJulian Elischer } /* hci_write_authentication_enable */
869878ed226SJulian Elischer 
870878ed226SJulian Elischer /* Send Read_Encryption_Mode command to the unit */
871878ed226SJulian Elischer static int
872878ed226SJulian Elischer hci_read_encryption_mode(int s, int argc, char **argv)
873878ed226SJulian Elischer {
874878ed226SJulian Elischer 	ng_hci_read_encryption_mode_rp	rp;
875878ed226SJulian Elischer 	int				n;
876878ed226SJulian Elischer 
877878ed226SJulian Elischer 	n = sizeof(rp);
878878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
879878ed226SJulian Elischer 			NG_HCI_OCF_READ_ENCRYPTION_MODE),
880878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
881878ed226SJulian Elischer 		return (ERROR);
882878ed226SJulian Elischer 
883878ed226SJulian Elischer 	if (rp.status != 0x00) {
884878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
885878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
886878ed226SJulian Elischer 		return (FAILED);
887878ed226SJulian Elischer 	}
888878ed226SJulian Elischer 
889878ed226SJulian Elischer 	fprintf(stdout, "Encryption mode: %s [%#02x]\n",
890878ed226SJulian Elischer 		hci_encrypt2str(rp.encryption_mode, 0), rp.encryption_mode);
891878ed226SJulian Elischer 
892878ed226SJulian Elischer 	return (OK);
893878ed226SJulian Elischer } /* hci_read_encryption_mode */
894878ed226SJulian Elischer 
895878ed226SJulian Elischer /* Send Write_Encryption_Mode command to the unit */
896878ed226SJulian Elischer static int
897878ed226SJulian Elischer hci_write_encryption_mode(int s, int argc, char **argv)
898878ed226SJulian Elischer {
899878ed226SJulian Elischer 	ng_hci_write_encryption_mode_cp	cp;
900878ed226SJulian Elischer 	ng_hci_write_encryption_mode_rp	rp;
901878ed226SJulian Elischer 	int				n;
902878ed226SJulian Elischer 
903878ed226SJulian Elischer 	/* parse command parameters */
904878ed226SJulian Elischer 	switch (argc) {
905878ed226SJulian Elischer 	case 1:
906878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
907878ed226SJulian Elischer 			return (USAGE);
908878ed226SJulian Elischer 
909878ed226SJulian Elischer 		cp.encryption_mode = (u_int8_t) n;
910878ed226SJulian Elischer 		break;
911878ed226SJulian Elischer 
912878ed226SJulian Elischer 	default:
913878ed226SJulian Elischer 		return (USAGE);
914878ed226SJulian Elischer 	}
915878ed226SJulian Elischer 
916878ed226SJulian Elischer 	/* send command */
917878ed226SJulian Elischer 	n = sizeof(rp);
918878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
919878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_ENCRYPTION_MODE),
920878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
921878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
922878ed226SJulian Elischer 		return (ERROR);
923878ed226SJulian Elischer 
924878ed226SJulian Elischer 	if (rp.status != 0x00) {
925878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
926878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
927878ed226SJulian Elischer 		return (FAILED);
928878ed226SJulian Elischer 	}
929878ed226SJulian Elischer 
930878ed226SJulian Elischer 	return (OK);
931878ed226SJulian Elischer } /* hci_write_encryption_mode */
932878ed226SJulian Elischer 
933878ed226SJulian Elischer /* Send Read_Class_Of_Device command to the unit */
934878ed226SJulian Elischer static int
935878ed226SJulian Elischer hci_read_class_of_device(int s, int argc, char **argv)
936878ed226SJulian Elischer {
937878ed226SJulian Elischer 	ng_hci_read_unit_class_rp	rp;
938878ed226SJulian Elischer 	int				n;
939878ed226SJulian Elischer 
940878ed226SJulian Elischer 	n = sizeof(rp);
941878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
942878ed226SJulian Elischer 			NG_HCI_OCF_READ_UNIT_CLASS),
943878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
944878ed226SJulian Elischer 		return (ERROR);
945878ed226SJulian Elischer 
946878ed226SJulian Elischer 	if (rp.status != 0x00) {
947878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
948878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
949878ed226SJulian Elischer 		return (FAILED);
950878ed226SJulian Elischer 	}
951878ed226SJulian Elischer 
952878ed226SJulian Elischer 	fprintf(stdout, "Class: %02x:%02x:%02x\n",
953878ed226SJulian Elischer 		rp.uclass[2], rp.uclass[1], rp.uclass[0]);
954878ed226SJulian Elischer 
955878ed226SJulian Elischer 	return (0);
956878ed226SJulian Elischer } /* hci_read_class_of_device */
957878ed226SJulian Elischer 
958878ed226SJulian Elischer /* Send Write_Class_Of_Device command to the unit */
959878ed226SJulian Elischer static int
960878ed226SJulian Elischer hci_write_class_of_device(int s, int argc, char **argv)
961878ed226SJulian Elischer {
962878ed226SJulian Elischer 	ng_hci_write_unit_class_cp	cp;
963878ed226SJulian Elischer 	ng_hci_write_unit_class_rp	rp;
964878ed226SJulian Elischer 	int				n0, n1, n2;
965878ed226SJulian Elischer 
966878ed226SJulian Elischer 	/* parse command parameters */
967878ed226SJulian Elischer 	switch (argc) {
968878ed226SJulian Elischer 	case 1:
969878ed226SJulian Elischer 		if (sscanf(argv[0], "%x:%x:%x", &n2, &n1, &n0) != 3)
970878ed226SJulian Elischer 			return (USAGE);
971878ed226SJulian Elischer 
972878ed226SJulian Elischer 		cp.uclass[0] = (n0 & 0xff);
973878ed226SJulian Elischer 		cp.uclass[1] = (n1 & 0xff);
974878ed226SJulian Elischer 		cp.uclass[2] = (n2 & 0xff);
975878ed226SJulian Elischer 		break;
976878ed226SJulian Elischer 
977878ed226SJulian Elischer 	default:
978878ed226SJulian Elischer 		return (USAGE);
979878ed226SJulian Elischer 	}
980878ed226SJulian Elischer 
981878ed226SJulian Elischer 	/* send command */
982878ed226SJulian Elischer 	n0 = sizeof(rp);
983878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
984878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_UNIT_CLASS),
985878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
986878ed226SJulian Elischer 			(char *) &rp, &n0) == ERROR)
987878ed226SJulian Elischer 		return (ERROR);
988878ed226SJulian Elischer 
989878ed226SJulian Elischer 	if (rp.status != 0x00) {
990878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
991878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
992878ed226SJulian Elischer 		return (FAILED);
993878ed226SJulian Elischer 	}
994878ed226SJulian Elischer 
995878ed226SJulian Elischer 	return (OK);
996878ed226SJulian Elischer } /* hci_write_class_of_device */
997878ed226SJulian Elischer 
998878ed226SJulian Elischer /* Send Read_Voice_Settings command to the unit */
999878ed226SJulian Elischer static int
1000878ed226SJulian Elischer hci_read_voice_settings(int s, int argc, char **argv)
1001878ed226SJulian Elischer {
1002878ed226SJulian Elischer 	ng_hci_read_voice_settings_rp	rp;
1003878ed226SJulian Elischer 	int				n,
1004878ed226SJulian Elischer 					input_coding,
1005878ed226SJulian Elischer 					input_data_format,
1006878ed226SJulian Elischer 					input_sample_size;
1007878ed226SJulian Elischer 
1008878ed226SJulian Elischer 	n = sizeof(rp);
1009878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1010878ed226SJulian Elischer 			NG_HCI_OCF_READ_VOICE_SETTINGS),
1011878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1012878ed226SJulian Elischer 		return (ERROR);
1013878ed226SJulian Elischer 
1014878ed226SJulian Elischer 	if (rp.status != 0x00) {
1015878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1016878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1017878ed226SJulian Elischer 		return (FAILED);
1018878ed226SJulian Elischer 	}
1019878ed226SJulian Elischer 
1020878ed226SJulian Elischer 	rp.settings = le16toh(rp.settings);
1021878ed226SJulian Elischer 
1022878ed226SJulian Elischer 	input_coding      = (rp.settings & 0x0300) >> 8;
1023878ed226SJulian Elischer 	input_data_format = (rp.settings & 0x00c0) >> 6;
1024878ed226SJulian Elischer 	input_sample_size = (rp.settings & 0x0020) >> 5;
1025878ed226SJulian Elischer 
1026878ed226SJulian Elischer 	fprintf(stdout, "Voice settings: %#04x\n", rp.settings);
1027878ed226SJulian Elischer 	fprintf(stdout, "Input coding: %s [%d]\n",
1028878ed226SJulian Elischer 		hci_coding2str(input_coding), input_coding);
1029878ed226SJulian Elischer 	fprintf(stdout, "Input data format: %s [%d]\n",
1030878ed226SJulian Elischer 		hci_vdata2str(input_data_format), input_data_format);
1031878ed226SJulian Elischer 
1032878ed226SJulian Elischer 	if (input_coding == 0x00) /* Only for Linear PCM */
1033878ed226SJulian Elischer 		fprintf(stdout, "Input sample size: %d bit [%d]\n",
1034878ed226SJulian Elischer 			input_sample_size? 16 : 8, input_sample_size);
1035878ed226SJulian Elischer 
1036878ed226SJulian Elischer 	return (OK);
1037878ed226SJulian Elischer } /* hci_read_voice_settings */
1038878ed226SJulian Elischer 
1039878ed226SJulian Elischer /* Send Write_Voice_Settings command to the unit */
1040878ed226SJulian Elischer static int
1041878ed226SJulian Elischer hci_write_voice_settings(int s, int argc, char **argv)
1042878ed226SJulian Elischer {
1043878ed226SJulian Elischer 	ng_hci_write_voice_settings_cp	cp;
1044878ed226SJulian Elischer 	ng_hci_write_voice_settings_rp	rp;
1045878ed226SJulian Elischer 	int				n;
1046878ed226SJulian Elischer 
1047878ed226SJulian Elischer 	/* parse command parameters */
1048878ed226SJulian Elischer 	switch (argc) {
1049878ed226SJulian Elischer 	case 1:
1050878ed226SJulian Elischer 		if (sscanf(argv[0], "%x", &n) != 1)
1051878ed226SJulian Elischer 			return (USAGE);
1052878ed226SJulian Elischer 
1053878ed226SJulian Elischer 		cp.settings = (u_int16_t) n;
1054878ed226SJulian Elischer 		cp.settings = htole16(cp.settings);
1055878ed226SJulian Elischer 		break;
1056878ed226SJulian Elischer 
1057878ed226SJulian Elischer 	default:
1058878ed226SJulian Elischer 		return (USAGE);
1059878ed226SJulian Elischer 	}
1060878ed226SJulian Elischer 
1061878ed226SJulian Elischer 	/* send command */
1062878ed226SJulian Elischer 	n = sizeof(rp);
1063878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1064878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_VOICE_SETTINGS),
1065878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1066878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1067878ed226SJulian Elischer 		return (ERROR);
1068878ed226SJulian Elischer 
1069878ed226SJulian Elischer 	if (rp.status != 0x00) {
1070878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1071878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1072878ed226SJulian Elischer 		return (FAILED);
1073878ed226SJulian Elischer 	}
1074878ed226SJulian Elischer 
1075878ed226SJulian Elischer 	return (OK);
1076878ed226SJulian Elischer } /* hci_write_voice_settings */
1077878ed226SJulian Elischer 
1078878ed226SJulian Elischer /* Send Read_Number_Broadcast_Restransmissions */
1079878ed226SJulian Elischer static int
1080878ed226SJulian Elischer hci_read_number_broadcast_retransmissions(int s, int argc, char **argv)
1081878ed226SJulian Elischer {
1082878ed226SJulian Elischer 	ng_hci_read_num_broadcast_retrans_rp	rp;
1083878ed226SJulian Elischer 	int					n;
1084878ed226SJulian Elischer 
1085878ed226SJulian Elischer 	n = sizeof(rp);
1086878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1087878ed226SJulian Elischer 			NG_HCI_OCF_READ_NUM_BROADCAST_RETRANS),
1088878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1089878ed226SJulian Elischer 		return (ERROR);
1090878ed226SJulian Elischer 
1091878ed226SJulian Elischer 	if (rp.status != 0x00) {
1092878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1093878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1094878ed226SJulian Elischer 		return (FAILED);
1095878ed226SJulian Elischer 	}
1096878ed226SJulian Elischer 
1097878ed226SJulian Elischer 	fprintf(stdout, "Number of broadcast retransmissions: %d\n",
1098878ed226SJulian Elischer 		rp.counter);
1099878ed226SJulian Elischer 
1100878ed226SJulian Elischer 	return (OK);
1101878ed226SJulian Elischer } /* hci_read_number_broadcast_retransmissions */
1102878ed226SJulian Elischer 
1103878ed226SJulian Elischer /* Send Write_Number_Broadcast_Restransmissions */
1104878ed226SJulian Elischer static int
1105878ed226SJulian Elischer hci_write_number_broadcast_retransmissions(int s, int argc, char **argv)
1106878ed226SJulian Elischer {
1107878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_cp	cp;
1108878ed226SJulian Elischer 	ng_hci_write_num_broadcast_retrans_rp	rp;
1109878ed226SJulian Elischer 	int					n;
1110878ed226SJulian Elischer 
1111878ed226SJulian Elischer 	/* parse command parameters */
1112878ed226SJulian Elischer 	switch (argc) {
1113878ed226SJulian Elischer 	case 1:
1114878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 0xff)
1115878ed226SJulian Elischer 			return (USAGE);
1116878ed226SJulian Elischer 
1117878ed226SJulian Elischer 		cp.counter = (u_int8_t) n;
1118878ed226SJulian Elischer 		break;
1119878ed226SJulian Elischer 
1120878ed226SJulian Elischer 	default:
1121878ed226SJulian Elischer 		return (USAGE);
1122878ed226SJulian Elischer 	}
1123878ed226SJulian Elischer 
1124878ed226SJulian Elischer 	/* send command */
1125878ed226SJulian Elischer 	n = sizeof(rp);
1126878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1127878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_NUM_BROADCAST_RETRANS),
1128878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1129878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1130878ed226SJulian Elischer 		return (ERROR);
1131878ed226SJulian Elischer 
1132878ed226SJulian Elischer 	if (rp.status != 0x00) {
1133878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1134878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1135878ed226SJulian Elischer 		return (FAILED);
1136878ed226SJulian Elischer 	}
1137878ed226SJulian Elischer 
1138878ed226SJulian Elischer 	return (OK);
1139878ed226SJulian Elischer } /* hci_write_number_broadcast_retransmissions */
1140878ed226SJulian Elischer 
1141878ed226SJulian Elischer /* Send Read_Hold_Mode_Activity command to the unit */
1142878ed226SJulian Elischer static int
1143878ed226SJulian Elischer hci_read_hold_mode_activity(int s, int argc, char **argv)
1144878ed226SJulian Elischer {
1145878ed226SJulian Elischer 	ng_hci_read_hold_mode_activity_rp	rp;
1146878ed226SJulian Elischer 	int					n;
1147878ed226SJulian Elischer 	char					buffer[1024];
1148878ed226SJulian Elischer 
1149878ed226SJulian Elischer 	n = sizeof(rp);
1150878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1151878ed226SJulian Elischer 			NG_HCI_OCF_READ_HOLD_MODE_ACTIVITY),
1152878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1153878ed226SJulian Elischer 		return (ERROR);
1154878ed226SJulian Elischer 
1155878ed226SJulian Elischer 	if (rp.status != 0x00) {
1156878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1157878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1158878ed226SJulian Elischer 		return (FAILED);
1159878ed226SJulian Elischer 	}
1160878ed226SJulian Elischer 
1161878ed226SJulian Elischer 	fprintf(stdout, "Hold Mode Activities: %#02x\n", rp.hold_mode_activity);
1162878ed226SJulian Elischer 	if (rp.hold_mode_activity == 0)
1163878ed226SJulian Elischer 		fprintf(stdout, "Maintain current Power State");
1164878ed226SJulian Elischer 	else
1165878ed226SJulian Elischer 		fprintf(stdout, "%s", hci_hmode2str(rp.hold_mode_activity,
1166878ed226SJulian Elischer 				buffer, sizeof(buffer)));
1167878ed226SJulian Elischer 
1168878ed226SJulian Elischer 	fprintf(stdout, "\n");
1169878ed226SJulian Elischer 
1170878ed226SJulian Elischer 	return (OK);
1171878ed226SJulian Elischer } /* hci_read_hold_mode_activity */
1172878ed226SJulian Elischer 
1173878ed226SJulian Elischer /* Send Write_Hold_Mode_Activity command to the unit */
1174878ed226SJulian Elischer static int
1175878ed226SJulian Elischer hci_write_hold_mode_activity(int s, int argc, char **argv)
1176878ed226SJulian Elischer {
1177878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_cp	cp;
1178878ed226SJulian Elischer 	ng_hci_write_hold_mode_activity_rp	rp;
1179878ed226SJulian Elischer 	int					n;
1180878ed226SJulian Elischer 
1181878ed226SJulian Elischer 	/* parse command parameters */
1182878ed226SJulian Elischer 	switch (argc) {
1183878ed226SJulian Elischer 	case 1:
1184878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 4)
1185878ed226SJulian Elischer 			return (USAGE);
1186878ed226SJulian Elischer 
1187878ed226SJulian Elischer 		cp.hold_mode_activity = (u_int8_t) n;
1188878ed226SJulian Elischer 		break;
1189878ed226SJulian Elischer 
1190878ed226SJulian Elischer 	default:
1191878ed226SJulian Elischer 		return (USAGE);
1192878ed226SJulian Elischer 	}
1193878ed226SJulian Elischer 
1194878ed226SJulian Elischer 	/* send command */
1195878ed226SJulian Elischer 	n = sizeof(rp);
1196878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1197878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY),
1198878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1199878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1200878ed226SJulian Elischer 		return (ERROR);
1201878ed226SJulian Elischer 
1202878ed226SJulian Elischer 	if (rp.status != 0x00) {
1203878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1204878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1205878ed226SJulian Elischer 		return (FAILED);
1206878ed226SJulian Elischer 	}
1207878ed226SJulian Elischer 
1208878ed226SJulian Elischer 	return (OK);
1209878ed226SJulian Elischer } /* hci_write_hold_mode_activity */
1210878ed226SJulian Elischer 
1211878ed226SJulian Elischer /* Send Read_SCO_Flow_Control_Enable command to the unit */
1212878ed226SJulian Elischer static int
1213878ed226SJulian Elischer hci_read_sco_flow_control_enable(int s, int argc, char **argv)
1214878ed226SJulian Elischer {
1215878ed226SJulian Elischer 	ng_hci_read_sco_flow_control_rp	rp;
1216878ed226SJulian Elischer 	int				n;
1217878ed226SJulian Elischer 
1218878ed226SJulian Elischer 	n = sizeof(rp);
1219878ed226SJulian Elischer 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1220878ed226SJulian Elischer 			NG_HCI_OCF_READ_SCO_FLOW_CONTROL),
1221878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1222878ed226SJulian Elischer 		return (ERROR);
1223878ed226SJulian Elischer 
1224878ed226SJulian Elischer 	if (rp.status != 0x00) {
1225878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1226878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1227878ed226SJulian Elischer 		return (FAILED);
1228878ed226SJulian Elischer 	}
1229878ed226SJulian Elischer 
1230878ed226SJulian Elischer 	fprintf(stdout, "SCO flow control %s [%d]\n",
1231878ed226SJulian Elischer 		rp.flow_control? "enabled" : "disabled", rp.flow_control);
1232878ed226SJulian Elischer 
1233878ed226SJulian Elischer 	return (OK);
1234878ed226SJulian Elischer } /* hci_read_sco_flow_control_enable */
1235878ed226SJulian Elischer 
1236878ed226SJulian Elischer /* Send Write_SCO_Flow_Control_Enable command to the unit */
1237878ed226SJulian Elischer static int
1238878ed226SJulian Elischer hci_write_sco_flow_control_enable(int s, int argc, char **argv)
1239878ed226SJulian Elischer {
1240878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_cp	cp;
1241878ed226SJulian Elischer 	ng_hci_write_sco_flow_control_rp	rp;
1242878ed226SJulian Elischer 	int					n;
1243878ed226SJulian Elischer 
1244878ed226SJulian Elischer 	/* parse command parameters */
1245878ed226SJulian Elischer 	switch (argc) {
1246878ed226SJulian Elischer 	case 1:
1247878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 1)
1248878ed226SJulian Elischer 			return (USAGE);
1249878ed226SJulian Elischer 
1250878ed226SJulian Elischer 		cp.flow_control = (u_int8_t) n;
1251878ed226SJulian Elischer 		break;
1252878ed226SJulian Elischer 
1253878ed226SJulian Elischer 	default:
1254878ed226SJulian Elischer 		return (USAGE);
1255878ed226SJulian Elischer 	}
1256878ed226SJulian Elischer 
1257878ed226SJulian Elischer 	/* send command */
1258878ed226SJulian Elischer 	n = sizeof(rp);
1259878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1260878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_SCO_FLOW_CONTROL),
1261878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1262878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1263878ed226SJulian Elischer 		return (ERROR);
1264878ed226SJulian Elischer 
1265878ed226SJulian Elischer 	if (rp.status != 0x00) {
1266878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1267878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1268878ed226SJulian Elischer 		return (FAILED);
1269878ed226SJulian Elischer 	}
1270878ed226SJulian Elischer 
1271878ed226SJulian Elischer 	return (OK);
1272878ed226SJulian Elischer } /* hci_write_sco_flow_control_enable */
1273878ed226SJulian Elischer 
1274878ed226SJulian Elischer /* Send Read_Link_Supervision_Timeout command to the unit */
1275878ed226SJulian Elischer static int
1276878ed226SJulian Elischer hci_read_link_supervision_timeout(int s, int argc, char **argv)
1277878ed226SJulian Elischer {
1278878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_cp	cp;
1279878ed226SJulian Elischer 	ng_hci_read_link_supervision_timo_rp	rp;
1280878ed226SJulian Elischer 	int					n;
1281878ed226SJulian Elischer 
1282878ed226SJulian Elischer 	switch (argc) {
1283878ed226SJulian Elischer 	case 1:
1284878ed226SJulian Elischer 		/* connection handle */
1285878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1286878ed226SJulian Elischer 			return (USAGE);
1287878ed226SJulian Elischer 
1288878ed226SJulian Elischer 		cp.con_handle = (u_int16_t) (n & 0x0fff);
1289878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1290878ed226SJulian Elischer 		break;
1291878ed226SJulian Elischer 
1292878ed226SJulian Elischer 	default:
1293878ed226SJulian Elischer 		return (USAGE);
1294878ed226SJulian Elischer 	}
1295878ed226SJulian Elischer 
1296878ed226SJulian Elischer 	/* send command */
1297878ed226SJulian Elischer 	n = sizeof(rp);
1298878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1299878ed226SJulian Elischer 			NG_HCI_OCF_READ_LINK_SUPERVISION_TIMO),
1300878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1301878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1302878ed226SJulian Elischer 		return (ERROR);
1303878ed226SJulian Elischer 
1304878ed226SJulian Elischer 	if (rp.status != 0x00) {
1305878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1306878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1307878ed226SJulian Elischer 		return (FAILED);
1308878ed226SJulian Elischer 	}
1309878ed226SJulian Elischer 
1310878ed226SJulian Elischer 	rp.timeout = le16toh(rp.timeout);
1311878ed226SJulian Elischer 
1312878ed226SJulian Elischer 	fprintf(stdout, "Connection handle: %d\n", le16toh(rp.con_handle));
1313878ed226SJulian Elischer 	fprintf(stdout, "Link supervision timeout: %.2f msec [%d slots]\n",
1314878ed226SJulian Elischer 		rp.timeout * 0.625, rp.timeout);
1315878ed226SJulian Elischer 
1316878ed226SJulian Elischer 	return (OK);
1317878ed226SJulian Elischer } /* hci_read_link_supervision_timeout */
1318878ed226SJulian Elischer 
1319878ed226SJulian Elischer /* Send Write_Link_Supervision_Timeout command to the unit */
1320878ed226SJulian Elischer static int
1321878ed226SJulian Elischer hci_write_link_supervision_timeout(int s, int argc, char **argv)
1322878ed226SJulian Elischer {
1323878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_cp	cp;
1324878ed226SJulian Elischer 	ng_hci_write_link_supervision_timo_rp	rp;
1325878ed226SJulian Elischer 	int					n;
1326878ed226SJulian Elischer 
1327878ed226SJulian Elischer 	switch (argc) {
1328878ed226SJulian Elischer 	case 2:
1329878ed226SJulian Elischer 		/* connection handle */
1330878ed226SJulian Elischer 		if (sscanf(argv[0], "%d", &n) != 1 || n <= 0 || n > 0x0eff)
1331878ed226SJulian Elischer 			return (USAGE);
1332878ed226SJulian Elischer 
1333878ed226SJulian Elischer 		cp.con_handle = (u_int16_t) (n & 0x0fff);
1334878ed226SJulian Elischer 		cp.con_handle = htole16(cp.con_handle);
1335878ed226SJulian Elischer 
1336878ed226SJulian Elischer 		/* link supervision timeout */
1337878ed226SJulian Elischer 		if (sscanf(argv[1], "%d", &n) != 1 || n < 0 || n > 0xeff)
1338878ed226SJulian Elischer 			return (USAGE);
1339878ed226SJulian Elischer 
1340878ed226SJulian Elischer 		cp.timeout = (u_int16_t) (n & 0x0fff);
1341878ed226SJulian Elischer 		cp.timeout = htole16(cp.timeout);
1342878ed226SJulian Elischer 		break;
1343878ed226SJulian Elischer 
1344878ed226SJulian Elischer 	default:
1345878ed226SJulian Elischer 		return (USAGE);
1346878ed226SJulian Elischer 	}
1347878ed226SJulian Elischer 
1348878ed226SJulian Elischer 	/* send command */
1349878ed226SJulian Elischer 	n = sizeof(rp);
1350878ed226SJulian Elischer 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
1351878ed226SJulian Elischer 			NG_HCI_OCF_WRITE_LINK_SUPERVISION_TIMO),
1352878ed226SJulian Elischer 			(char const *) &cp, sizeof(cp),
1353878ed226SJulian Elischer 			(char *) &rp, &n) == ERROR)
1354878ed226SJulian Elischer 		return (ERROR);
1355878ed226SJulian Elischer 
1356878ed226SJulian Elischer 	if (rp.status != 0x00) {
1357878ed226SJulian Elischer 		fprintf(stdout, "Status: %s [%#02x]\n",
1358878ed226SJulian Elischer 			hci_status2str(rp.status), rp.status);
1359878ed226SJulian Elischer 		return (FAILED);
1360878ed226SJulian Elischer 	}
1361878ed226SJulian Elischer 
1362878ed226SJulian Elischer 	return (OK);
1363878ed226SJulian Elischer } /* hci_write_link_supervision_timeout */
1364878ed226SJulian Elischer 
13650986ab12SMaksim Yevmenkin /* Send Read_Page_Scan_Period_Mode command to the unit */
13660986ab12SMaksim Yevmenkin static int
13670986ab12SMaksim Yevmenkin hci_read_page_scan_period_mode(int s, int argc, char **argv)
13680986ab12SMaksim Yevmenkin {
13690986ab12SMaksim Yevmenkin 	ng_hci_read_page_scan_period_rp	rp;
13700986ab12SMaksim Yevmenkin 	int				n;
13710986ab12SMaksim Yevmenkin 
13720986ab12SMaksim Yevmenkin 	n = sizeof(rp);
13730986ab12SMaksim Yevmenkin 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
13740986ab12SMaksim Yevmenkin 			NG_HCI_OCF_READ_PAGE_SCAN_PERIOD),
13750986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
13760986ab12SMaksim Yevmenkin 		return (ERROR);
13770986ab12SMaksim Yevmenkin 
13780986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
13790986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
13800986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
13810986ab12SMaksim Yevmenkin 		return (FAILED);
13820986ab12SMaksim Yevmenkin 	}
13830986ab12SMaksim Yevmenkin 
13840986ab12SMaksim Yevmenkin 	fprintf(stdout, "Page scan period mode: %#02x\n",
13850986ab12SMaksim Yevmenkin 		rp.page_scan_period_mode);
13860986ab12SMaksim Yevmenkin 
13870986ab12SMaksim Yevmenkin 	return (OK);
13880986ab12SMaksim Yevmenkin } /* hci_read_page_scan_period_mode */
13890986ab12SMaksim Yevmenkin 
13900986ab12SMaksim Yevmenkin /* Send Write_Page_Scan_Period_Mode command to the unit */
13910986ab12SMaksim Yevmenkin static int
13920986ab12SMaksim Yevmenkin hci_write_page_scan_period_mode(int s, int argc, char **argv)
13930986ab12SMaksim Yevmenkin {
13940986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_period_cp	cp;
13950986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_period_rp	rp;
13960986ab12SMaksim Yevmenkin 	int					n;
13970986ab12SMaksim Yevmenkin 
13980986ab12SMaksim Yevmenkin 	/* parse command arguments */
13990986ab12SMaksim Yevmenkin 	switch (argc) {
14000986ab12SMaksim Yevmenkin 	case 1:
14010986ab12SMaksim Yevmenkin 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 2)
14020986ab12SMaksim Yevmenkin 			return (USAGE);
14030986ab12SMaksim Yevmenkin 
14040986ab12SMaksim Yevmenkin 		cp.page_scan_period_mode = (n & 0xff);
14050986ab12SMaksim Yevmenkin 		break;
14060986ab12SMaksim Yevmenkin 
14070986ab12SMaksim Yevmenkin 	default:
14080986ab12SMaksim Yevmenkin 		return (USAGE);
14090986ab12SMaksim Yevmenkin 	}
14100986ab12SMaksim Yevmenkin 
14110986ab12SMaksim Yevmenkin 	/* send command */
14120986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14130986ab12SMaksim Yevmenkin 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14140986ab12SMaksim Yevmenkin 			NG_HCI_OCF_WRITE_PAGE_SCAN_PERIOD),
14150986ab12SMaksim Yevmenkin 			(char const *) &cp, sizeof(cp),
14160986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14170986ab12SMaksim Yevmenkin 		return (ERROR);
14180986ab12SMaksim Yevmenkin 
14190986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14200986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14210986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14220986ab12SMaksim Yevmenkin 		return (FAILED);
14230986ab12SMaksim Yevmenkin 	}
14240986ab12SMaksim Yevmenkin 
14250986ab12SMaksim Yevmenkin 	return (OK);
14260986ab12SMaksim Yevmenkin } /* hci_write_page_scan_period_mode */
14270986ab12SMaksim Yevmenkin 
14280986ab12SMaksim Yevmenkin /* Send Read_Page_Scan_Mode command to the unit */
14290986ab12SMaksim Yevmenkin static int
14300986ab12SMaksim Yevmenkin hci_read_page_scan_mode(int s, int argc, char **argv)
14310986ab12SMaksim Yevmenkin {
14320986ab12SMaksim Yevmenkin 	ng_hci_read_page_scan_rp	rp;
14330986ab12SMaksim Yevmenkin 	int				n;
14340986ab12SMaksim Yevmenkin 
14350986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14360986ab12SMaksim Yevmenkin 	if (hci_simple_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14370986ab12SMaksim Yevmenkin 			NG_HCI_OCF_READ_PAGE_SCAN),
14380986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14390986ab12SMaksim Yevmenkin 		return (ERROR);
14400986ab12SMaksim Yevmenkin 
14410986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14420986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14430986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14440986ab12SMaksim Yevmenkin 		return (FAILED);
14450986ab12SMaksim Yevmenkin 	}
14460986ab12SMaksim Yevmenkin 
14470986ab12SMaksim Yevmenkin 	fprintf(stdout, "Page scan mode: %#02x\n", rp.page_scan_mode);
14480986ab12SMaksim Yevmenkin 
14490986ab12SMaksim Yevmenkin 	return (OK);
14500986ab12SMaksim Yevmenkin } /* hci_read_page_scan_mode */
14510986ab12SMaksim Yevmenkin 
14520986ab12SMaksim Yevmenkin /* Send Write_Page_Scan_Mode command to the unit */
14530986ab12SMaksim Yevmenkin static int
14540986ab12SMaksim Yevmenkin hci_write_page_scan_mode(int s, int argc, char **argv)
14550986ab12SMaksim Yevmenkin {
14560986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_cp	cp;
14570986ab12SMaksim Yevmenkin 	ng_hci_write_page_scan_rp	rp;
14580986ab12SMaksim Yevmenkin 	int				n;
14590986ab12SMaksim Yevmenkin 
14600986ab12SMaksim Yevmenkin 	/* parse command arguments */
14610986ab12SMaksim Yevmenkin 	switch (argc) {
14620986ab12SMaksim Yevmenkin 	case 1:
14630986ab12SMaksim Yevmenkin 		if (sscanf(argv[0], "%d", &n) != 1 || n < 0 || n > 3)
14640986ab12SMaksim Yevmenkin 			return (USAGE);
14650986ab12SMaksim Yevmenkin 
14660986ab12SMaksim Yevmenkin 		cp.page_scan_mode = (n & 0xff);
14670986ab12SMaksim Yevmenkin 		break;
14680986ab12SMaksim Yevmenkin 
14690986ab12SMaksim Yevmenkin 	default:
14700986ab12SMaksim Yevmenkin 		return (USAGE);
14710986ab12SMaksim Yevmenkin 	}
14720986ab12SMaksim Yevmenkin 
14730986ab12SMaksim Yevmenkin 	/* send command */
14740986ab12SMaksim Yevmenkin 	n = sizeof(rp);
14750986ab12SMaksim Yevmenkin 	if (hci_request(s, NG_HCI_OPCODE(NG_HCI_OGF_HC_BASEBAND,
14760986ab12SMaksim Yevmenkin 			NG_HCI_OCF_WRITE_PAGE_SCAN),
14770986ab12SMaksim Yevmenkin 			(char const *) &cp, sizeof(cp),
14780986ab12SMaksim Yevmenkin 			(char *) &rp, &n) == ERROR)
14790986ab12SMaksim Yevmenkin 		return (ERROR);
14800986ab12SMaksim Yevmenkin 
14810986ab12SMaksim Yevmenkin 	if (rp.status != 0x00) {
14820986ab12SMaksim Yevmenkin 		fprintf(stdout, "Status: %s [%#02x]\n",
14830986ab12SMaksim Yevmenkin 			hci_status2str(rp.status), rp.status);
14840986ab12SMaksim Yevmenkin 		return (FAILED);
14850986ab12SMaksim Yevmenkin 	}
14860986ab12SMaksim Yevmenkin 
14870986ab12SMaksim Yevmenkin 	return (OK);
14880986ab12SMaksim Yevmenkin } /* hci_write_page_scan_mode */
14890986ab12SMaksim Yevmenkin 
1490878ed226SJulian Elischer struct hci_command	host_controller_baseband_commands[] = {
1491878ed226SJulian Elischer {
1492878ed226SJulian Elischer "reset",
1493878ed226SJulian Elischer "\nThe Reset command will reset the Host Controller and the Link Manager.\n" \
1494878ed226SJulian Elischer "After the reset is completed, the current operational state will be lost,\n" \
1495878ed226SJulian Elischer "the Bluetooth unit will enter standby mode and the Host Controller will\n" \
1496878ed226SJulian Elischer "automatically revert to the default values for the parameters for which\n" \
1497878ed226SJulian Elischer "default values are defined in the specification.",
1498878ed226SJulian Elischer &hci_reset
1499878ed226SJulian Elischer },
1500878ed226SJulian Elischer {
1501878ed226SJulian Elischer "read_pin_type",
1502878ed226SJulian Elischer "\nThe Read_PIN_Type command is used for the Host to read whether the Link\n" \
1503878ed226SJulian Elischer "Manager assumes that the Host supports variable PIN codes only a fixed PIN\n" \
1504878ed226SJulian Elischer "code.",
1505878ed226SJulian Elischer &hci_read_pin_type
1506878ed226SJulian Elischer },
1507878ed226SJulian Elischer {
1508878ed226SJulian Elischer "write_pin_type <pin_type>",
1509878ed226SJulian Elischer "\nThe Write_PIN_Type command is used for the Host to write to the Host\n" \
1510878ed226SJulian Elischer "Controller whether the Host supports variable PIN codes or only a fixed PIN\n"\
1511878ed226SJulian Elischer "code.\n\n" \
1512878ed226SJulian Elischer "\t<pin_type> - dd; 0 - Variable; 1 - Fixed",
1513878ed226SJulian Elischer &hci_write_pin_type
1514878ed226SJulian Elischer },
1515878ed226SJulian Elischer {
1516878ed226SJulian Elischer "read_stored_link_key [<bdaddr>]",
1517878ed226SJulian Elischer "\nThe Read_Stored_Link_Key command provides the ability to read one or\n" \
1518878ed226SJulian Elischer "more link keys stored in the Bluetooth Host Controller. The Bluetooth Host\n" \
1519878ed226SJulian Elischer "Controller can store a limited number of link keys for other Bluetooth\n" \
1520878ed226SJulian Elischer "devices.\n\n" \
1521878ed226SJulian Elischer "\t<bdaddr> - xx:xx:xx:xx:xx:xx BD_ADDR",
1522878ed226SJulian Elischer &hci_read_stored_link_key
1523878ed226SJulian Elischer },
1524878ed226SJulian Elischer {
1525878ed226SJulian Elischer "write_stored_link_key <bdaddr> <key>",
1526878ed226SJulian Elischer "\nThe Write_Stored_Link_Key command provides the ability to write one\n" \
1527878ed226SJulian Elischer "or more link keys to be stored in the Bluetooth Host Controller. The\n" \
1528878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1529878ed226SJulian Elischer "Bluetooth devices. If no additional space is available in the Bluetooth\n"\
1530878ed226SJulian Elischer "Host Controller then no additional link keys will be stored.\n\n" \
1531878ed226SJulian Elischer "\t<bdaddr> - xx:xx:xx:xx:xx:xx BD_ADDR\n" \
1532878ed226SJulian Elischer "\t<key>    - xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx up to 16 bytes link key",
1533878ed226SJulian Elischer &hci_write_stored_link_key
1534878ed226SJulian Elischer },
1535878ed226SJulian Elischer {
1536878ed226SJulian Elischer "delete_stored_link_key [<bdaddr>]",
1537878ed226SJulian Elischer "\nThe Delete_Stored_Link_Key command provides the ability to remove one\n" \
1538878ed226SJulian Elischer "or more of the link keys stored in the Bluetooth Host Controller. The\n" \
1539878ed226SJulian Elischer "Bluetooth Host Controller can store a limited number of link keys for other\n"\
1540878ed226SJulian Elischer "Bluetooth devices.\n\n" \
1541878ed226SJulian Elischer "\t<bdaddr> - xx:xx:xx:xx:xx:xx BD_ADDR",
1542878ed226SJulian Elischer &hci_delete_stored_link_key
1543878ed226SJulian Elischer },
1544878ed226SJulian Elischer {
1545878ed226SJulian Elischer "change_local_name <name>",
1546878ed226SJulian Elischer "\nThe Change_Local_Name command provides the ability to modify the user\n" \
1547878ed226SJulian Elischer "friendly name for the Bluetooth unit.\n\n" \
1548878ed226SJulian Elischer "\t<name> - string",
1549878ed226SJulian Elischer &hci_change_local_name
1550878ed226SJulian Elischer },
1551878ed226SJulian Elischer {
1552878ed226SJulian Elischer "read_local_name",
1553878ed226SJulian Elischer "\nThe Read_Local_Name command provides the ability to read the\n" \
1554878ed226SJulian Elischer "stored user-friendly name for the Bluetooth unit.",
1555878ed226SJulian Elischer &hci_read_local_name
1556878ed226SJulian Elischer },
1557878ed226SJulian Elischer {
1558878ed226SJulian Elischer "read_connection_accept_timeout",
1559878ed226SJulian Elischer "\nThis command will read the value for the Connection_Accept_Timeout\n" \
1560878ed226SJulian Elischer "configuration parameter. The Connection_Accept_Timeout configuration\n" \
1561878ed226SJulian Elischer "parameter allows the Bluetooth hardware to automatically deny a\n" \
1562878ed226SJulian Elischer "connection request after a specified time period has occurred and\n" \
1563878ed226SJulian Elischer "the new connection is not accepted. Connection Accept Timeout\n" \
1564878ed226SJulian Elischer "measured in Number of Baseband slots.",
1565878ed226SJulian Elischer &hci_read_connection_accept_timeout
1566878ed226SJulian Elischer },
1567878ed226SJulian Elischer {
1568878ed226SJulian Elischer "write_connection_accept_timeout <timeout>",
1569878ed226SJulian Elischer "\nThis command will write the value for the Connection_Accept_Timeout\n" \
1570878ed226SJulian Elischer "configuration parameter.\n\n" \
1571878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1572878ed226SJulian Elischer &hci_write_connection_accept_timeout
1573878ed226SJulian Elischer },
1574878ed226SJulian Elischer {
1575878ed226SJulian Elischer "read_page_timeout",
1576878ed226SJulian Elischer "\nThis command will read the value for the Page_Timeout configuration\n" \
1577878ed226SJulian Elischer "parameter. The Page_Timeout configuration parameter defines the\n" \
1578878ed226SJulian Elischer "maximum time the local Link Manager will wait for a baseband page\n" \
1579878ed226SJulian Elischer "response from the remote unit at a locally initiated connection\n" \
1580878ed226SJulian Elischer "attempt. Page Timeout measured in Number of Baseband slots.",
1581878ed226SJulian Elischer &hci_read_page_timeout
1582878ed226SJulian Elischer },
1583878ed226SJulian Elischer {
1584878ed226SJulian Elischer "write_page_timeout <timeout>",
1585878ed226SJulian Elischer "\nThis command will write the value for the Page_Timeout configuration\n" \
1586878ed226SJulian Elischer "parameter.\n\n" \
1587878ed226SJulian Elischer "\t<timeout> - dddd; measured in number of baseband slots.",
1588878ed226SJulian Elischer &hci_write_page_timeout
1589878ed226SJulian Elischer },
1590878ed226SJulian Elischer {
1591878ed226SJulian Elischer "read_scan_enable",
1592878ed226SJulian Elischer "\nThis command will read the value for the Scan_Enable parameter. The\n" \
1593878ed226SJulian Elischer "Scan_Enable parameter controls whether or not the Bluetooth uint\n" \
1594878ed226SJulian Elischer "will periodically scan for page attempts and/or inquiry requests\n" \
1595878ed226SJulian Elischer "from other Bluetooth unit.\n\n" \
1596878ed226SJulian Elischer "\t0x00 - No Scans enabled.\n" \
1597878ed226SJulian Elischer "\t0x01 - Inquiry Scan enabled. Page Scan disabled.\n" \
1598878ed226SJulian Elischer "\t0x02 - Inquiry Scan disabled. Page Scan enabled.\n" \
1599878ed226SJulian Elischer "\t0x03 - Inquiry Scan enabled. Page Scan enabled.",
1600878ed226SJulian Elischer &hci_read_scan_enable
1601878ed226SJulian Elischer },
1602878ed226SJulian Elischer {
1603878ed226SJulian Elischer "write_scan_enable <scan_enable>",
1604878ed226SJulian Elischer "\nThis command will write the value for the Scan_Enable parameter.\n" \
1605878ed226SJulian Elischer "The Scan_Enable parameter controls whether or not the Bluetooth\n" \
1606878ed226SJulian Elischer "unit will periodically scan for page attempts and/or inquiry\n" \
1607878ed226SJulian Elischer "requests from other Bluetooth unit.\n\n" \
1608878ed226SJulian Elischer "\t<scan_enable> - dd;\n" \
1609878ed226SJulian Elischer "\t0 - No Scans enabled.\n" \
1610878ed226SJulian Elischer "\t1 - Inquiry Scan enabled. Page Scan disabled.\n" \
1611878ed226SJulian Elischer "\t2 - Inquiry Scan disabled. Page Scan enabled.\n" \
1612878ed226SJulian Elischer "\t3 - Inquiry Scan enabled. Page Scan enabled.",
1613878ed226SJulian Elischer &hci_write_scan_enable
1614878ed226SJulian Elischer },
1615878ed226SJulian Elischer {
1616878ed226SJulian Elischer "read_page_scan_activity",
1617878ed226SJulian Elischer "\nThis command will read the value for Page_Scan_Activity configuration\n" \
1618878ed226SJulian Elischer "parameters. The Page_Scan_Interval configuration parameter defines the\n" \
1619878ed226SJulian Elischer "amount of time between consecutive page scans. This time interval is \n" \
1620878ed226SJulian Elischer "defined from when the Host Controller started its last page scan until\n" \
1621878ed226SJulian Elischer "it begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1622878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. The\n" \
1623878ed226SJulian Elischer "Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.",
1624878ed226SJulian Elischer &hci_read_page_scan_activity
1625878ed226SJulian Elischer },
1626878ed226SJulian Elischer {
1627878ed226SJulian Elischer "write_page_scan_activity interval(dddd) window(dddd)",
1628878ed226SJulian Elischer "\nThis command will write the value for Page_Scan_Activity configuration\n" \
1629878ed226SJulian Elischer "parameter. The Page_Scan_Interval configuration parameter defines the\n" \
1630878ed226SJulian Elischer "amount of time between consecutive page scans. This is defined as the time\n" \
1631878ed226SJulian Elischer "interval from when the Host Controller started its last page scan until it\n" \
1632878ed226SJulian Elischer "begins the next page scan. The Page_Scan_Window configuration parameter\n" \
1633878ed226SJulian Elischer "defines the amount of time for the duration of the page scan. \n" \
1634878ed226SJulian Elischer "The Page_Scan_Window can only be less than or equal to the Page_Scan_Interval.\n\n" \
1635878ed226SJulian Elischer "\t<interval> - Range: 0x0012 -� 0x100, Time = N * 0.625 msec\n" \
1636878ed226SJulian Elischer "\t<window>   - Range: 0x0012 -� 0x100, Time = N * 0.625 msen",
1637878ed226SJulian Elischer &hci_write_page_scan_activity
1638878ed226SJulian Elischer },
1639878ed226SJulian Elischer {
1640878ed226SJulian Elischer "read_inquiry_scan_activity",
1641878ed226SJulian Elischer "\nThis command will read the value for Inquiry_Scan_Activity configuration\n" \
1642878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1643878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1644878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1645878ed226SJulian Elischer "until it begins the next inquiry scan.",
1646878ed226SJulian Elischer &hci_read_inquiry_scan_activity
1647878ed226SJulian Elischer },
1648878ed226SJulian Elischer {
1649878ed226SJulian Elischer "write_inquiry_scan_activity interval(dddd) window(dddd)",
1650878ed226SJulian Elischer "\nThis command will write the value for Inquiry_Scan_Activity configuration\n"\
1651878ed226SJulian Elischer "parameter. The Inquiry_Scan_Interval configuration parameter defines the\n" \
1652878ed226SJulian Elischer "amount of time between consecutive inquiry scans. This is defined as the\n" \
1653878ed226SJulian Elischer "time interval from when the Host Controller started its last inquiry scan\n" \
1654878ed226SJulian Elischer "until it begins the next inquiry scan. The Inquiry_Scan_Window configuration\n" \
1655878ed226SJulian Elischer "parameter defines the amount of time for the duration of the inquiry scan.\n" \
1656878ed226SJulian Elischer "The Inquiry_Scan_Window can only be less than or equal to the Inquiry_Scan_Interval.\n\n" \
1657878ed226SJulian Elischer "\t<interval> - Range: 0x0012 -� 0x100, Time = N * 0.625 msec\n" \
1658878ed226SJulian Elischer "\t<window>   - Range: 0x0012 -� 0x100, Time = N * 0.625 msen",
1659878ed226SJulian Elischer &hci_write_inquiry_scan_activity
1660878ed226SJulian Elischer },
1661878ed226SJulian Elischer {
1662878ed226SJulian Elischer "read_authentication_enable",
1663878ed226SJulian Elischer "\nThis command will read the value for the Authentication_Enable parameter.\n"\
1664878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires\n"\
1665878ed226SJulian Elischer "to authenticate the remote unit at connection setup (between the\n" \
1666878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n"\
1667878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1668878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1669878ed226SJulian Elischer "authenticate the other unit.",
1670878ed226SJulian Elischer &hci_read_authentication_enable
1671878ed226SJulian Elischer },
1672878ed226SJulian Elischer {
1673878ed226SJulian Elischer "write_authentication_enable enable(0|1)",
1674878ed226SJulian Elischer "\nThis command will write the value for the Authentication_Enable parameter.\n"\
1675878ed226SJulian Elischer "The Authentication_Enable parameter controls if the local unit requires to\n"\
1676878ed226SJulian Elischer "authenticate the remote unit at connection setup (between the\n" \
1677878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1678878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup, only\n"\
1679878ed226SJulian Elischer "the unit(s) with the Authentication_Enable parameter enabled will try to\n"\
1680878ed226SJulian Elischer "authenticate the other unit.",
1681878ed226SJulian Elischer &hci_write_authentication_enable
1682878ed226SJulian Elischer },
1683878ed226SJulian Elischer {
1684878ed226SJulian Elischer "read_encryption_mode",
1685878ed226SJulian Elischer "\nThis command will read the value for the Encryption_Mode parameter. The\n" \
1686878ed226SJulian Elischer "Encryption_Mode parameter controls if the local unit requires encryption\n" \
1687878ed226SJulian Elischer "to the remote unit at connection setup (between the Create_Connection\n" \
1688878ed226SJulian Elischer "command or acceptance of an incoming ACL connection and the corresponding\n" \
1689878ed226SJulian Elischer "Connection Complete event). At connection setup, only the unit(s) with\n" \
1690878ed226SJulian Elischer "the Authentication_Enable parameter enabled and Encryption_Mode parameter\n" \
1691878ed226SJulian Elischer "enabled will try to encrypt the connection to the other unit.\n\n" \
1692878ed226SJulian Elischer "\t<encryption_mode>:\n" \
1693878ed226SJulian Elischer "\t0x00 - Encryption disabled.\n" \
1694878ed226SJulian Elischer "\t0x01 - Encryption only for point-to-point packets.\n" \
1695878ed226SJulian Elischer "\t0x02 - Encryption for both point-to-point and broadcast packets.",
1696878ed226SJulian Elischer &hci_read_encryption_mode
1697878ed226SJulian Elischer },
1698878ed226SJulian Elischer {
1699878ed226SJulian Elischer "write_encryption_mode mode(0|1|2)",
1700878ed226SJulian Elischer "\tThis command will write the value for the Encryption_Mode parameter.\n" \
1701878ed226SJulian Elischer "The Encryption_Mode parameter controls if the local unit requires\n" \
1702878ed226SJulian Elischer "encryption to the remote unit at connection setup (between the\n" \
1703878ed226SJulian Elischer "Create_Connection command or acceptance of an incoming ACL connection\n" \
1704878ed226SJulian Elischer "and the corresponding Connection Complete event). At connection setup,\n" \
1705878ed226SJulian Elischer "only the unit(s) with the Authentication_Enable parameter enabled and\n" \
1706878ed226SJulian Elischer "Encryption_Mode parameter enabled will try to encrypt the connection to\n" \
1707878ed226SJulian Elischer "the other unit.\n\n" \
1708878ed226SJulian Elischer "\t<encryption_mode> (dd)\n" \
1709878ed226SJulian Elischer "\t0 - Encryption disabled.\n" \
1710878ed226SJulian Elischer "\t1 - Encryption only for point-to-point packets.\n" \
1711878ed226SJulian Elischer "\t2 - Encryption for both point-to-point and broadcast packets.",
1712878ed226SJulian Elischer &hci_write_encryption_mode
1713878ed226SJulian Elischer },
1714878ed226SJulian Elischer {
1715878ed226SJulian Elischer "read_class_of_device",
1716878ed226SJulian Elischer "\nThis command will read the value for the Class_of_Device parameter.\n" \
1717878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of\n" \
1718878ed226SJulian Elischer "the local unit to other units.",
1719878ed226SJulian Elischer &hci_read_class_of_device
1720878ed226SJulian Elischer },
1721878ed226SJulian Elischer {
1722878ed226SJulian Elischer "write_class_of_device class(xx:xx:xx)",
1723878ed226SJulian Elischer "\nThis command will write the value for the Class_of_Device parameter.\n" \
1724878ed226SJulian Elischer "The Class_of_Device parameter is used to indicate the capabilities of \n" \
1725878ed226SJulian Elischer "the local unit to other units.\n\n" \
1726878ed226SJulian Elischer "\t<class> (xx:xx:xx) - class of device",
1727878ed226SJulian Elischer &hci_write_class_of_device
1728878ed226SJulian Elischer },
1729878ed226SJulian Elischer {
1730878ed226SJulian Elischer "read_voice_settings",
1731878ed226SJulian Elischer "\nThis command will read the values for the Voice_Setting parameter.\n" \
1732878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1733878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1734878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1735878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1736878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.",
1737878ed226SJulian Elischer &hci_read_voice_settings
1738878ed226SJulian Elischer },
1739878ed226SJulian Elischer {
1740878ed226SJulian Elischer "write_voice_settings settings(xxxx)",
1741878ed226SJulian Elischer "\nThis command will write the values for the Voice_Setting parameter.\n" \
1742878ed226SJulian Elischer "The Voice_Setting parameter controls all the various settings for voice\n" \
1743878ed226SJulian Elischer "connections. These settings apply to all voice connections, and cannot be\n" \
1744878ed226SJulian Elischer "set for individual voice connections. The Voice_Setting parameter controls\n" \
1745878ed226SJulian Elischer "the configuration for voice connections: Input Coding, Air coding format,\n" \
1746878ed226SJulian Elischer "input data format, Input sample size, and linear PCM parameter.\n\n" \
1747878ed226SJulian Elischer "\t<voice_settings> (xxxx) - voice settings",
1748878ed226SJulian Elischer &hci_write_voice_settings
1749878ed226SJulian Elischer },
1750878ed226SJulian Elischer {
1751878ed226SJulian Elischer "read_number_broadcast_retransmissions",
1752878ed226SJulian Elischer "\nThis command will read the unit's parameter value for the Number of\n" \
1753878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1754878ed226SJulian Elischer "unreliable.",
1755878ed226SJulian Elischer &hci_read_number_broadcast_retransmissions
1756878ed226SJulian Elischer },
1757878ed226SJulian Elischer {
1758878ed226SJulian Elischer "write_number_broadcast_retransmissions count(dd)",
1759878ed226SJulian Elischer "\nThis command will write the unit's parameter value for the Number of\n" \
1760878ed226SJulian Elischer "Broadcast Retransmissions. Broadcast packets are not acknowledged and are\n" \
1761878ed226SJulian Elischer "unreliable.\n\n" \
1762878ed226SJulian Elischer "\t<count> (dd) - number of broadcast retransimissions",
1763878ed226SJulian Elischer &hci_write_number_broadcast_retransmissions
1764878ed226SJulian Elischer },
1765878ed226SJulian Elischer {
1766878ed226SJulian Elischer "read_hold_mode_activity",
1767878ed226SJulian Elischer "\nThis command will read the value for the Hold_Mode_Activity parameter.\n" \
1768878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1769878ed226SJulian Elischer "be suspended when the unit is in hold mode.",
1770878ed226SJulian Elischer &hci_read_hold_mode_activity
1771878ed226SJulian Elischer },
1772878ed226SJulian Elischer {
1773878ed226SJulian Elischer "write_hold_mode_activity settings(0|1|2|4)",
1774878ed226SJulian Elischer "\nThis command will write the value for the Hold_Mode_Activity parameter.\n" \
1775878ed226SJulian Elischer "The Hold_Mode_Activity value is used to determine what activities should\n" \
1776878ed226SJulian Elischer "be suspended when the unit is in hold mode.\n\n" \
1777878ed226SJulian Elischer "\t<settings> (dd) - bit mask:\n" \
1778878ed226SJulian Elischer "\t0 - Maintain current Power State. Default\n" \
1779878ed226SJulian Elischer "\t1 - Suspend Page Scan.\n" \
1780878ed226SJulian Elischer "\t2 - Suspend Inquiry Scan.\n" \
1781878ed226SJulian Elischer "\t4 - Suspend Periodic Inquiries.",
1782878ed226SJulian Elischer &hci_write_hold_mode_activity
1783878ed226SJulian Elischer },
1784878ed226SJulian Elischer {
1785878ed226SJulian Elischer "read_sco_flow_control_enable",
1786878ed226SJulian Elischer "\nThe Read_SCO_Flow_Control_Enable command provides the ability to read\n" \
1787878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1788878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1789878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1790878ed226SJulian Elischer "disable SCO flow control.",
1791878ed226SJulian Elischer &hci_read_sco_flow_control_enable
1792878ed226SJulian Elischer },
1793878ed226SJulian Elischer {
1794878ed226SJulian Elischer "write_sco_flow_control_enable enable(0|1)",
1795878ed226SJulian Elischer "\nThe Write_SCO_Flow_Control_Enable command provides the ability to write\n" \
1796878ed226SJulian Elischer "the SCO_Flow_Control_Enable setting. By using this setting, the Host can\n" \
1797878ed226SJulian Elischer "decide if the Host Controller will send Number Of Completed Packets events\n" \
1798878ed226SJulian Elischer "for SCO Connection Handles. This setting allows the Host to enable and\n" \
1799878ed226SJulian Elischer "disable SCO flow control. The SCO_Flow_Control_Enable setting can only be\n" \
1800878ed226SJulian Elischer "changed if no connections exist.",
1801878ed226SJulian Elischer &hci_write_sco_flow_control_enable
1802878ed226SJulian Elischer },
1803878ed226SJulian Elischer {
1804878ed226SJulian Elischer "read_link_supervision_timeout <connection_handle>",
1805878ed226SJulian Elischer "\nThis command will read the value for the Link_Supervision_Timeout\n" \
1806878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1807878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1808878ed226SJulian Elischer "reason, no Baseband packets are received from that Connection Handle for a\n" \
1809878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n"
1810878ed226SJulian Elischer "disconnected.\n\n" \
1811878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n",
1812878ed226SJulian Elischer &hci_read_link_supervision_timeout
1813878ed226SJulian Elischer },
1814878ed226SJulian Elischer {
1815878ed226SJulian Elischer "write_link_supervision_timeout <connection_handle> <timeout>",
1816878ed226SJulian Elischer "\nThis command will write the value for the Link_Supervision_Timeout\n" \
1817878ed226SJulian Elischer "parameter for the device. The Link_Supervision_Timeout parameter is used\n" \
1818878ed226SJulian Elischer "by the master or slave Bluetooth device to monitor link loss. If, for any\n" \
1819878ed226SJulian Elischer "reason, no Baseband packets are received from that connection handle for a\n" \
1820878ed226SJulian Elischer "duration longer than the Link_Supervision_Timeout, the connection is\n" \
1821878ed226SJulian Elischer "disconnected.\n\n" \
1822878ed226SJulian Elischer "\t<connection_handle> - dddd; connection handle\n" \
1823878ed226SJulian Elischer "\t<timeout>           - dddd; timeout measured in number of baseband slots\n",
1824878ed226SJulian Elischer &hci_write_link_supervision_timeout
1825878ed226SJulian Elischer },
18260986ab12SMaksim Yevmenkin {
18270986ab12SMaksim Yevmenkin "read_page_scan_period_mode",
18280986ab12SMaksim Yevmenkin "\nThis command is used to read the mandatory Page_Scan_Period_Mode of the\n" \
18290986ab12SMaksim Yevmenkin "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
18300986ab12SMaksim Yevmenkin "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
18310986ab12SMaksim Yevmenkin "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
18320986ab12SMaksim Yevmenkin "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
18330986ab12SMaksim Yevmenkin "following page scans.",
18340986ab12SMaksim Yevmenkin &hci_read_page_scan_period_mode
18350986ab12SMaksim Yevmenkin },
18360986ab12SMaksim Yevmenkin {
18370986ab12SMaksim Yevmenkin "write_page_scan_period_mode <page_scan_period_mode>",
18380986ab12SMaksim Yevmenkin "\nThis command is used to write the mandatory Page_Scan_Period_Mode of the\n" \
18390986ab12SMaksim Yevmenkin "local Bluetooth device. Every time an inquiry response message is sent, the\n"\
18400986ab12SMaksim Yevmenkin "Bluetooth device will start a timer (T_mandatory_pscan), the value of which\n"\
18410986ab12SMaksim Yevmenkin "is dependent on the Page_Scan_Period_Mode. As long as this timer has not\n" \
18420986ab12SMaksim Yevmenkin "expired, the Bluetooth device will use the Page_Scan_Period_Mode for all\n" \
18430986ab12SMaksim Yevmenkin "following page scans.\n\n" \
18440986ab12SMaksim Yevmenkin "\t<page_scan_period_mode> - dd; page scan period mode:\n" \
18450986ab12SMaksim Yevmenkin "\t0x00 - P0 (Default)\n" \
18460986ab12SMaksim Yevmenkin "\t0x01 - P1\n" \
18470986ab12SMaksim Yevmenkin "\t0x02 - P2",
18480986ab12SMaksim Yevmenkin &hci_write_page_scan_period_mode
18490986ab12SMaksim Yevmenkin },
18500986ab12SMaksim Yevmenkin {
18510986ab12SMaksim Yevmenkin "read_page_scan_mode",
18520986ab12SMaksim Yevmenkin "\nThis command is used to read the default page scan mode of the local\n" \
18530986ab12SMaksim Yevmenkin "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
18540986ab12SMaksim Yevmenkin "that is used for the default page scan. Currently one mandatory page scan\n"\
18550986ab12SMaksim Yevmenkin "mode and three optional page scan modes are defined. Following an inquiry\n" \
18560986ab12SMaksim Yevmenkin "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
18570986ab12SMaksim Yevmenkin "mandatory page scan mode must be applied.",
18580986ab12SMaksim Yevmenkin &hci_read_page_scan_mode
18590986ab12SMaksim Yevmenkin },
18600986ab12SMaksim Yevmenkin {
18610986ab12SMaksim Yevmenkin "write_page_scan_mode <page_scan_mode>",
18620986ab12SMaksim Yevmenkin "\nThis command is used to write the default page scan mode of the local\n" \
18630986ab12SMaksim Yevmenkin "Bluetooth device. The Page_Scan_Mode parameter indicates the page scan mode\n"\
18640986ab12SMaksim Yevmenkin "that is used for the default page scan. Currently, one mandatory page scan\n"\
18650986ab12SMaksim Yevmenkin "mode and three optional page scan modes are defined. Following an inquiry\n"\
18660986ab12SMaksim Yevmenkin "response, if the Baseband timer T_mandatory_pscan has not expired, the\n" \
18670986ab12SMaksim Yevmenkin "mandatory page scan mode must be applied.\n\n" \
18680986ab12SMaksim Yevmenkin "\t<page_scan_mode> - dd; page scan mode:\n" \
18690986ab12SMaksim Yevmenkin "\t0x00 - Mandatory Page Scan Mode (Default)\n" \
18700986ab12SMaksim Yevmenkin "\t0x01 - Optional Page Scan Mode I\n" \
18710986ab12SMaksim Yevmenkin "\t0x02 - Optional Page Scan Mode II\n" \
18720986ab12SMaksim Yevmenkin "\t0x03 - Optional Page Scan Mode III",
18730986ab12SMaksim Yevmenkin &hci_write_page_scan_mode
18740986ab12SMaksim Yevmenkin },
1875878ed226SJulian Elischer { NULL, }
1876878ed226SJulian Elischer };
1877878ed226SJulian Elischer 
1878