patch-2.4.6 linux/include/net/bluetooth/hci_core.h
Next file: linux/include/net/bluetooth/hci_emu.h
Previous file: linux/include/net/bluetooth/hci.h
Back to the patch index
Back to the overall index
- Lines: 344
- Date:
Mon Jun 11 19:15:27 2001
- Orig file:
v2.4.5/linux/include/net/bluetooth/hci_core.h
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.4.5/linux/include/net/bluetooth/hci_core.h linux/include/net/bluetooth/hci_core.h
@@ -0,0 +1,343 @@
+/*
+ BlueZ - Bluetooth protocol stack for Linux
+ Copyright (C) 2000-2001 Qualcomm Incorporated
+
+ Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation;
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
+ CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+ COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
+ SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id: hci_core.h,v 1.1 2001/06/01 08:12:11 davem Exp $
+ */
+
+#ifndef __IF_HCI_CORE_H
+#define __IF_HCI_CORE_H
+
+#include "hci.h"
+
+/* HCI upper protocols */
+#define HCI_MAX_PROTO 1
+#define HCI_PROTO_L2CAP 0
+
+#define HCI_INIT_TIMEOUT (HZ * 10)
+
+/* ----- Inquiry cache ----- */
+#define INQUIRY_CACHE_AGE_MAX (HZ*5) // 5 seconds
+#define INQUIRY_ENTRY_AGE_MAX (HZ*60) // 60 seconds
+
+struct inquiry_entry {
+ struct inquiry_entry *next;
+ __u32 timestamp;
+ inquiry_info info;
+};
+
+struct inquiry_cache {
+ spinlock_t lock;
+ __u32 timestamp;
+ struct inquiry_entry *list;
+};
+
+static __inline__ void inquiry_cache_init(struct inquiry_cache *cache)
+{
+ spin_lock_init(&cache->lock);
+ cache->list = NULL;
+}
+
+static __inline__ void inquiry_cache_lock(struct inquiry_cache *cache)
+{
+ spin_lock(&cache->lock);
+}
+
+static __inline__ void inquiry_cache_unlock(struct inquiry_cache *cache)
+{
+ spin_unlock(&cache->lock);
+}
+
+static __inline__ void inquiry_cache_lock_bh(struct inquiry_cache *cache)
+{
+ spin_lock_bh(&cache->lock);
+}
+
+static __inline__ void inquiry_cache_unlock_bh(struct inquiry_cache *cache)
+{
+ spin_unlock_bh(&cache->lock);
+}
+
+static __inline__ long inquiry_cache_age(struct inquiry_cache *cache)
+{
+ return jiffies - cache->timestamp;
+}
+
+static __inline__ long inquiry_entry_age(struct inquiry_entry *e)
+{
+ return jiffies - e->timestamp;
+}
+extern void inquiry_cache_flush(struct inquiry_cache *cache);
+
+/* ----- Connection hash ----- */
+#define HCI_MAX_CONN 10
+
+/* FIXME:
+ * We assume that handle is a number - 0 ... HCI_MAX_CONN.
+ */
+struct conn_hash {
+ spinlock_t lock;
+ unsigned int num;
+ void *conn[HCI_MAX_CONN];
+};
+
+static __inline__ void conn_hash_init(struct conn_hash *h)
+{
+ memset(h, 0, sizeof(struct conn_hash));
+ spin_lock_init(&h->lock);
+}
+
+static __inline__ void conn_hash_lock(struct conn_hash *h)
+{
+ spin_lock(&h->lock);
+}
+
+static __inline__ void conn_hash_unlock(struct conn_hash *h)
+{
+ spin_unlock(&h->lock);
+}
+
+static __inline__ void *__conn_hash_add(struct conn_hash *h, __u16 handle, void *conn)
+{
+ if (!h->conn[handle]) {
+ h->conn[handle] = conn;
+ h->num++;
+ return conn;
+ } else
+ return NULL;
+}
+
+static __inline__ void *conn_hash_add(struct conn_hash *h, __u16 handle, void *conn)
+{
+ if (handle >= HCI_MAX_CONN)
+ return NULL;
+
+ conn_hash_lock(h);
+ conn = __conn_hash_add(h, handle, conn);
+ conn_hash_unlock(h);
+
+ return conn;
+}
+
+static __inline__ void *__conn_hash_del(struct conn_hash *h, __u16 handle)
+{
+ void *conn = h->conn[handle];
+
+ if (conn) {
+ h->conn[handle] = NULL;
+ h->num--;
+ return conn;
+ } else
+ return NULL;
+}
+
+static __inline__ void *conn_hash_del(struct conn_hash *h, __u16 handle)
+{
+ void *conn;
+
+ if (handle >= HCI_MAX_CONN)
+ return NULL;
+ conn_hash_lock(h);
+ conn = __conn_hash_del(h, handle);
+ conn_hash_unlock(h);
+
+ return conn;
+}
+
+static __inline__ void *__conn_hash_lookup(struct conn_hash *h, __u16 handle)
+{
+ return h->conn[handle];
+}
+
+static __inline__ void *conn_hash_lookup(struct conn_hash *h, __u16 handle)
+{
+ void *conn;
+
+ if (handle >= HCI_MAX_CONN)
+ return NULL;
+
+ conn_hash_lock(h);
+ conn = __conn_hash_lookup(h, handle);
+ conn_hash_unlock(h);
+
+ return conn;
+}
+
+struct hci_dev;
+
+/* ----- HCI Connections ----- */
+struct hci_conn {
+ bdaddr_t dst;
+ __u16 handle;
+
+ unsigned int acl_sent;
+ unsigned int sco_sent;
+
+ struct hci_dev *hdev;
+ void *l2cap_data;
+ void *priv;
+
+ struct sk_buff_head acl_q;
+ struct sk_buff_head sco_q;
+};
+
+/* ----- HCI Devices ----- */
+struct hci_dev {
+ atomic_t refcnt;
+
+ char name[8];
+ __u32 flags;
+ __u16 id;
+ __u8 type;
+ bdaddr_t bdaddr;
+
+ atomic_t cmd_cnt;
+ unsigned int acl_cnt;
+ unsigned int sco_cnt;
+
+ unsigned int acl_mtu;
+ unsigned int sco_mtu;
+ unsigned int acl_max;
+ unsigned int sco_max;
+
+ void *driver_data;
+ void *l2cap_data;
+ void *priv;
+
+ struct tasklet_struct cmd_task;
+ struct tasklet_struct rx_task;
+ struct tasklet_struct tx_task;
+
+ struct sk_buff_head rx_q;
+ struct sk_buff_head raw_q;
+ struct sk_buff_head cmd_q;
+ struct sk_buff *cmd_sent;
+
+ struct semaphore req_lock;
+ wait_queue_head_t req_wait_q;
+ __u32 req_status;
+ __u32 req_result;
+
+ struct inquiry_cache inq_cache;
+
+ struct conn_hash conn_hash;
+
+ struct hci_dev_stats stat;
+
+ int (*open)(struct hci_dev *hdev);
+ int (*close)(struct hci_dev *hdev);
+ int (*flush)(struct hci_dev *hdev);
+ int (*send)(struct sk_buff *skb);
+};
+
+static __inline__ void hci_dev_hold(struct hci_dev *hdev)
+{
+ atomic_inc(&hdev->refcnt);
+}
+
+static __inline__ void hci_dev_put(struct hci_dev *hdev)
+{
+ atomic_dec(&hdev->refcnt);
+}
+
+extern struct hci_dev *hci_dev_get(int index);
+
+#define SENT_CMD_PARAM(X) (((X->cmd_sent->data) + HCI_COMMAND_HDR_SIZE))
+
+extern int hci_register_dev(struct hci_dev *hdev);
+extern int hci_unregister_dev(struct hci_dev *hdev);
+extern int hci_dev_open(__u16 dev);
+extern int hci_dev_close(__u16 dev);
+extern int hci_dev_reset(__u16 dev);
+extern int hci_dev_reset_stat(__u16 dev);
+extern int hci_dev_info(unsigned long arg);
+extern int hci_dev_list(unsigned long arg);
+extern int hci_dev_setscan(unsigned long arg);
+extern int hci_dev_setauth(unsigned long arg);
+extern int hci_inquiry(unsigned long arg);
+
+extern __u32 hci_dev_setmode(struct hci_dev *hdev, __u32 mode);
+extern __u32 hci_dev_getmode(struct hci_dev *hdev);
+
+extern int hci_recv_frame(struct sk_buff *skb);
+
+/* ----- HCI tasks ----- */
+static __inline__ void hci_sched_cmd(struct hci_dev *hdev)
+{
+ tasklet_schedule(&hdev->cmd_task);
+}
+
+static __inline__ void hci_sched_rx(struct hci_dev *hdev)
+{
+ tasklet_schedule(&hdev->rx_task);
+}
+
+static __inline__ void hci_sched_tx(struct hci_dev *hdev)
+{
+ tasklet_schedule(&hdev->tx_task);
+}
+
+/* ----- HCI protocols ----- */
+struct hci_proto {
+ char *name;
+ __u32 id;
+ __u32 flags;
+
+ void *priv;
+
+ int (*connect_ind) (struct hci_dev *hdev, bdaddr_t *bdaddr);
+ int (*connect_cfm) (struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 status, struct hci_conn *conn);
+ int (*disconn_ind) (struct hci_conn *conn, __u8 reason);
+ int (*recv_acldata) (struct hci_conn *conn, struct sk_buff *skb , __u16 flags);
+ int (*recv_scodata) (struct hci_conn *conn, struct sk_buff *skb);
+};
+
+extern int hci_register_proto(struct hci_proto *hproto);
+extern int hci_unregister_proto(struct hci_proto *hproto);
+extern int hci_register_notifier(struct notifier_block *nb);
+extern int hci_unregister_notifier(struct notifier_block *nb);
+extern int hci_connect(struct hci_dev * hdev, bdaddr_t * bdaddr);
+extern int hci_disconnect(struct hci_conn *conn, __u8 reason);
+extern int hci_send_cmd(struct hci_dev *hdev, __u16 ogf, __u16 ocf, __u32 plen, void * param);
+extern int hci_send_raw(struct sk_buff *skb);
+extern int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags);
+extern int hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
+
+/* ----- HCI Sockets ----- */
+extern void hci_send_to_sock(struct hci_dev *hdev, struct sk_buff *skb);
+
+/* HCI info for socket */
+#define hci_pi(sk) ((struct hci_pinfo *) &sk->protinfo)
+struct hci_pinfo {
+ struct hci_dev *hdev;
+ __u32 cmsg_flags;
+ __u32 mask;
+};
+
+/* ----- HCI requests ----- */
+#define HCI_REQ_DONE 0
+#define HCI_REQ_PEND 1
+#define HCI_REQ_CANCELED 2
+
+#endif /* __IF_HCI_CORE_H */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)