OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [net/] [bluetooth/] [hci_core.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
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
/*
26
 * $Id: hci_core.h,v 1.1.1.1 2004-04-15 02:34:41 phoenix Exp $
27
 */
28
 
29
#ifndef __HCI_CORE_H
30
#define __HCI_CORE_H
31
 
32
#include <net/bluetooth/hci.h>
33
 
34
/* HCI upper protocols */
35
#define HCI_PROTO_L2CAP 0
36
#define HCI_PROTO_SCO   1
37
 
38
#define HCI_INIT_TIMEOUT (HZ * 10)
39
 
40
/* HCI Core structures */
41
 
42
struct inquiry_entry {
43
        struct inquiry_entry    *next;
44
        __u32                   timestamp;
45
        inquiry_info            info;
46
};
47
 
48
struct inquiry_cache {
49
        spinlock_t              lock;
50
        __u32                   timestamp;
51
        struct inquiry_entry    *list;
52
};
53
 
54
struct conn_hash {
55
        struct list_head list;
56
        spinlock_t       lock;
57
        unsigned int     num;
58
};
59
 
60
struct hci_dev {
61
        struct list_head list;
62
        spinlock_t      lock;
63
        atomic_t        refcnt;
64
 
65
        char            name[8];
66
        unsigned long   flags;
67
        __u16           id;
68
        __u8            type;
69
        bdaddr_t        bdaddr;
70
        __u8            features[8];
71
 
72
        __u16           pkt_type;
73
        __u16           link_policy;
74
        __u16           link_mode;
75
 
76
        unsigned long   quirks;
77
 
78
        atomic_t        cmd_cnt;
79
        unsigned int    acl_cnt;
80
        unsigned int    sco_cnt;
81
 
82
        unsigned int    acl_mtu;
83
        unsigned int    sco_mtu;
84
        unsigned int    acl_pkts;
85
        unsigned int    sco_pkts;
86
 
87
        unsigned long   cmd_last_tx;
88
        unsigned long   acl_last_tx;
89
        unsigned long   sco_last_tx;
90
 
91
        struct tasklet_struct   cmd_task;
92
        struct tasklet_struct   rx_task;
93
        struct tasklet_struct   tx_task;
94
 
95
        struct sk_buff_head     rx_q;
96
        struct sk_buff_head     raw_q;
97
        struct sk_buff_head     cmd_q;
98
 
99
        struct sk_buff          *sent_cmd;
100
 
101
        struct semaphore        req_lock;
102
        wait_queue_head_t       req_wait_q;
103
        __u32                   req_status;
104
        __u32                   req_result;
105
 
106
        struct inquiry_cache    inq_cache;
107
        struct conn_hash        conn_hash;
108
 
109
        struct hci_dev_stats    stat;
110
 
111
        void                    *driver_data;
112
        void                    *core_data;
113
 
114
        atomic_t                promisc;
115
 
116
        int (*open)(struct hci_dev *hdev);
117
        int (*close)(struct hci_dev *hdev);
118
        int (*flush)(struct hci_dev *hdev);
119
        int (*send)(struct sk_buff *skb);
120
        void (*destruct)(struct hci_dev *hdev);
121
        int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
122
};
123
 
124
struct hci_conn {
125
        struct list_head list;
126
 
127
        atomic_t         refcnt;
128
        spinlock_t       lock;
129
 
130
        bdaddr_t         dst;
131
        __u16            handle;
132
        __u16            state;
133
        __u8             type;
134
        __u8             out;
135
        __u32            link_mode;
136
        unsigned long    pend;
137
 
138
        unsigned int     sent;
139
 
140
        struct sk_buff_head data_q;
141
 
142
        struct timer_list timer;
143
 
144
        struct hci_dev  *hdev;
145
        void            *l2cap_data;
146
        void            *sco_data;
147
        void            *priv;
148
 
149
        struct hci_conn *link;
150
};
151
 
152
extern struct hci_proto *hci_proto[];
153
extern struct list_head hdev_list;
154
extern rwlock_t hdev_list_lock;
155
 
156
/* ----- Inquiry cache ----- */
157
#define INQUIRY_CACHE_AGE_MAX   (HZ*30)   // 30 seconds
158
#define INQUIRY_ENTRY_AGE_MAX   (HZ*60)   // 60 seconds
159
 
160
#define inquiry_cache_lock(c)           spin_lock(&c->lock)
161
#define inquiry_cache_unlock(c)         spin_unlock(&c->lock)
162
#define inquiry_cache_lock_bh(c)        spin_lock_bh(&c->lock)
163
#define inquiry_cache_unlock_bh(c)      spin_unlock_bh(&c->lock)
164
 
165
static inline void inquiry_cache_init(struct hci_dev *hdev)
166
{
167
        struct inquiry_cache *c = &hdev->inq_cache;
168
        spin_lock_init(&c->lock);
169
        c->list = NULL;
170
}
171
 
172
static inline int inquiry_cache_empty(struct hci_dev *hdev)
173
{
174
        struct inquiry_cache *c = &hdev->inq_cache;
175
        return (c->list == NULL);
176
}
177
 
178
static inline long inquiry_cache_age(struct hci_dev *hdev)
179
{
180
        struct inquiry_cache *c = &hdev->inq_cache;
181
        return jiffies - c->timestamp;
182
}
183
 
184
static inline long inquiry_entry_age(struct inquiry_entry *e)
185
{
186
        return jiffies - e->timestamp;
187
}
188
 
189
struct inquiry_entry *inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *bdaddr);
190
void inquiry_cache_update(struct hci_dev *hdev, inquiry_info *info);
191
void inquiry_cache_flush(struct hci_dev *hdev);
192
int  inquiry_cache_dump(struct hci_dev *hdev, int num, __u8 *buf);
193
 
194
/* ----- HCI Connections ----- */
195
enum {
196
        HCI_CONN_AUTH_PEND,
197
        HCI_CONN_ENCRYPT_PEND
198
};
199
 
200
#define hci_conn_lock(c)        spin_lock(&c->lock)
201
#define hci_conn_unlock(c)      spin_unlock(&c->lock)
202
#define hci_conn_lock_bh(c)     spin_lock_bh(&c->lock)
203
#define hci_conn_unlock_bh(c)   spin_unlock_bh(&c->lock)
204
 
205
#define conn_hash_lock(d)       spin_lock(&d->conn_hash->lock)
206
#define conn_hash_unlock(d)     spin_unlock(&d->conn_hash->lock)
207
#define conn_hash_lock_bh(d)    spin_lock_bh(&d->conn_hash->lock)
208
#define conn_hash_unlock_bh(d)  spin_unlock_bh(&d->conn_hash->lock)
209
 
210
static inline void conn_hash_init(struct hci_dev *hdev)
211
{
212
        struct conn_hash *h = &hdev->conn_hash;
213
        INIT_LIST_HEAD(&h->list);
214
        spin_lock_init(&h->lock);
215
        h->num = 0;
216
}
217
 
218
static inline void conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
219
{
220
        struct conn_hash *h = &hdev->conn_hash;
221
        list_add(&c->list, &h->list);
222
        h->num++;
223
}
224
 
225
static inline void conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
226
{
227
        struct conn_hash *h = &hdev->conn_hash;
228
        list_del(&c->list);
229
        h->num--;
230
}
231
 
232
static inline struct hci_conn *conn_hash_lookup_handle(struct hci_dev *hdev,
233
                                        __u16 handle)
234
{
235
        register struct conn_hash *h = &hdev->conn_hash;
236
        register struct list_head *p;
237
        register struct hci_conn  *c;
238
 
239
        list_for_each(p, &h->list) {
240
                c = list_entry(p, struct hci_conn, list);
241
                if (c->handle == handle)
242
                        return c;
243
        }
244
        return NULL;
245
}
246
 
247
static inline struct hci_conn *conn_hash_lookup_ba(struct hci_dev *hdev,
248
                                        __u8 type, bdaddr_t *ba)
249
{
250
        register struct conn_hash *h = &hdev->conn_hash;
251
        register struct list_head *p;
252
        register struct hci_conn  *c;
253
 
254
        list_for_each(p, &h->list) {
255
                c = list_entry(p, struct hci_conn, list);
256
                if (c->type == type && !bacmp(&c->dst, ba))
257
                        return c;
258
        }
259
        return NULL;
260
}
261
 
262
void hci_acl_connect(struct hci_conn *conn);
263
void hci_acl_disconn(struct hci_conn *conn, __u8 reason);
264
void hci_add_sco(struct hci_conn *conn, __u16 handle);
265
 
266
struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst);
267
int    hci_conn_del(struct hci_conn *conn);
268
void   hci_conn_hash_flush(struct hci_dev *hdev);
269
 
270
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *src);
271
int hci_conn_auth(struct hci_conn *conn);
272
int hci_conn_encrypt(struct hci_conn *conn);
273
 
274
static inline void hci_conn_set_timer(struct hci_conn *conn, long timeout)
275
{
276
        mod_timer(&conn->timer, jiffies + timeout);
277
}
278
 
279
static inline void hci_conn_del_timer(struct hci_conn *conn)
280
{
281
        del_timer(&conn->timer);
282
}
283
 
284
static inline void hci_conn_hold(struct hci_conn *conn)
285
{
286
        atomic_inc(&conn->refcnt);
287
        hci_conn_del_timer(conn);
288
}
289
 
290
static inline void hci_conn_put(struct hci_conn *conn)
291
{
292
        if (atomic_dec_and_test(&conn->refcnt)) {
293
                if (conn->type == ACL_LINK) {
294
                        unsigned long timeo = (conn->out) ?
295
                                HCI_DISCONN_TIMEOUT : HCI_DISCONN_TIMEOUT * 2;
296
                        hci_conn_set_timer(conn, timeo);
297
                } else
298
                        hci_conn_set_timer(conn, HZ / 100);
299
        }
300
}
301
 
302
/* ----- HCI Devices ----- */
303
static inline void hci_dev_put(struct hci_dev *d)
304
{
305
        if (atomic_dec_and_test(&d->refcnt))
306
                d->destruct(d);
307
}
308
#define hci_dev_hold(d)         atomic_inc(&d->refcnt)
309
 
310
#define hci_dev_lock(d)         spin_lock(&d->lock)
311
#define hci_dev_unlock(d)       spin_unlock(&d->lock)
312
#define hci_dev_lock_bh(d)      spin_lock_bh(&d->lock)
313
#define hci_dev_unlock_bh(d)    spin_unlock_bh(&d->lock)
314
 
315
struct hci_dev *hci_dev_get(int index);
316
struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst);
317
int hci_register_dev(struct hci_dev *hdev);
318
int hci_unregister_dev(struct hci_dev *hdev);
319
int hci_suspend_dev(struct hci_dev *hdev);
320
int hci_resume_dev(struct hci_dev *hdev);
321
int hci_dev_open(__u16 dev);
322
int hci_dev_close(__u16 dev);
323
int hci_dev_reset(__u16 dev);
324
int hci_dev_reset_stat(__u16 dev);
325
int hci_dev_cmd(unsigned int cmd, unsigned long arg);
326
int hci_get_dev_list(unsigned long arg);
327
int hci_get_dev_info(unsigned long arg);
328
int hci_get_conn_list(unsigned long arg);
329
int hci_get_conn_info(struct hci_dev *hdev, unsigned long arg);
330
int hci_inquiry(unsigned long arg);
331
 
332
int  hci_recv_frame(struct sk_buff *skb);
333
void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
334
 
335
/* ----- LMP capabilities ----- */
336
#define lmp_rswitch_capable(dev) (dev->features[0] & LMP_RSWITCH)
337
#define lmp_encrypt_capable(dev) (dev->features[0] & LMP_ENCRYPT)
338
 
339
/* ----- HCI tasks ----- */
340
static inline void hci_sched_cmd(struct hci_dev *hdev)
341
{
342
        tasklet_schedule(&hdev->cmd_task);
343
}
344
 
345
static inline void hci_sched_rx(struct hci_dev *hdev)
346
{
347
        tasklet_schedule(&hdev->rx_task);
348
}
349
 
350
static inline void hci_sched_tx(struct hci_dev *hdev)
351
{
352
        tasklet_schedule(&hdev->tx_task);
353
}
354
 
355
/* ----- HCI protocols ----- */
356
struct hci_proto {
357
        char            *name;
358
        unsigned int    id;
359
        unsigned long   flags;
360
 
361
        void            *priv;
362
 
363
        int (*connect_ind)      (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type);
364
        int (*connect_cfm)      (struct hci_conn *conn, __u8 status);
365
        int (*disconn_ind)      (struct hci_conn *conn, __u8 reason);
366
        int (*recv_acldata)     (struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
367
        int (*recv_scodata)     (struct hci_conn *conn, struct sk_buff *skb);
368
        int (*auth_cfm)         (struct hci_conn *conn, __u8 status);
369
        int (*encrypt_cfm)      (struct hci_conn *conn, __u8 status);
370
};
371
 
372
static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 type)
373
{
374
        register struct hci_proto *hp;
375
        int mask = 0;
376
 
377
        hp = hci_proto[HCI_PROTO_L2CAP];
378
        if (hp && hp->connect_ind)
379
                mask |= hp->connect_ind(hdev, bdaddr, type);
380
 
381
        hp = hci_proto[HCI_PROTO_SCO];
382
        if (hp && hp->connect_ind)
383
                mask |= hp->connect_ind(hdev, bdaddr, type);
384
 
385
        return mask;
386
}
387
 
388
static inline void hci_proto_connect_cfm(struct hci_conn *conn, __u8 status)
389
{
390
        register struct hci_proto *hp;
391
 
392
        hp = hci_proto[HCI_PROTO_L2CAP];
393
        if (hp && hp->connect_cfm)
394
                hp->connect_cfm(conn, status);
395
 
396
        hp = hci_proto[HCI_PROTO_SCO];
397
        if (hp && hp->connect_cfm)
398
                hp->connect_cfm(conn, status);
399
}
400
 
401
static inline void hci_proto_disconn_ind(struct hci_conn *conn, __u8 reason)
402
{
403
        register struct hci_proto *hp;
404
 
405
        hp = hci_proto[HCI_PROTO_L2CAP];
406
        if (hp && hp->disconn_ind)
407
                hp->disconn_ind(conn, reason);
408
 
409
        hp = hci_proto[HCI_PROTO_SCO];
410
        if (hp && hp->disconn_ind)
411
                hp->disconn_ind(conn, reason);
412
}
413
 
414
static inline void hci_proto_auth_cfm(struct hci_conn *conn, __u8 status)
415
{
416
        register struct hci_proto *hp;
417
 
418
        hp = hci_proto[HCI_PROTO_L2CAP];
419
        if (hp && hp->auth_cfm)
420
                hp->auth_cfm(conn, status);
421
 
422
        hp = hci_proto[HCI_PROTO_SCO];
423
        if (hp && hp->auth_cfm)
424
                hp->auth_cfm(conn, status);
425
}
426
 
427
static inline void hci_proto_encrypt_cfm(struct hci_conn *conn, __u8 status)
428
{
429
        register struct hci_proto *hp;
430
 
431
        hp = hci_proto[HCI_PROTO_L2CAP];
432
        if (hp && hp->encrypt_cfm)
433
                hp->encrypt_cfm(conn, status);
434
 
435
        hp = hci_proto[HCI_PROTO_SCO];
436
        if (hp && hp->encrypt_cfm)
437
                hp->encrypt_cfm(conn, status);
438
}
439
 
440
int hci_register_proto(struct hci_proto *hproto);
441
int hci_unregister_proto(struct hci_proto *hproto);
442
int hci_register_notifier(struct notifier_block *nb);
443
int hci_unregister_notifier(struct notifier_block *nb);
444
 
445
int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void *param);
446
int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
447
int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
448
 
449
void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 ogf, __u16 ocf);
450
 
451
void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data);
452
 
453
/* ----- HCI Sockets ----- */
454
void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
455
 
456
/* HCI info for socket */
457
#define hci_pi(sk)      ((struct hci_pinfo *) &sk->tp_pinfo)
458
struct hci_pinfo {
459
        struct hci_dev    *hdev;
460
        struct hci_filter filter;
461
        __u32             cmsg_mask;
462
};
463
 
464
/* HCI security filter */
465
#define HCI_SFLT_MAX_OGF  5
466
 
467
struct hci_sec_filter {
468
        __u32 type_mask;
469
        __u32 event_mask[2];
470
        __u32 ocf_mask[HCI_SFLT_MAX_OGF + 1][4];
471
};
472
 
473
/* ----- HCI requests ----- */
474
#define HCI_REQ_DONE      0
475
#define HCI_REQ_PEND      1
476
#define HCI_REQ_CANCELED  2
477
 
478
#define hci_req_lock(d)         down(&d->req_lock)
479
#define hci_req_unlock(d)       up(&d->req_lock)
480
 
481
void hci_req_complete(struct hci_dev *hdev, int result);
482
void hci_req_cancel(struct hci_dev *hdev, int err);
483
 
484
#endif /* __HCI_CORE_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.