static int hci_sock_release(struct socket *sock) { struct sock *sk = sock->sk; struct hci_dev *hdev = hci_pi(sk)->hdev; BT_DBG("sock %p sk %p", sock, sk); if (!sk) return 0; bluez_sock_unlink(&hci_sk_list, sk); if (hdev) { atomic_dec(&hdev->promisc); hci_dev_put(hdev); } sock_orphan(sk); skb_queue_purge(&sk->receive_queue); skb_queue_purge(&sk->write_queue); sock_put(sk); MOD_DEC_USE_COUNT; return 0; }
static int hci_sock_release(struct socket *sock) { struct sock *sk = sock->sk; struct hci_dev *hdev = hci_pi(sk)->hdev; DBG("sock %p sk %p", sock, sk); if (!sk) return 0; bluez_sock_unlink(&hci_sk_list, sk); if (hdev) { if (!hci_sock_lookup(hdev)) hdev->flags &= ~HCI_SOCK; hci_dev_put(hdev); } sock_orphan(sk); skb_queue_purge(&sk->receive_queue); skb_queue_purge(&sk->write_queue); sock_put(sk); MOD_DEC_USE_COUNT; return 0; }
static int l2cap_do_connect(struct sock *sk) { bdaddr_t *src = &bluez_pi(sk)->src; bdaddr_t *dst = &bluez_pi(sk)->dst; struct l2cap_conn *conn; struct hci_conn *hcon; struct hci_dev *hdev; int err = 0; BT_DBG("%s -> %s psm 0x%2.2x", batostr(src), batostr(dst), l2cap_pi(sk)->psm); if (!(hdev = hci_get_route(dst, src))) return -EHOSTUNREACH; hci_dev_lock_bh(hdev); err = -ENOMEM; hcon = hci_connect(hdev, ACL_LINK, dst); if (!hcon) goto done; conn = l2cap_conn_add(hcon, 0); if (!conn) { hci_conn_put(hcon); goto done; } err = 0; /* Update source addr of the socket */ bacpy(src, conn->src); l2cap_chan_add(conn, sk, NULL); sk->state = BT_CONNECT; l2cap_sock_set_timer(sk, sk->sndtimeo); if (hcon->state == BT_CONNECTED) { if (sk->type == SOCK_SEQPACKET) { l2cap_conn_req req; req.scid = __cpu_to_le16(l2cap_pi(sk)->scid); req.psm = l2cap_pi(sk)->psm; l2cap_send_req(conn, L2CAP_CONN_REQ, L2CAP_CONN_REQ_SIZE, &req); } else { l2cap_sock_clear_timer(sk); sk->state = BT_CONNECTED; } } done: hci_dev_unlock_bh(hdev); hci_dev_put(hdev); return err; }
int sco_connect(struct sock *sk) { bdaddr_t *src = &bluez_pi(sk)->src; bdaddr_t *dst = &bluez_pi(sk)->dst; struct sco_conn *conn; struct hci_conn *hcon; struct hci_dev *hdev; int err = 0; BT_DBG("%s -> %s", batostr(src), batostr(dst)); if (!(hdev = hci_get_route(dst, src))) return -EHOSTUNREACH; hci_dev_lock_bh(hdev); err = -ENOMEM; hcon = hci_connect(hdev, SCO_LINK, dst); if (!hcon) goto done; conn = sco_conn_add(hcon, 0); if (!conn) { hci_conn_put(hcon); goto done; } /* Update source addr of the socket */ bacpy(src, conn->src); err = sco_chan_add(conn, sk, NULL); if (err) goto done; if (hcon->state == BT_CONNECTED) { sco_sock_clear_timer(sk); sk->state = BT_CONNECTED; } else { sk->state = BT_CONNECT; sco_sock_set_timer(sk, sk->sndtimeo); } done: hci_dev_unlock_bh(hdev); hci_dev_put(hdev); return err; }
int rtbt_hps_iface_attach(IN struct rtbt_os_ctrl *os_ctrl) { struct hci_dev *hdev = os_ctrl->bt_dev; printk("--->%s()\n", __FUNCTION__); hci_dev_hold(hdev); /* Register HCI device */ if (hci_register_dev(hdev) < 0) { printk("Can't register HCI device\n"); return -ENODEV; } hci_dev_put(hdev); printk("<---%s():Success\n", __FUNCTION__); return 0; }
int rtbt_hps_iface_detach(IN struct rtbt_os_ctrl *os_ctrl) { struct hci_dev *hdev = os_ctrl->bt_dev; printk("--->%s()\n", __FUNCTION__); hci_dev_hold(hdev); //rtbt_hci_dev_close(hciDev); /* un-register HCI device */ if (!hdev) { printk("%s():os_ctrl(%p)->bt_dev is NULL\n", __FUNCTION__, os_ctrl); return -1; } /*if (hci_unregister_dev(hdev) < 0) printk("Can't unregister HCI device %s\n", hdev->name); */ hci_unregister_dev(hdev); hci_dev_put(hdev); printk("<---%s():Success\n", __FUNCTION__); return 0; }