Lines Matching refs:unit

79  * bluetooth unit functions
86 struct hci_unit *unit;
96 unit = malloc(sizeof(struct hci_unit), M_BLUETOOTH, M_ZERO | M_WAITOK);
97 KASSERT(unit != NULL);
99 unit->hci_dev = dev;
100 unit->hci_if = hci_if;
101 unit->hci_flags = flags;
103 mutex_init(&unit->hci_devlock, MUTEX_DRIVER, hci_if->ipl);
104 cv_init(&unit->hci_init, "hci_init");
106 MBUFQ_INIT(&unit->hci_eventq);
107 MBUFQ_INIT(&unit->hci_aclrxq);
108 MBUFQ_INIT(&unit->hci_scorxq);
109 MBUFQ_INIT(&unit->hci_cmdwait);
110 MBUFQ_INIT(&unit->hci_scodone);
112 TAILQ_INIT(&unit->hci_links);
113 LIST_INIT(&unit->hci_memos);
116 SIMPLEQ_INSERT_TAIL(&hci_unit_list, unit, hci_next);
119 return unit;
123 hci_detach_pcb(struct hci_unit *unit)
127 hci_disable(unit);
129 SIMPLEQ_REMOVE(&hci_unit_list, unit, hci_unit, hci_next);
132 cv_destroy(&unit->hci_init);
133 mutex_destroy(&unit->hci_devlock);
134 free(unit, M_BLUETOOTH);
138 hci_enable(struct hci_unit *unit)
149 unit->hci_num_cmd_pkts = (unit->hci_flags & BTF_POWER_UP_NOOP) ? 0 : 1;
150 unit->hci_num_acl_pkts = 0;
151 unit->hci_num_sco_pkts = 0;
157 unit->hci_acl_mask = HCI_PKT_DM1 | HCI_PKT_DH1;
158 unit->hci_packet_type = unit->hci_acl_mask;
160 memcpy(unit->hci_cmds, hci_cmds_v10, HCI_COMMANDS_SIZE);
162 unit->hci_rxint = softint_establish(SOFTINT_NET, &hci_intr, unit);
163 if (unit->hci_rxint == NULL)
166 err = (*unit->hci_if->enable)(unit->hci_dev);
170 unit->hci_flags |= BTF_RUNNING;
176 unit->hci_flags |= BTF_INIT;
178 err = hci_send_cmd(unit, HCI_CMD_RESET, NULL, 0);
182 while (unit->hci_flags & BTF_INIT) {
183 err = cv_timedwait_sig(&unit->hci_init, bt_lock, 5 * hz);
196 unit->hci_bthub = config_found(unit->hci_dev, &unit->hci_bdaddr, NULL,
202 (*unit->hci_if->disable)(unit->hci_dev);
203 unit->hci_flags &= ~BTF_RUNNING;
205 softint_disestablish(unit->hci_rxint);
206 unit->hci_rxint = NULL;
212 hci_disable(struct hci_unit *unit)
218 if (unit->hci_bthub) {
221 hub = unit->hci_bthub;
222 unit->hci_bthub = NULL;
229 if (unit->hci_rxint) {
230 softint_disestablish(unit->hci_rxint);
231 unit->hci_rxint = NULL;
234 (*unit->hci_if->disable)(unit->hci_dev);
235 unit->hci_flags &= ~BTF_RUNNING;
242 next = TAILQ_FIRST(&unit->hci_links);
250 while ((memo = LIST_FIRST(&unit->hci_memos)) != NULL)
255 MBUFQ_DRAIN(&unit->hci_eventq);
256 unit->hci_eventqlen = 0;
258 MBUFQ_DRAIN(&unit->hci_aclrxq);
259 unit->hci_aclrxqlen = 0;
261 MBUFQ_DRAIN(&unit->hci_scorxq);
262 unit->hci_scorxqlen = 0;
264 MBUFQ_DRAIN(&unit->hci_cmdwait);
265 MBUFQ_DRAIN(&unit->hci_scodone);
271 struct hci_unit *unit;
273 SIMPLEQ_FOREACH(unit, &hci_unit_list, hci_next) {
274 if ((unit->hci_flags & BTF_UP) == 0)
277 if (bdaddr_same(&unit->hci_bdaddr, addr))
281 return unit;
288 hci_num_cmds(struct hci_unit *unit, uint8_t num)
292 unit->hci_num_cmd_pkts = num;
294 while (unit->hci_num_cmd_pkts > 0 && MBUFQ_FIRST(&unit->hci_cmdwait)) {
295 MBUFQ_DEQUEUE(&unit->hci_cmdwait, m);
296 hci_output_cmd(unit, m);
304 hci_send_cmd(struct hci_unit *unit, uint16_t opcode, void *buf, uint8_t len)
309 KASSERT(unit != NULL);
331 DPRINTFN(2, "(%s) opcode (%3.3x|%4.4x)\n", device_xname(unit->hci_dev),
335 if (unit->hci_num_cmd_pkts == 0)
336 MBUFQ_ENQUEUE(&unit->hci_cmdwait, m);
338 hci_output_cmd(unit, m);
352 struct hci_unit *unit = arg;
357 mutex_enter(&unit->hci_devlock);
359 if (unit->hci_eventqlen > 0) {
360 MBUFQ_DEQUEUE(&unit->hci_eventq, m);
361 unit->hci_eventqlen--;
362 mutex_exit(&unit->hci_devlock);
367 device_xname(unit->hci_dev), m->m_pkthdr.len);
370 hci_mtap(m, unit);
371 hci_event(m, unit);
376 if (unit->hci_scorxqlen > 0) {
377 MBUFQ_DEQUEUE(&unit->hci_scorxq, m);
378 unit->hci_scorxqlen--;
379 mutex_exit(&unit->hci_devlock);
384 device_xname(unit->hci_dev), m->m_pkthdr.len);
387 hci_mtap(m, unit);
388 hci_sco_recv(m, unit);
393 if (unit->hci_aclrxqlen > 0) {
394 MBUFQ_DEQUEUE(&unit->hci_aclrxq, m);
395 unit->hci_aclrxqlen--;
396 mutex_exit(&unit->hci_devlock);
401 device_xname(unit->hci_dev), m->m_pkthdr.len);
404 hci_mtap(m, unit);
405 hci_acl_recv(m, unit);
410 MBUFQ_DEQUEUE(&unit->hci_scodone, m);
414 mutex_exit(&unit->hci_devlock);
417 device_xname(unit->hci_dev));
419 TAILQ_FOREACH(link, &unit->hci_links, hl_next) {
426 unit->hci_num_sco_pkts++;
432 mutex_exit(&unit->hci_devlock);
448 hci_input_event(struct hci_unit *unit, struct mbuf *m)
452 mutex_enter(&unit->hci_devlock);
454 if (unit->hci_eventqlen > hci_eventq_max || unit->hci_rxint == NULL) {
455 DPRINTF("(%s) dropped event packet.\n", device_xname(unit->hci_dev));
459 unit->hci_eventqlen++;
460 MBUFQ_ENQUEUE(&unit->hci_eventq, m);
461 softint_schedule(unit->hci_rxint);
465 mutex_exit(&unit->hci_devlock);
470 hci_input_acl(struct hci_unit *unit, struct mbuf *m)
474 mutex_enter(&unit->hci_devlock);
476 if (unit->hci_aclrxqlen > hci_aclrxq_max || unit->hci_rxint == NULL) {
477 DPRINTF("(%s) dropped ACL packet.\n", device_xname(unit->hci_dev));
481 unit->hci_aclrxqlen++;
482 MBUFQ_ENQUEUE(&unit->hci_aclrxq, m);
483 softint_schedule(unit->hci_rxint);
487 mutex_exit(&unit->hci_devlock);
492 hci_input_sco(struct hci_unit *unit, struct mbuf *m)
496 mutex_enter(&unit->hci_devlock);
498 if (unit->hci_scorxqlen > hci_scorxq_max || unit->hci_rxint == NULL) {
499 DPRINTF("(%s) dropped SCO packet.\n", device_xname(unit->hci_dev));
503 unit->hci_scorxqlen++;
504 MBUFQ_ENQUEUE(&unit->hci_scorxq, m);
505 softint_schedule(unit->hci_rxint);
509 mutex_exit(&unit->hci_devlock);
514 hci_output_cmd(struct hci_unit *unit, struct mbuf *m)
518 hci_mtap(m, unit);
520 DPRINTFN(10, "(%s) num_cmd_pkts=%d\n", device_xname(unit->hci_dev),
521 unit->hci_num_cmd_pkts);
523 unit->hci_num_cmd_pkts--;
533 (*unit->hci_if->output_cmd)(unit->hci_dev, m);
537 hci_output_acl(struct hci_unit *unit, struct mbuf *m)
540 hci_mtap(m, unit);
542 DPRINTFN(10, "(%s) num_acl_pkts=%d\n", device_xname(unit->hci_dev),
543 unit->hci_num_acl_pkts);
545 unit->hci_num_acl_pkts--;
546 (*unit->hci_if->output_acl)(unit->hci_dev, m);
550 hci_output_sco(struct hci_unit *unit, struct mbuf *m)
553 hci_mtap(m, unit);
555 DPRINTFN(10, "(%s) num_sco_pkts=%d\n", device_xname(unit->hci_dev),
556 unit->hci_num_sco_pkts);
558 unit->hci_num_sco_pkts--;
559 (*unit->hci_if->output_sco)(unit->hci_dev, m);
563 hci_complete_sco(struct hci_unit *unit, struct mbuf *m)
566 if (unit->hci_rxint == NULL) {
567 DPRINTFN(10, "(%s) complete SCO!\n", device_xname(unit->hci_dev));
572 mutex_enter(&unit->hci_devlock);
574 MBUFQ_ENQUEUE(&unit->hci_scodone, m);
575 softint_schedule(unit->hci_rxint);
577 mutex_exit(&unit->hci_devlock);