[Bluetooth] Return EINPROGRESS for non-blocking socket calls
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / net / bluetooth / hci_core.h
CommitLineData
1da177e4
LT
1/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22 SOFTWARE IS DISCLAIMED.
23*/
24
25#ifndef __HCI_CORE_H
26#define __HCI_CORE_H
27
1da177e4
LT
28#include <net/bluetooth/hci.h>
29
30/* HCI upper protocols */
31#define HCI_PROTO_L2CAP 0
32#define HCI_PROTO_SCO 1
33
1da177e4 34/* HCI Core structures */
1da177e4
LT
35struct inquiry_data {
36 bdaddr_t bdaddr;
37 __u8 pscan_rep_mode;
38 __u8 pscan_period_mode;
39 __u8 pscan_mode;
40 __u8 dev_class[3];
1ebb9252 41 __le16 clock_offset;
1da177e4
LT
42 __s8 rssi;
43};
44
45struct inquiry_entry {
46 struct inquiry_entry *next;
47 __u32 timestamp;
48 struct inquiry_data data;
49};
50
51struct inquiry_cache {
52 spinlock_t lock;
53 __u32 timestamp;
54 struct inquiry_entry *list;
55};
56
57struct hci_conn_hash {
58 struct list_head list;
59 spinlock_t lock;
60 unsigned int acl_num;
61 unsigned int sco_num;
62};
63
64struct hci_dev {
65 struct list_head list;
66 spinlock_t lock;
67 atomic_t refcnt;
68
69 char name[8];
70 unsigned long flags;
71 __u16 id;
72 __u8 type;
73 bdaddr_t bdaddr;
74 __u8 features[8];
75 __u16 voice_setting;
76
77 __u16 pkt_type;
78 __u16 link_policy;
79 __u16 link_mode;
80
04837f64
MH
81 __u32 idle_timeout;
82 __u16 sniff_min_interval;
83 __u16 sniff_max_interval;
84
1da177e4
LT
85 unsigned long quirks;
86
87 atomic_t cmd_cnt;
88 unsigned int acl_cnt;
89 unsigned int sco_cnt;
90
91 unsigned int acl_mtu;
92 unsigned int sco_mtu;
93 unsigned int acl_pkts;
94 unsigned int sco_pkts;
95
96 unsigned long cmd_last_tx;
97 unsigned long acl_last_tx;
98 unsigned long sco_last_tx;
99
100 struct tasklet_struct cmd_task;
101 struct tasklet_struct rx_task;
102 struct tasklet_struct tx_task;
103
104 struct sk_buff_head rx_q;
105 struct sk_buff_head raw_q;
106 struct sk_buff_head cmd_q;
107
108 struct sk_buff *sent_cmd;
109
110 struct semaphore req_lock;
111 wait_queue_head_t req_wait_q;
112 __u32 req_status;
113 __u32 req_result;
114
115 struct inquiry_cache inq_cache;
116 struct hci_conn_hash conn_hash;
117
118 struct hci_dev_stats stat;
119
120 struct sk_buff_head driver_init;
121
122 void *driver_data;
123 void *core_data;
124
125 atomic_t promisc;
126
a91f2e39
MH
127 struct device *parent;
128 struct device dev;
1da177e4
LT
129
130 struct module *owner;
131
132 int (*open)(struct hci_dev *hdev);
133 int (*close)(struct hci_dev *hdev);
134 int (*flush)(struct hci_dev *hdev);
135 int (*send)(struct sk_buff *skb);
136 void (*destruct)(struct hci_dev *hdev);
137 void (*notify)(struct hci_dev *hdev, unsigned int evt);
138 int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
139};
140
141struct hci_conn {
142 struct list_head list;
143
144 atomic_t refcnt;
145 spinlock_t lock;
146
147 bdaddr_t dst;
148 __u16 handle;
149 __u16 state;
04837f64 150 __u8 mode;
1da177e4
LT
151 __u8 type;
152 __u8 out;
153 __u8 dev_class[3];
04837f64
MH
154 __u8 features[8];
155 __u16 interval;
156 __u16 link_policy;
1da177e4 157 __u32 link_mode;
04837f64 158 __u8 power_save;
1da177e4 159 unsigned long pend;
04837f64 160
1da177e4 161 unsigned int sent;
04837f64 162
1da177e4
LT
163 struct sk_buff_head data_q;
164
04837f64
MH
165 struct timer_list disc_timer;
166 struct timer_list idle_timer;
167
b219e3ac
MH
168 struct work_struct work;
169
170 struct device dev;
171
1da177e4
LT
172 struct hci_dev *hdev;
173 void *l2cap_data;
174 void *sco_data;
175 void *priv;
176
177 struct hci_conn *link;
178};
179
180extern struct hci_proto *hci_proto[];
181extern struct list_head hci_dev_list;
182extern struct list_head hci_cb_list;
183extern rwlock_t hci_dev_list_lock;
184extern rwlock_t hci_cb_list_lock;
185
186/* ----- Inquiry cache ----- */
187#define INQUIRY_CACHE_AGE_MAX (HZ*30) // 30 seconds
188#define INQUIRY_ENTRY_AGE_MAX (HZ*60) // 60 seconds
189
190#define inquiry_cache_lock(c) spin_lock(&c->lock)
191#define inquiry_cache_unlock(c) spin_unlock(&c->lock)
192#define inquiry_cache_lock_bh(c) spin_lock_bh(&c->lock)
193#define inquiry_cache_unlock_bh(c) spin_unlock_bh(&c->lock)
194
195static inline void inquiry_cache_init(struct hci_dev *hdev)
196{
197 struct inquiry_cache *c = &hdev->inq_cache;
198 spin_lock_init(&c->lock);
199 c->list = NULL;
200}
201
202static inline int inquiry_cache_empty(struct hci_dev *hdev)
203{
204 struct inquiry_cache *c = &hdev->inq_cache;
205 return (c->list == NULL);
206}
207
208static inline long inquiry_cache_age(struct hci_dev *hdev)
209{
210 struct inquiry_cache *c = &hdev->inq_cache;
211 return jiffies - c->timestamp;
212}
213
214static inline long inquiry_entry_age(struct inquiry_entry *e)
215{
216 return jiffies - e->timestamp;
217}
218
219struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
220void hci_inquiry_cache_update(struct hci_dev *hdev, struct inquiry_data *data);
221
222/* ----- HCI Connections ----- */
223enum {
224 HCI_CONN_AUTH_PEND,
225 HCI_CONN_ENCRYPT_PEND,
04837f64
MH
226 HCI_CONN_RSWITCH_PEND,
227 HCI_CONN_MODE_CHANGE_PEND,
1da177e4
LT
228};
229
230static inline void hci_conn_hash_init(struct hci_dev *hdev)
231{
232 struct hci_conn_hash *h = &hdev->conn_hash;
233 INIT_LIST_HEAD(&h->list);
234 spin_lock_init(&h->lock);
235 h->acl_num = 0;
236 h->sco_num = 0;
237}
238
239static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
240{
241 struct hci_conn_hash *h = &hdev->conn_hash;
242 list_add(&c->list, &h->list);
243 if (c->type == ACL_LINK)
244 h->acl_num++;
245 else
246 h->sco_num++;
247}
248
249static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
250{
251 struct hci_conn_hash *h = &hdev->conn_hash;
252 list_del(&c->list);
253 if (c->type == ACL_LINK)
254 h->acl_num--;
255 else
256 h->sco_num--;
257}
258
259static inline struct hci_conn *hci_conn_hash_lookup_handle(struct hci_dev *hdev,
260 __u16 handle)
261{
262 struct hci_conn_hash *h = &hdev->conn_hash;
263 struct list_head *p;
264 struct hci_conn *c;
265
266 list_for_each(p, &h->list) {
267 c = list_entry(p, struct hci_conn, list);
268 if (c->handle == handle)
269 return c;
270 }
271 return NULL;
272}
273
274static inline struct hci_conn *hci_conn_hash_lookup_ba(struct hci_dev *hdev,
275 __u8 type, bdaddr_t *ba)
276{
277 struct hci_conn_hash *h = &hdev->conn_hash;
278 struct list_head *p;
279 struct hci_conn *c;
280
281 list_for_each(p, &h->list) {
282 c = list_entry(p, struct hci_conn, list);
283 if (c->type == type && !bacmp(&c->dst, ba))
284 return c;
285 }
286 return NULL;
287}
288
289void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
290void hci_add_sco(struct hci_conn *conn, __u16 handle);
291
292struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
293int hci_conn_del(struct hci_conn *conn);
294void hci_conn_hash_flush(struct hci_dev *hdev);
295
296struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src);
297int hci_conn_auth(struct hci_conn *conn);
298int hci_conn_encrypt(struct hci_conn *conn);
299int hci_conn_change_link_key(struct hci_conn *conn);
300int hci_conn_switch_role(struct hci_conn *conn, uint8_t role);
301
04837f64
MH
302void hci_conn_enter_active_mode(struct hci_conn *conn);
303void hci_conn_enter_sniff_mode(struct hci_conn *conn);
1da177e4
LT
304
305static inline void hci_conn_hold(struct hci_conn *conn)
306{
307 atomic_inc(&conn->refcnt);
04837f64 308 del_timer(&conn->disc_timer);
1da177e4
LT
309}
310
311static inline void hci_conn_put(struct hci_conn *conn)
312{
313 if (atomic_dec_and_test(&conn->refcnt)) {
04837f64 314 unsigned long timeo;
1da177e4 315 if (conn->type == ACL_LINK) {
04837f64
MH
316 timeo = msecs_to_jiffies(HCI_DISCONN_TIMEOUT);
317 if (!conn->out)
318 timeo *= 2;
319 del_timer(&conn->idle_timer);
1da177e4 320 } else
04837f64
MH
321 timeo = msecs_to_jiffies(10);
322 mod_timer(&conn->disc_timer, jiffies + timeo);
1da177e4
LT
323 }
324}
325
326/* ----- HCI tasks ----- */
327static inline void hci_sched_cmd(struct hci_dev *hdev)
328{
329 tasklet_schedule(&hdev->cmd_task);
330}
331
332static inline void hci_sched_rx(struct hci_dev *hdev)
333{
334 tasklet_schedule(&hdev->rx_task);
335}
336
337static inline void hci_sched_tx(struct hci_dev *hdev)
338{
339 tasklet_schedule(&hdev->tx_task);
340}
341
342/* ----- HCI Devices ----- */
343static inline void __hci_dev_put(struct hci_dev *d)
344{
345 if (atomic_dec_and_test(&d->refcnt))
346 d->destruct(d);
347}
348
349static inline void hci_dev_put(struct hci_dev *d)
350{
351 __hci_dev_put(d);
352 module_put(d->owner);
353}
354
355static inline struct hci_dev *__hci_dev_hold(struct hci_dev *d)
356{
357 atomic_inc(&d->refcnt);
358 return d;
359}
360
361static inline struct hci_dev *hci_dev_hold(struct hci_dev *d)
362{
363 if (try_module_get(d->owner))
364 return __hci_dev_hold(d);
365 return NULL;
366}
367
368#define hci_dev_lock(d) spin_lock(&d->lock)
369#define hci_dev_unlock(d) spin_unlock(&d->lock)
370#define hci_dev_lock_bh(d) spin_lock_bh(&d->lock)
371#define hci_dev_unlock_bh(d) spin_unlock_bh(&d->lock)
372
373struct hci_dev *hci_dev_get(int index);
374struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
375
376struct hci_dev *hci_alloc_dev(void);
377void hci_free_dev(struct hci_dev *hdev);
378int hci_register_dev(struct hci_dev *hdev);
379int hci_unregister_dev(struct hci_dev *hdev);
380int hci_suspend_dev(struct hci_dev *hdev);
381int hci_resume_dev(struct hci_dev *hdev);
382int hci_dev_open(__u16 dev);
383int hci_dev_close(__u16 dev);
384int hci_dev_reset(__u16 dev);
385int hci_dev_reset_stat(__u16 dev);
386int hci_dev_cmd(unsigned int cmd, void __user *arg);
387int hci_get_dev_list(void __user *arg);
388int hci_get_dev_info(void __user *arg);
389int hci_get_conn_list(void __user *arg);
390int hci_get_conn_info(struct hci_dev *hdev, void __user *arg);
391int hci_inquiry(void __user *arg);
392
393void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
394
395/* Receive frame from HCI drivers */
396static inline int hci_recv_frame(struct sk_buff *skb)
397{
398 struct hci_dev *hdev = (struct hci_dev *) skb->dev;
399 if (!hdev || (!test_bit(HCI_UP, &hdev->flags)
400 && !test_bit(HCI_INIT, &hdev->flags))) {
401 kfree_skb(skb);
402 return -ENXIO;
403 }
404
405 /* Incomming skb */
406 bt_cb(skb)->incoming = 1;
407
408 /* Time stamp */
a61bbcf2 409 __net_timestamp(skb);
1da177e4
LT
410
411 /* Queue frame for rx task */
412 skb_queue_tail(&hdev->rx_q, skb);
413 hci_sched_rx(hdev);
414 return 0;
415}
416
417int hci_register_sysfs(struct hci_dev *hdev);
418void hci_unregister_sysfs(struct hci_dev *hdev);
b219e3ac
MH
419void hci_conn_add_sysfs(struct hci_conn *conn);
420void hci_conn_del_sysfs(struct hci_conn *conn);
1da177e4 421
a91f2e39 422#define SET_HCIDEV_DEV(hdev, pdev) ((hdev)->parent = (pdev))
1da177e4
LT
423
424/* ----- LMP capabilities ----- */
04837f64
MH
425#define lmp_rswitch_capable(dev) ((dev)->features[0] & LMP_RSWITCH)
426#define lmp_encrypt_capable(dev) ((dev)->features[0] & LMP_ENCRYPT)
427#define lmp_sniff_capable(dev) ((dev)->features[0] & LMP_SNIFF)
428#define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR)
1da177e4
LT
429
430/* ----- HCI protocols ----- */
431struct hci_proto {
432 char *name;
433 unsigned int id;
434 unsigned long flags;
435
436 void *priv;
437
438 int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type);
439 int (*connect_cfm) (struct hci_conn *conn, __u8 status);
440 int (*disconn_ind) (struct hci_conn *conn, __u8 reason);
441 int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
442 int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb);
443 int (*auth_cfm) (struct hci_conn *conn, __u8 status);
444 int (*encrypt_cfm) (struct hci_conn *conn, __u8 status);
445};
446
447static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
448{
449 register struct hci_proto *hp;
450 int mask = 0;
451
452 hp = hci_proto[HCI_PROTO_L2CAP];
453 if (hp && hp->connect_ind)
454 mask |= hp->connect_ind(hdev, bdaddr, type);
455
456 hp = hci_proto[HCI_PROTO_SCO];
457 if (hp && hp->connect_ind)
458 mask |= hp->connect_ind(hdev, bdaddr, type);
459
460 return mask;
461}
462
463static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
464{
465 register struct hci_proto *hp;
466
467 hp = hci_proto[HCI_PROTO_L2CAP];
468 if (hp && hp->connect_cfm)
469 hp->connect_cfm(conn, status);
470
471 hp = hci_proto[HCI_PROTO_SCO];
472 if (hp && hp->connect_cfm)
473 hp->connect_cfm(conn, status);
474}
475
476static inline void hci_proto_disconn_ind(struct hci_conn *conn, __u8 reason)
477{
478 register struct hci_proto *hp;
479
480 hp = hci_proto[HCI_PROTO_L2CAP];
481 if (hp && hp->disconn_ind)
482 hp->disconn_ind(conn, reason);
483
484 hp = hci_proto[HCI_PROTO_SCO];
485 if (hp && hp->disconn_ind)
486 hp->disconn_ind(conn, reason);
487}
488
489static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
490{
491 register struct hci_proto *hp;
492
493 hp = hci_proto[HCI_PROTO_L2CAP];
494 if (hp && hp->auth_cfm)
495 hp->auth_cfm(conn, status);
496
497 hp = hci_proto[HCI_PROTO_SCO];
498 if (hp && hp->auth_cfm)
499 hp->auth_cfm(conn, status);
500}
501
502static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status)
503{
504 register struct hci_proto *hp;
505
506 hp = hci_proto[HCI_PROTO_L2CAP];
507 if (hp && hp->encrypt_cfm)
508 hp->encrypt_cfm(conn, status);
509
510 hp = hci_proto[HCI_PROTO_SCO];
511 if (hp && hp->encrypt_cfm)
512 hp->encrypt_cfm(conn, status);
513}
514
515int hci_register_proto(struct hci_proto *hproto);
516int hci_unregister_proto(struct hci_proto *hproto);
517
518/* ----- HCI callbacks ----- */
519struct hci_cb {
520 struct list_head list;
521
522 char *name;
523
524 void (*auth_cfm) (struct hci_conn *conn, __u8 status);
525 void (*encrypt_cfm) (struct hci_conn *conn, __u8 status, __u8 encrypt);
526 void (*key_change_cfm) (struct hci_conn *conn, __u8 status);
527 void (*role_switch_cfm) (struct hci_conn *conn, __u8 status, __u8 role);
528};
529
530static inline void hci_auth_cfm(struct hci_conn *conn, __u8 status)
531{
532 struct list_head *p;
533
534 hci_proto_auth_cfm(conn, status);
535
536 read_lock_bh(&hci_cb_list_lock);
537 list_for_each(p, &hci_cb_list) {
538 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
539 if (cb->auth_cfm)
540 cb->auth_cfm(conn, status);
541 }
542 read_unlock_bh(&hci_cb_list_lock);
543}
544
545static inline void hci_encrypt_cfm(struct hci_conn *conn, __u8 status, __u8 encrypt)
546{
547 struct list_head *p;
548
549 hci_proto_encrypt_cfm(conn, status);
550
551 read_lock_bh(&hci_cb_list_lock);
552 list_for_each(p, &hci_cb_list) {
553 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
554 if (cb->encrypt_cfm)
555 cb->encrypt_cfm(conn, status, encrypt);
556 }
557 read_unlock_bh(&hci_cb_list_lock);
558}
559
560static inline void hci_key_change_cfm(struct hci_conn *conn, __u8 status)
561{
562 struct list_head *p;
563
564 read_lock_bh(&hci_cb_list_lock);
565 list_for_each(p, &hci_cb_list) {
566 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
567 if (cb->key_change_cfm)
568 cb->key_change_cfm(conn, status);
569 }
570 read_unlock_bh(&hci_cb_list_lock);
571}
572
573static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status, __u8 role)
574{
575 struct list_head *p;
576
577 read_lock_bh(&hci_cb_list_lock);
578 list_for_each(p, &hci_cb_list) {
579 struct hci_cb *cb = list_entry(p, struct hci_cb, list);
580 if (cb->role_switch_cfm)
581 cb->role_switch_cfm(conn, status, role);
582 }
583 read_unlock_bh(&hci_cb_list_lock);
584}
585
586int hci_register_cb(struct hci_cb *hcb);
587int hci_unregister_cb(struct hci_cb *hcb);
588
589int hci_register_notifier(struct notifier_block *nb);
590int hci_unregister_notifier(struct notifier_block *nb);
591
592int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param);
593int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
594int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
595
596void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf);
597
598void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
599
600/* ----- HCI Sockets ----- */
601void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
602
603/* HCI info for socket */
604#define hci_pi(sk) ((struct hci_pinfo *) sk)
605
606struct hci_pinfo {
607 struct bt_sock bt;
608 struct hci_dev *hdev;
609 struct hci_filter filter;
610 __u32 cmsg_mask;
611};
612
613/* HCI security filter */
614#define HCI_SFLT_MAX_OGF 5
615
616struct hci_sec_filter {
617 __u32 type_mask;
618 __u32 event_mask[2];
619 __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
620};
621
622/* ----- HCI requests ----- */
623#define HCI_REQ_DONE 0
624#define HCI_REQ_PEND 1
625#define HCI_REQ_CANCELED 2
626
627#define hci_req_lock(d) down(&d->req_lock)
628#define hci_req_unlock(d) up(&d->req_lock)
629
630void hci_req_complete(struct hci_dev *hdev, int result);
631
632#endif /* __HCI_CORE_H */