Index: usr.sbin/btattach/btattach.c =================================================================== RCS file: /cvsroot/src/usr.sbin/btattach/btattach.c,v retrieving revision 1.15 diff -p -u -r1.15 btattach.c --- usr.sbin/btattach/btattach.c 11 Aug 2017 11:54:08 -0000 1.15 +++ usr.sbin/btattach/btattach.c 19 Nov 2022 10:03:36 -0000 @@ -40,6 +40,7 @@ __RCSID("$NetBSD: btattach.c,v 1.15 2017 #include #include #include +#include #include #include #include @@ -275,9 +276,11 @@ main(int argc, char *argv[]) if (type->init != NULL) (*type->init)(fd, speed); - if (cfsetspeed(&tio, speed) < 0 - || tcsetattr(fd, TCSADRAIN, &tio) < 0) - err(EXIT_FAILURE, "tty setup failed"); + if (speed != init_speed) { + if (cfsetspeed(&tio, speed) < 0 + || tcsetattr(fd, TCSANOW, &tio) < 0) + err(EXIT_FAILURE, "tty setup failed"); + } /* start line discipline */ if (ioctl(fd, TIOCSLINED, type->line) < 0) @@ -343,6 +346,12 @@ sighandler(int s) } static void +timeout(int s) +{ + +} + +static void hexdump(uint8_t *ptr, size_t len) { @@ -353,11 +362,13 @@ hexdump(uint8_t *ptr, size_t len) /* * send HCI comamnd */ -void +int uart_send_cmd(int fd, uint16_t opcode, void *buf, size_t len) { struct iovec iov[2]; hci_cmd_hdr_t hdr; + int r; + struct sigaction oaction, taction; hdr.type = HCI_CMD_PKT; hdr.opcode = htole16(opcode); @@ -379,7 +390,17 @@ uart_send_cmd(int fd, uint16_t opcode, v if (writev(fd, iov, __arraycount(iov)) < 0) err(EXIT_FAILURE, "writev"); - tcdrain(fd); + taction.sa_handler = timeout, + sigemptyset(&taction.sa_mask); + taction.sa_flags = 0, + + sigaction(SIGALRM, &taction, &oaction); + alarm(1); + r = tcdrain(fd); + alarm(0); + sigaction(SIGALRM, &oaction, NULL); + + return r; } /* Index: usr.sbin/btattach/btattach.h =================================================================== RCS file: /cvsroot/src/usr.sbin/btattach/btattach.h,v retrieving revision 1.4 diff -p -u -r1.4 btattach.h --- usr.sbin/btattach/btattach.h 10 Aug 2017 13:34:29 -0000 1.4 +++ usr.sbin/btattach/btattach.h 19 Nov 2022 10:03:36 -0000 @@ -50,6 +50,6 @@ devinit_t init_stlc2500; devinit_t init_swave; devinit_t init_unistone; -void uart_send_cmd(int, uint16_t, void *, size_t); +int uart_send_cmd(int, uint16_t, void *, size_t); size_t uart_recv_ev(int, uint8_t, void *, size_t); size_t uart_recv_cc(int, uint16_t, void *, size_t); Index: usr.sbin/btattach/init_bcm43xx.c =================================================================== RCS file: /cvsroot/src/usr.sbin/btattach/init_bcm43xx.c,v retrieving revision 1.5 diff -p -u -r1.5 init_bcm43xx.c --- usr.sbin/btattach/init_bcm43xx.c 3 Sep 2017 22:54:12 -0000 1.5 +++ usr.sbin/btattach/init_bcm43xx.c 19 Nov 2022 10:03:36 -0000 @@ -102,7 +102,8 @@ init_bcm43xx(int fd, unsigned int speed) memset(rate, 0, sizeof(rate)); memset(local_name, 0, sizeof(local_name)); - uart_send_cmd(fd, HCI_CMD_RESET, NULL, 0); + if (uart_send_cmd(fd, HCI_CMD_RESET, NULL, 0)) + return; uart_recv_cc(fd, HCI_CMD_RESET, &resp, sizeof(resp)); /* assume it succeeded? */