don't try to imitate the kernel while doing a reset, just

set the init flags and poll until they are cleared
This commit is contained in:
plunky 2010-11-28 20:37:24 +00:00
parent 1f561df24f
commit 5cf7cee741

View File

@ -1,4 +1,4 @@
/* $NetBSD: btconfig.c,v 1.23 2010/11/22 20:02:06 plunky Exp $ */ /* $NetBSD: btconfig.c,v 1.24 2010/11/28 20:37:24 plunky Exp $ */
/*- /*-
* Copyright (c) 2006 Itronix Inc. * Copyright (c) 2006 Itronix Inc.
@ -33,7 +33,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2006 Itronix, Inc. All rights reserved."); __COPYRIGHT("@(#) Copyright (c) 2006 Itronix, Inc. All rights reserved.");
__RCSID("$NetBSD: btconfig.c,v 1.23 2010/11/22 20:02:06 plunky Exp $"); __RCSID("$NetBSD: btconfig.c,v 1.24 2010/11/28 20:37:24 plunky Exp $");
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/param.h> #include <sys/param.h>
@ -45,6 +45,7 @@ __RCSID("$NetBSD: btconfig.c,v 1.23 2010/11/22 20:02:06 plunky Exp $");
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#include <util.h> #include <util.h>
@ -474,23 +475,19 @@ config_unit(void)
} }
if (opt_reset) { if (opt_reset) {
hci_req(HCI_CMD_RESET, 0, NULL, 0, NULL, 0); static const struct timespec ts = { 0, 100000000 }; /* 100ms */
btr.btr_flags |= BTF_INIT; btr.btr_flags |= BTF_INIT;
if (ioctl(hci, SIOCSBTFLAGS, &btr) < 0) if (ioctl(hci, SIOCSBTFLAGS, &btr) < 0)
err(EXIT_FAILURE, "SIOCSBTFLAGS"); err(EXIT_FAILURE, "SIOCSBTFLAGS");
/* hci_req(HCI_CMD_RESET, 0, NULL, 0, NULL, 0);
* although the reset command will automatically
* carry out these commands, we do them manually
* just so we can wait for completion.
*/
hci_req(HCI_CMD_READ_BDADDR, 0, NULL, 0, NULL, 0);
hci_req(HCI_CMD_READ_BUFFER_SIZE, 0, NULL, 0, NULL, 0);
hci_req(HCI_CMD_READ_LOCAL_FEATURES, 0, NULL, 0, NULL, 0);
if (set_unit(SIOCGBTINFO) < 0) do {
nanosleep(&ts, NULL);
if (ioctl(hci, SIOCGBTINFO, &btr) < 0)
err(EXIT_FAILURE, "%s", btr.btr_name); err(EXIT_FAILURE, "%s", btr.btr_name);
} while ((btr.btr_flags & BTF_INIT) != 0);
} }
if (opt_master) { if (opt_master) {