Lines Matching full:conn
73 struct sco_conn *conn; member
82 struct sco_conn *conn = container_of(ref, struct sco_conn, ref); in sco_conn_free() local
84 BT_DBG("conn %p", conn); in sco_conn_free()
86 if (conn->sk) in sco_conn_free()
87 sco_pi(conn->sk)->conn = NULL; in sco_conn_free()
89 if (conn->hcon) { in sco_conn_free()
90 conn->hcon->sco_data = NULL; in sco_conn_free()
91 hci_conn_drop(conn->hcon); in sco_conn_free()
95 disable_delayed_work_sync(&conn->timeout_work); in sco_conn_free()
97 kfree(conn); in sco_conn_free()
100 static void sco_conn_put(struct sco_conn *conn) in sco_conn_put() argument
102 if (!conn) in sco_conn_put()
105 BT_DBG("conn %p refcnt %d", conn, kref_read(&conn->ref)); in sco_conn_put()
107 kref_put(&conn->ref, sco_conn_free); in sco_conn_put()
110 static struct sco_conn *sco_conn_hold(struct sco_conn *conn) in sco_conn_hold() argument
112 BT_DBG("conn %p refcnt %u", conn, kref_read(&conn->ref)); in sco_conn_hold()
114 kref_get(&conn->ref); in sco_conn_hold()
115 return conn; in sco_conn_hold()
118 static struct sco_conn *sco_conn_hold_unless_zero(struct sco_conn *conn) in sco_conn_hold_unless_zero() argument
120 if (!conn) in sco_conn_hold_unless_zero()
123 BT_DBG("conn %p refcnt %u", conn, kref_read(&conn->ref)); in sco_conn_hold_unless_zero()
125 if (!kref_get_unless_zero(&conn->ref)) in sco_conn_hold_unless_zero()
128 return conn; in sco_conn_hold_unless_zero()
131 static struct sock *sco_sock_hold(struct sco_conn *conn) in sco_sock_hold() argument
133 if (!conn || !bt_sock_linked(&sco_sk_list, conn->sk)) in sco_sock_hold()
136 sock_hold(conn->sk); in sco_sock_hold()
138 return conn->sk; in sco_sock_hold()
143 struct sco_conn *conn = container_of(work, struct sco_conn, in sco_sock_timeout() local
147 conn = sco_conn_hold_unless_zero(conn); in sco_sock_timeout()
148 if (!conn) in sco_sock_timeout()
151 sco_conn_lock(conn); in sco_sock_timeout()
152 if (!conn->hcon) { in sco_sock_timeout()
153 sco_conn_unlock(conn); in sco_sock_timeout()
154 sco_conn_put(conn); in sco_sock_timeout()
157 sk = sco_sock_hold(conn); in sco_sock_timeout()
158 sco_conn_unlock(conn); in sco_sock_timeout()
159 sco_conn_put(conn); in sco_sock_timeout()
175 if (!sco_pi(sk)->conn) in sco_sock_set_timer()
179 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_set_timer()
180 schedule_delayed_work(&sco_pi(sk)->conn->timeout_work, timeout); in sco_sock_set_timer()
185 if (!sco_pi(sk)->conn) in sco_sock_clear_timer()
189 cancel_delayed_work(&sco_pi(sk)->conn->timeout_work); in sco_sock_clear_timer()
195 struct sco_conn *conn = hcon->sco_data; in sco_conn_add() local
197 conn = sco_conn_hold_unless_zero(conn); in sco_conn_add()
198 if (conn) { in sco_conn_add()
199 if (!conn->hcon) { in sco_conn_add()
200 sco_conn_lock(conn); in sco_conn_add()
201 conn->hcon = hcon; in sco_conn_add()
202 sco_conn_unlock(conn); in sco_conn_add()
204 return conn; in sco_conn_add()
207 conn = kzalloc(sizeof(struct sco_conn), GFP_KERNEL); in sco_conn_add()
208 if (!conn) in sco_conn_add()
211 kref_init(&conn->ref); in sco_conn_add()
212 spin_lock_init(&conn->lock); in sco_conn_add()
213 INIT_DELAYED_WORK(&conn->timeout_work, sco_sock_timeout); in sco_conn_add()
215 hcon->sco_data = conn; in sco_conn_add()
216 conn->hcon = hcon; in sco_conn_add()
217 conn->mtu = hcon->mtu; in sco_conn_add()
220 conn->mtu = hcon->mtu; in sco_conn_add()
222 conn->mtu = 60; in sco_conn_add()
224 BT_DBG("hcon %p conn %p", hcon, conn); in sco_conn_add()
226 return conn; in sco_conn_add()
233 struct sco_conn *conn; in sco_chan_del() local
235 conn = sco_pi(sk)->conn; in sco_chan_del()
236 sco_pi(sk)->conn = NULL; in sco_chan_del()
238 BT_DBG("sk %p, conn %p, err %d", sk, conn, err); in sco_chan_del()
240 if (conn) { in sco_chan_del()
241 sco_conn_lock(conn); in sco_chan_del()
242 conn->sk = NULL; in sco_chan_del()
243 sco_conn_unlock(conn); in sco_chan_del()
244 sco_conn_put(conn); in sco_chan_del()
256 struct sco_conn *conn = hcon->sco_data; in sco_conn_del() local
259 conn = sco_conn_hold_unless_zero(conn); in sco_conn_del()
260 if (!conn) in sco_conn_del()
263 BT_DBG("hcon %p conn %p, err %d", hcon, conn, err); in sco_conn_del()
265 sco_conn_lock(conn); in sco_conn_del()
266 sk = sco_sock_hold(conn); in sco_conn_del()
267 sco_conn_unlock(conn); in sco_conn_del()
268 sco_conn_put(conn); in sco_conn_del()
271 sco_conn_put(conn); in sco_conn_del()
283 static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, in __sco_chan_add() argument
286 BT_DBG("conn %p", conn); in __sco_chan_add()
288 sco_pi(sk)->conn = conn; in __sco_chan_add()
289 conn->sk = sk; in __sco_chan_add()
295 static int sco_chan_add(struct sco_conn *conn, struct sock *sk, in sco_chan_add() argument
300 sco_conn_lock(conn); in sco_chan_add()
301 if (conn->sk) in sco_chan_add()
304 __sco_chan_add(conn, sk, parent); in sco_chan_add()
306 sco_conn_unlock(conn); in sco_chan_add()
312 struct sco_conn *conn; in sco_connect() local
347 conn = sco_conn_add(hcon); in sco_connect()
348 if (!conn) { in sco_connect()
356 err = sco_chan_add(conn, sk, NULL); in sco_connect()
383 struct sco_conn *conn = sco_pi(sk)->conn; in sco_send_frame() local
387 if (len > conn->mtu) in sco_send_frame()
392 hci_send_sco(conn->hcon, skb); in sco_send_frame()
397 static void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb) in sco_recv_frame() argument
401 sco_conn_lock(conn); in sco_recv_frame()
402 sk = conn->sk; in sco_recv_frame()
403 sco_conn_unlock(conn); in sco_recv_frame()
467 sco_conn_put(sco_pi(sk)->conn); in sco_sock_destruct()
816 static void sco_conn_defer_accept(struct hci_conn *conn, u16 setting) in sco_conn_defer_accept() argument
818 struct hci_dev *hdev = conn->hdev; in sco_conn_defer_accept()
820 BT_DBG("conn %p", conn); in sco_conn_defer_accept()
822 conn->state = BT_CONFIG; in sco_conn_defer_accept()
827 bacpy(&cp.bdaddr, &conn->dst); in sco_conn_defer_accept()
834 bacpy(&cp.bdaddr, &conn->dst); in sco_conn_defer_accept()
835 cp.pkt_type = cpu_to_le16(conn->pkt_type); in sco_conn_defer_accept()
843 if (conn->pkt_type & ESCO_2EV3) in sco_conn_defer_accept()
875 sco_conn_defer_accept(pi->conn->hcon, pi->setting); in sco_sock_recvmsg()
1049 opts.mtu = sco_pi(sk)->conn->mtu; in sco_sock_getsockopt_old()
1068 cinfo.hci_handle = sco_pi(sk)->conn->hcon->handle; in sco_sock_getsockopt_old()
1069 memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); in sco_sock_getsockopt_old()
1139 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); in sco_sock_getsockopt()
1158 if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) in sco_sock_getsockopt()
1322 static void sco_conn_ready(struct sco_conn *conn) in sco_conn_ready() argument
1325 struct sock *sk = conn->sk; in sco_conn_ready()
1327 BT_DBG("conn %p", conn); in sco_conn_ready()
1336 sco_conn_lock(conn); in sco_conn_ready()
1338 if (!conn->hcon) { in sco_conn_ready()
1339 sco_conn_unlock(conn); in sco_conn_ready()
1343 parent = sco_get_sock_listen(&conn->hcon->src); in sco_conn_ready()
1345 sco_conn_unlock(conn); in sco_conn_ready()
1355 sco_conn_unlock(conn); in sco_conn_ready()
1361 bacpy(&sco_pi(sk)->src, &conn->hcon->src); in sco_conn_ready()
1362 bacpy(&sco_pi(sk)->dst, &conn->hcon->dst); in sco_conn_ready()
1364 sco_conn_hold(conn); in sco_conn_ready()
1365 hci_conn_hold(conn->hcon); in sco_conn_ready()
1366 __sco_chan_add(conn, sk, parent); in sco_conn_ready()
1378 sco_conn_unlock(conn); in sco_conn_ready()
1418 struct sco_conn *conn; in sco_connect_cfm() local
1420 conn = sco_conn_add(hcon); in sco_connect_cfm()
1421 if (conn) { in sco_connect_cfm()
1422 sco_conn_ready(conn); in sco_connect_cfm()
1423 sco_conn_put(conn); in sco_connect_cfm()
1441 struct sco_conn *conn = hcon->sco_data; in sco_recv_scodata() local
1443 if (!conn) in sco_recv_scodata()
1446 BT_DBG("conn %p len %u", conn, skb->len); in sco_recv_scodata()
1449 sco_recv_frame(conn, skb); in sco_recv_scodata()