diff options
| author | Linus Torvalds <torvalds@athlon.transmeta.com> | 2002-02-04 20:13:37 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@athlon.transmeta.com> | 2002-02-04 20:13:37 -0800 |
| commit | 1c3cefa582a6b598d204bad02676df300e457efa (patch) | |
| tree | c56196ce6e35589c43b227887932a5caf1bbe576 /include/net/bluetooth | |
| parent | 991b3ae8019276269816512425f102c4687f2291 (diff) | |
v2.4.9.4 -> v2.4.9.5
- Merge with Alan
- Trond Myklebust: NFS fixes - kmap and root inode special case
- Al Viro: more superblock cleanups, inode leak in rd.c, minix
directories in page cache
- Paul Mackerras: clean up rubbish from sl82c105.c
- Neil Brown: md/raid cleanups, NFS filehandles
- Johannes Erdfelt: USB update (usb-2.0 support, visor fix, Clie fix,
pl2303 driver update)
- David Miller: sparc and net update
- Eric Biederman: simplify and correct bootdata allocation - don't
overwrite ramdisks
- Tim Waugh: support multiple SuperIO devices, parport doc updates
Diffstat (limited to 'include/net/bluetooth')
| -rw-r--r-- | include/net/bluetooth/bluetooth.h | 49 | ||||
| -rw-r--r-- | include/net/bluetooth/bluez.h | 74 | ||||
| -rw-r--r-- | include/net/bluetooth/hci.h | 316 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_core.h | 169 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_uart.h | 6 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_usb.h | 4 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_vhci.h (renamed from include/net/bluetooth/hci_emu.h) | 22 | ||||
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 19 | ||||
| -rw-r--r-- | include/net/bluetooth/l2cap_core.h | 18 |
9 files changed, 353 insertions, 324 deletions
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index 8ab79794a92b..f46a969947de 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -23,27 +23,26 @@ */ /* - * $Id: bluetooth.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: bluetooth.h,v 1.6 2001/08/03 04:19:49 maxk Exp $ */ -#ifndef __IF_BLUETOOTH_H -#define __IF_BLUETOOTH_H +#ifndef __BLUETOOTH_H +#define __BLUETOOTH_H #include <asm/types.h> #include <asm/byteorder.h> +#ifndef AF_BLUETOOTH +#define AF_BLUETOOTH 31 +#define PF_BLUETOOTH AF_BLUETOOTH +#endif + #define BTPROTO_L2CAP 0 #define BTPROTO_HCI 1 #define SOL_HCI 0 #define SOL_L2CAP 6 -typedef struct { - __u8 b0, b1, b2, b3, b4, b5; -} bdaddr_t; - -#define BDADDR_ANY ((bdaddr_t *)"\000\000\000\000\000") - /* Connection and socket states */ enum { BT_CONNECTED = 1, /* Equal to TCP_ESTABLISHED to make net code happy */ @@ -56,27 +55,33 @@ enum { BT_CLOSED }; +/* Endianness conversions */ +#define htobs(a) __cpu_to_le16(a) +#define htobl(a) __cpu_to_le32(a) +#define btohs(a) __le16_to_cpu(a) +#define btohl(a) __le32_to_cpu(a) + +/* BD Address */ +typedef struct { + __u8 b[6]; +} __attribute__((packed)) bdaddr_t; + +#define BDADDR_ANY ((bdaddr_t *)"\000\000\000\000\000") + /* Copy, swap, convert BD Address */ -static __inline__ int bacmp(bdaddr_t *ba1, bdaddr_t *ba2) +static inline int bacmp(bdaddr_t *ba1, bdaddr_t *ba2) { return memcmp(ba1, ba2, sizeof(bdaddr_t)); } -static __inline__ void bacpy(bdaddr_t *dst, bdaddr_t *src) +static inline void bacpy(bdaddr_t *dst, bdaddr_t *src) { memcpy(dst, src, sizeof(bdaddr_t)); } -extern void baswap(bdaddr_t *dst, bdaddr_t *src); - -extern char *batostr(bdaddr_t *ba); -extern bdaddr_t *strtoba(char *str); - -/* Endianness conversions */ -#define htobs(a) __cpu_to_le16(a) -#define htobl(a) __cpu_to_le32(a) -#define btohs(a) __le16_to_cpu(a) -#define btohl(a) __le32_to_cpu(a) +void baswap(bdaddr_t *dst, bdaddr_t *src); +char *batostr(bdaddr_t *ba); +bdaddr_t *strtoba(char *str); int bterr(__u16 code); -#endif /* __IF_BLUETOOTH_H */ +#endif /* __BLUETOOTH_H */ diff --git a/include/net/bluetooth/bluez.h b/include/net/bluetooth/bluez.h index c738d308d34a..a1852c8712f0 100644 --- a/include/net/bluetooth/bluez.h +++ b/include/net/bluetooth/bluez.h @@ -23,7 +23,7 @@ */ /* - * $Id: bluez.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: bluez.h,v 1.4 2001/08/03 04:19:49 maxk Exp $ */ #ifndef __IF_BLUEZ_H @@ -31,8 +31,6 @@ #include <net/sock.h> -#define BLUEZ_VER "1.0" - #define BLUEZ_MAX_PROTO 2 /* Reserv for core and drivers use */ @@ -81,91 +79,41 @@ extern void bluez_sock_unlink(struct bluez_sock_list *l, struct sock *s); /* ----- SKB helpers ----- */ struct bluez_skb_cb { - int incomming, fragmented; - struct sk_buff_head frags; + int incomming; }; #define bluez_cb(skb) ((struct bluez_skb_cb *)(skb->cb)) -static __inline__ struct sk_buff *bluez_skb_alloc(unsigned int len, int how) +static inline struct sk_buff *bluez_skb_alloc(unsigned int len, int how) { struct sk_buff *skb; if ((skb = alloc_skb(len + BLUEZ_SKB_RESERVE, how))) { - bluez_cb(skb)->incomming = 0; - bluez_cb(skb)->fragmented = 0; skb_reserve(skb, BLUEZ_SKB_RESERVE); + bluez_cb(skb)->incomming = 0; } return skb; } -static __inline__ struct sk_buff *bluez_skb_clone(struct sk_buff *skb, int how) -{ - struct sk_buff *new; - - if ((new = skb_clone(skb, how))) - bluez_cb(new)->fragmented = 0; - return new; -} - -static __inline__ struct sk_buff *bluez_skb_send_alloc(struct sock *sk, unsigned long len, +static inline struct sk_buff *bluez_skb_send_alloc(struct sock *sk, unsigned long len, int nb, int *err) { struct sk_buff *skb; if ((skb = sock_alloc_send_skb(sk, len + BLUEZ_SKB_RESERVE, nb, err))) { - bluez_cb(skb)->incomming = 0; - bluez_cb(skb)->fragmented = 0; skb_reserve(skb, BLUEZ_SKB_RESERVE); + bluez_cb(skb)->incomming = 0; } return skb; } -static __inline__ int bluez_skb_frags(struct sk_buff *skb) -{ - if (bluez_cb(skb)->fragmented) - return skb_queue_len(&bluez_cb(skb)->frags); - return 0; -} - -static __inline__ void bluez_skb_add_frag(struct sk_buff *skb, struct sk_buff *frag) -{ - if (!bluez_cb(skb)->fragmented) { - skb_queue_head_init(&bluez_cb(skb)->frags); - bluez_cb(skb)->fragmented = 1; - } - __skb_queue_tail(&bluez_cb(skb)->frags, frag); -} - -static __inline__ struct sk_buff *bluez_skb_next_frag(struct sk_buff *skb) +static inline int skb_frags_no(struct sk_buff *skb) { - if (bluez_cb(skb)->fragmented) - return skb_peek(&bluez_cb(skb)->frags); - if (skb->next == (void *) skb->list) - return NULL; - return skb->next; -} - -static __inline__ struct sk_buff *bluez_skb_get_frag(struct sk_buff *skb) -{ - if (bluez_cb(skb)->fragmented) - return __skb_dequeue(&bluez_cb(skb)->frags); - return NULL; -} - -static __inline__ void bluez_skb_free(struct sk_buff *skb) -{ - if (bluez_cb(skb)->fragmented) - __skb_queue_purge(&bluez_cb(skb)->frags); - kfree_skb(skb); -} - -static __inline__ void bluez_skb_queue_purge(struct sk_buff_head *q) -{ - struct sk_buff *skb; + register struct sk_buff *frag = skb_shinfo(skb)->frag_list; + register int n = 1; - while((skb = skb_dequeue(q))) - bluez_skb_free(skb); + for (; frag; frag=frag->next, n++); + return n; } extern int hci_core_init(void); diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 3a017b9f878f..35320cc535ae 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h @@ -23,14 +23,60 @@ */ /* - * $Id: hci.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: hci.h,v 1.15 2001/08/05 06:02:15 maxk Exp $ */ -#ifndef __IF_HCI_H -#define __IF_HCI_H +#ifndef __HCI_H +#define __HCI_H #include <asm/byteorder.h> +#define HCI_MAX_DEV 8 +#define HCI_MAX_FRAME_SIZE 2048 + +/* HCI dev events */ +#define HCI_DEV_REG 1 +#define HCI_DEV_UNREG 2 +#define HCI_DEV_UP 3 +#define HCI_DEV_DOWN 4 + +/* HCI device types */ +#define HCI_UART 0 +#define HCI_USB 1 +#define HCI_VHCI 2 + +/* HCI device modes */ +#define HCI_NORMAL 0x0001 +#define HCI_RAW 0x0002 +#define HCI_MODE_MASK (HCI_NORMAL | HCI_RAW) +#define HCI_SOCK 0x1000 + +/* HCI device states */ +#define HCI_INIT 0x0010 +#define HCI_UP 0x0020 +#define HCI_RUNNING 0x0040 + +/* HCI device flags */ +#define HCI_PSCAN 0x0100 +#define HCI_ISCAN 0x0200 +#define HCI_AUTH 0x0400 + +/* HCI Ioctl defines */ +#define HCIDEVUP _IOW('H', 201, int) +#define HCIDEVDOWN _IOW('H', 202, int) +#define HCIDEVRESET _IOW('H', 203, int) +#define HCIRESETSTAT _IOW('H', 204, int) +#define HCIGETINFO _IOR('H', 205, int) +#define HCIGETDEVLIST _IOR('H', 206, int) +#define HCISETRAW _IOW('H', 207, int) +#define HCISETSCAN _IOW('H', 208, int) +#define HCISETAUTH _IOW('H', 209, int) +#define HCIINQUIRY _IOR('H', 210, int) +#define HCISETPTYPE _IOW('H', 211, int) +#define HCIGETCONNLIST _IOR('H', 212, int) + +#ifndef __NO_HCI_DEFS + /* HCI Packet types */ #define HCI_COMMAND_PKT 0x01 #define HCI_ACLDATA_PKT 0x02 @@ -38,51 +84,107 @@ #define HCI_EVENT_PKT 0x04 #define HCI_UNKNOWN_PKT 0xff +/* HCI Packet types */ +#define HCI_DM1 0x0008 +#define HCI_DM3 0x0400 +#define HCI_DM5 0x4000 +#define HCI_DH1 0x0010 +#define HCI_DH3 0x0800 +#define HCI_DH5 0x8000 + +/* ACL flags */ +#define ACL_CONT 0x0001 +#define ACL_START 0x0002 +#define ACL_ACTIVE_BCAST 0x0010 +#define ACL_PICO_BCAST 0x0020 + +/* Baseband links */ +#define SCO_LINK 0x00 +#define ACL_LINK 0x01 + +/* LMP features */ +#define LMP_3SLOT 0x01 +#define LMP_5SLOT 0x02 +#define LMP_ENCRYPT 0x04 +#define LMP_SOFFSET 0x08 +#define LMP_TACCURACY 0x10 +#define LMP_RSWITCH 0x20 +#define LMP_HOLD 0x40 +#define LMP_SNIF 0x80 + +#define LMP_PARK 0x01 +#define LMP_RSSI 0x02 +#define LMP_QUALITY 0x04 +#define LMP_SCO 0x08 +#define LMP_HV2 0x10 +#define LMP_HV3 0x20 +#define LMP_ULAW 0x40 +#define LMP_ALAW 0x80 + +#define LMP_CVSD 0x01 +#define LMP_PSCHEME 0x02 +#define LMP_PCONTROL 0x04 + /* ----- HCI Commands ----- */ /* OGF & OCF values */ /* Informational Parameters */ #define OGF_INFO_PARAM 0x04 -#define OCF_NOP 0x0000 -#define OCF_READ_BUFFER_SIZE 0x0005 +#define OCF_READ_LOCAL_VERSION 0x0001 +typedef struct { + __u8 status; + __u8 hci_ver; + __u16 hci_rev; + __u8 lmp_ver; + __u16 man_name; + __u16 lmp_sub; +} __attribute__ ((packed)) read_local_version_rp; + +#define OCF_READ_LOCAL_FEATURES 0x0003 +typedef struct { + __u8 status; + __u8 features[8]; +} __attribute__ ((packed)) read_local_features_rp; + +#define OCF_READ_BUFFER_SIZE 0x0005 typedef struct { __u8 status; __u16 acl_mtu; __u8 sco_mtu; __u16 acl_max_pkt; __u16 sco_max_pkt; -} __attribute__ ((packed)) read_buffer_size_rp; +} __attribute__ ((packed)) read_buffer_size_rp; -#define OCF_READ_BD_ADDR 0x0009 +#define OCF_READ_BD_ADDR 0x0009 typedef struct { __u8 status; bdaddr_t bdaddr; -} __attribute__ ((packed)) read_bd_addr_rp; +} __attribute__ ((packed)) read_bd_addr_rp; /* Host Controller and Baseband */ -#define OGF_HOST_CTL 0x03 -#define OCF_RESET 0x0003 +#define OGF_HOST_CTL 0x03 +#define OCF_RESET 0x0003 #define OCF_WRITE_AUTH_ENABLE 0x0020 #define AUTH_DISABLED 0x00 #define AUTH_ENABLED 0x01 -#define OCF_WRITE_CA_TIMEOUT 0x0016 /* Write_Connection_Accept_Timeout */ -#define OCF_WRITE_PG_TIMEOUT 0x0018 /* Write_Page_Timeout */ +#define OCF_WRITE_CA_TIMEOUT 0x0016 +#define OCF_WRITE_PG_TIMEOUT 0x0018 #define OCF_WRITE_SCAN_ENABLE 0x001A #define SCANS_DISABLED 0x00 - #define IS_ENA_PS_DIS 0x01 /* Inquiry scan enabled Page Scan disabled */ - #define IS_DIS_PS_ENA 0x02 /* Inquiry scan disabled Page Scan enabled */ - #define IS_ENA_PS_ENA 0x03 /* Inquiry scan enabled Page Scan enabled */ + #define IS_ENA_PS_DIS 0x01 + #define IS_DIS_PS_ENA 0x02 + #define IS_ENA_PS_ENA 0x03 #define OCF_SET_EVENT_FLT 0x0005 typedef struct { __u8 flt_type; __u8 cond_type; - __u8 condition; -} __attribute__ ((packed)) set_event_flt_cp; -#define SET_EVENT_FLT_CP_SIZE 3 + __u8 condition[0]; +} __attribute__ ((packed)) set_event_flt_cp; +#define SET_EVENT_FLT_CP_SIZE 2 /* Filter types */ #define FLT_CLEAR_ALL 0x00 @@ -96,7 +198,33 @@ typedef struct { /* CONN_SETUP Conditions */ #define CONN_SETUP_AUTO_OFF 0x01 -#define CONN_SETUP_AUTO_ON 0x02 +#define CONN_SETUP_AUTO_ON 0x02 + +#define OCF_CHANGE_LOCAL_NAME 0x0013 +typedef struct { + __u8 name[248]; +} __attribute__ ((packed)) change_local_name_cp; +#define CHANGE_LOCAL_NAME_CP_SIZE 248 + +#define OCF_READ_LOCAL_NAME 0x0014 +typedef struct { + __u8 status; + __u8 name[248]; +} __attribute__ ((packed)) read_local_name_rp; +#define READ_LOCAL_NAME_RP_SIZE 249 + +#define OCF_READ_CLASS_OF_DEV 0x0023 +typedef struct { + __u8 status; + __u8 dev_class[3]; +} __attribute__ ((packed)) read_class_of_dev_rp; +#define READ_CLASS_OF_DEV_RP_SIZE 4 + +#define OCF_WRITE_CLASS_OF_DEV 0x0024 +typedef struct { + __u8 dev_class[3]; +} __attribute__ ((packed)) write_class_of_dev_cp; +#define WRITE_CLASS_OF_DEV_CP_SIZE 3 /* Link Control */ #define OGF_LINK_CTL 0x01 @@ -108,30 +236,30 @@ typedef struct { __u8 pscan_mode; __u16 clock_offset; __u8 role_switch; -} __attribute__ ((packed)) create_conn_cp; -#define CREATE_CONN_CP_SIZE 13 +} __attribute__ ((packed)) create_conn_cp; +#define CREATE_CONN_CP_SIZE 13 #define OCF_ACCEPT_CONN_REQ 0x0009 typedef struct { bdaddr_t bdaddr; __u8 role; -} __attribute__ ((packed)) accept_conn_req_cp; -#define ACCEPT_CONN_REQ_CP_SIZE 7 +} __attribute__ ((packed)) accept_conn_req_cp; +#define ACCEPT_CONN_REQ_CP_SIZE 7 #define OCF_DISCONNECT 0x0006 typedef struct { __u16 handle; __u8 reason; -} __attribute__ ((packed)) disconnect_cp; -#define DISCONNECT_CP_SIZE 3 +} __attribute__ ((packed)) disconnect_cp; +#define DISCONNECT_CP_SIZE 3 #define OCF_INQUIRY 0x0001 typedef struct { __u8 lap[3]; __u8 lenght; __u8 num_rsp; -} __attribute__ ((packed)) inquiry_cp; -#define INQUIRY_CP_SIZE 5 +} __attribute__ ((packed)) inquiry_cp; +#define INQUIRY_CP_SIZE 5 #define OGF_LINK_POLICY 0x02 /* Link Policy */ @@ -146,8 +274,8 @@ typedef struct { __u8 pscan_mode; __u8 class[3]; __u16 clock_offset; -} __attribute__ ((packed)) inquiry_info; -#define INQUIRY_INFO_SIZE 14 +} __attribute__ ((packed)) inquiry_info; +#define INQUIRY_INFO_SIZE 14 #define EVT_CONN_COMPLETE 0x03 typedef struct { @@ -156,58 +284,53 @@ typedef struct { bdaddr_t bdaddr; __u8 link_type; __u8 encr_mode; -} __attribute__ ((packed)) evt_conn_complete; -#define EVT_CONN_COMPLETE_SIZE 13 +} __attribute__ ((packed)) evt_conn_complete; +#define EVT_CONN_COMPLETE_SIZE 13 #define EVT_CONN_REQUEST 0x04 typedef struct { bdaddr_t bdaddr; -#if defined (__LITTLE_ENDIAN_BITFIELD) - __u32 class :24; - __u32 type :8; -#else /* (__BIG_ENDIAN_BITFIELD) */ - __u32 type :8; - __u32 class :24; -#endif -} __attribute__ ((packed)) evt_conn_request; -#define EVT_CONN_REQUEST_SIZE 10 + __u8 dev_class[3]; + __u8 link_type; +} __attribute__ ((packed)) evt_conn_request; +#define EVT_CONN_REQUEST_SIZE 10 #define EVT_DISCONN_COMPLETE 0x05 typedef struct { __u8 status; __u16 handle; __u8 reason; -} __attribute__ ((packed)) evt_disconn_complete; -#define EVT_DISCONN_COMPLETE_SIZE 4 +} __attribute__ ((packed)) evt_disconn_complete; +#define EVT_DISCONN_COMPLETE_SIZE 4 #define EVT_CMD_COMPLETE 0x0e typedef struct { __u8 ncmd; __u16 opcode; -} __attribute__ ((packed)) evt_cmd_complete; -#define EVT_CMD_COMPLETE_SIZE 3 +} __attribute__ ((packed)) evt_cmd_complete; +#define EVT_CMD_COMPLETE_SIZE 3 #define EVT_CMD_STATUS 0x0f typedef struct { __u8 status; __u8 ncmd; __u16 opcode; -} __attribute__ ((packed)) evt_cmd_status; -#define EVT_CMD_STATUS_SIZE 4 +} __attribute__ ((packed)) evt_cmd_status; +#define EVT_CMD_STATUS_SIZE 4 #define EVT_NUM_COMP_PKTS 0x13 typedef struct { __u8 num_hndl; /* variable lenght part */ -} __attribute__ ((packed)) evt_num_comp_pkts; -#define EVT_NUM_COMP_PKTS_SIZE 1 +} __attribute__ ((packed)) evt_num_comp_pkts; +#define EVT_NUM_COMP_PKTS_SIZE 1 #define EVT_HCI_DEV_EVENT 0xfd typedef struct { __u16 event; __u16 param; -} __attribute__ ((packed)) evt_hci_dev_event; -#define EVT_HCI_DEV_EVENT_SIZE 4 +} __attribute__ ((packed)) evt_hci_dev_event; +#define EVT_HCI_DEV_EVENT_SIZE 4 /* -------- HCI Packet structures -------- */ #define HCI_TYPE_LEN 1 @@ -237,78 +360,35 @@ typedef struct { #define HCI_SCO_HDR_SIZE 3 /* Command opcode pack/unpack */ -#define cmd_opcode_pack(ocf, ogf) (__u16)((ocf & 0x03ff)|(ogf << 10)) +#define cmd_opcode_pack(ogf, ocf) (__u16)((ocf & 0x03ff)|(ogf << 10)) #define cmd_opcode_ogf(op) (op >> 10) #define cmd_opcode_ocf(op) (op & 0x03ff) /* ACL handle and flags pack/unpack */ #define acl_handle_pack(h, f) (__u16)((h & 0x0fff)|(f << 12)) -#define acl_handle(h) (h & 0x0fff) -#define acl_flags(h) (h >> 12) - -/* ACL flags */ -#define ACL_CONT 0x0001 -#define ACL_START 0x0002 -#define ACL_ACTIVE_BCAST 0x0010 -#define ACL_PICO_BCAST 0x0020 - -/* Max frame size */ -#define HCI_MAX_FRAME 4096 - -/* HCI device types */ -#define HCI_UART 0 -#define HCI_USB 1 -#define HCI_EMU 2 - -/* HCI device modes */ -#define HCI_NORMAL 0x0001 -#define HCI_RAW 0x0002 -#define HCI_MODE_MASK (HCI_NORMAL | HCI_RAW) -#define HCI_SOCK 0x1000 - -/* HCI device states */ -#define HCI_INIT 0x0010 -#define HCI_UP 0x0020 -#define HCI_RUNNING 0x0040 - -/* HCI device flags */ -#define HCI_PSCAN 0x0100 -#define HCI_ISCAN 0x0200 -#define HCI_AUTH 0x0400 - -/* HCI Packet types */ -#define HCI_DM1 0x0008 -#define HCI_DM3 0x0400 -#define HCI_DM5 0x4000 -#define HCI_DH1 0x0010 -#define HCI_DH3 0x0800 -#define HCI_DH5 0x8000 +#define acl_handle(h) (h & 0x0fff) +#define acl_flags(h) (h >> 12) -/* HCI Ioctl defines */ -#define HCIDEVUP _IOW('H', 201, int) -#define HCIDEVDOWN _IOW('H', 202, int) -#define HCIDEVRESET _IOW('H', 203, int) -#define HCIRESETSTAT _IOW('H', 204, int) -#define HCIGETINFO _IOR('H', 205, int) -#define HCIGETDEVLIST _IOR('H', 206, int) -#define HCISETRAW _IOW('H', 207, int) -#define HCISETSCAN _IOW('H', 208, int) -#define HCISETAUTH _IOW('H', 209, int) -#define HCIINQUIRY _IOWR('H', 210, int) +#endif /* _NO_HCI_DEFS */ /* HCI Socket options */ #define HCI_DATA_DIR 0x0001 #define HCI_FILTER 0x0002 -/* HCI CMSG types */ +/* HCI CMSG flags */ #define HCI_CMSG_DIR 0x0001 struct sockaddr_hci { - sa_family_t hci_family; - unsigned short hci_dev; + sa_family_t hci_family; + unsigned short hci_dev; }; #define HCI_DEV_NONE 0xffff +struct hci_filter { + __u32 type_mask; + __u32 event_mask[2]; +}; + struct hci_dev_req { __u16 dev_id; __u32 dev_opt; @@ -345,26 +425,32 @@ struct hci_dev_info { __u16 dev_id; char name[8]; + bdaddr_t bdaddr; + __u32 flags; __u8 type; + __u8 features[8]; + + __u32 pkt_type; + __u16 acl_mtu; __u16 acl_max; __u16 sco_mtu; __u16 sco_max; - bdaddr_t bdaddr; - struct hci_dev_stats stat; }; -/* Number of devices */ -#define HCI_MAX_DEV 8 +struct hci_conn_info { + __u16 handle; + bdaddr_t bdaddr; +}; -/* HCI dev events */ -#define HCI_DEV_REG 1 -#define HCI_DEV_UNREG 2 -#define HCI_DEV_UP 3 -#define HCI_DEV_DOWN 4 +struct hci_conn_list_req { + __u16 dev_id; + __u16 conn_num; + struct hci_conn_info conn_info[0]; +}; -#endif /* __IF_HCI_H */ +#endif /* __HCI_H */ diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 01fb3a98b32a..1c60de44dea7 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -23,13 +23,13 @@ */ /* - * $Id: hci_core.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: hci_core.h,v 1.11 2001/08/05 06:02:15 maxk Exp $ */ -#ifndef __IF_HCI_CORE_H -#define __IF_HCI_CORE_H +#ifndef __HCI_CORE_H +#define __HCI_CORE_H -#include "hci.h" +#include <net/bluetooth/hci.h> /* HCI upper protocols */ #define HCI_MAX_PROTO 1 @@ -53,155 +53,132 @@ struct inquiry_cache { struct inquiry_entry *list; }; -static __inline__ void inquiry_cache_init(struct inquiry_cache *cache) +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) +static inline void inquiry_cache_lock(struct inquiry_cache *cache) { spin_lock(&cache->lock); } -static __inline__ void inquiry_cache_unlock(struct inquiry_cache *cache) +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) +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) +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) +static inline long inquiry_cache_age(struct inquiry_cache *cache) { return jiffies - cache->timestamp; } -static __inline__ long inquiry_entry_age(struct inquiry_entry *e) +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 +struct hci_dev; + +/* ----- HCI Connections ----- */ +struct hci_conn { + struct list_head list; + bdaddr_t dst; + __u16 handle; + __u8 type; + unsigned int sent; + + struct hci_dev *hdev; + void *l2cap_data; + void *priv; + + struct sk_buff_head data_q; +}; -/* 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]; + struct list_head list; + spinlock_t lock; + unsigned int num; }; -static __inline__ void conn_hash_init(struct conn_hash *h) +static inline void conn_hash_init(struct conn_hash *h) { - memset(h, 0, sizeof(struct conn_hash)); + INIT_LIST_HEAD(&h->list); spin_lock_init(&h->lock); + h->num = 0; } -static __inline__ void conn_hash_lock(struct conn_hash *h) +static inline void conn_hash_lock(struct conn_hash *h) { spin_lock(&h->lock); } -static __inline__ void conn_hash_unlock(struct conn_hash *h) +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) +static inline void __conn_hash_add(struct conn_hash *h, __u16 handle, struct hci_conn *c) { - if (!h->conn[handle]) { - h->conn[handle] = conn; - h->num++; - return conn; - } else - return NULL; + list_add(&c->list, &h->list); + h->num++; } -static __inline__ void *conn_hash_add(struct conn_hash *h, __u16 handle, void *conn) +static inline void conn_hash_add(struct conn_hash *h, __u16 handle, struct hci_conn *c) { - if (handle >= HCI_MAX_CONN) - return NULL; - conn_hash_lock(h); - conn = __conn_hash_add(h, handle, conn); + __conn_hash_add(h, handle, c); conn_hash_unlock(h); - - return conn; } -static __inline__ void *__conn_hash_del(struct conn_hash *h, __u16 handle) +static inline void __conn_hash_del(struct conn_hash *h, struct hci_conn *c) { - void *conn = h->conn[handle]; - - if (conn) { - h->conn[handle] = NULL; - h->num--; - return conn; - } else - return NULL; + list_del(&c->list); + h->num--; } -static __inline__ void *conn_hash_del(struct conn_hash *h, __u16 handle) +static inline void conn_hash_del(struct conn_hash *h, struct hci_conn *c) { - void *conn; - - if (handle >= HCI_MAX_CONN) - return NULL; conn_hash_lock(h); - conn = __conn_hash_del(h, handle); + __conn_hash_del(h, c); conn_hash_unlock(h); - - return conn; } -static __inline__ void *__conn_hash_lookup(struct conn_hash *h, __u16 handle) +static inline struct hci_conn *__conn_hash_lookup(struct conn_hash *h, __u16 handle) { - return h->conn[handle]; + register struct list_head *p; + register struct hci_conn *c; + + list_for_each(p, &h->list) { + c = list_entry(p, struct hci_conn, list); + if (c->handle == handle) + return c; + } + return NULL; } -static __inline__ void *conn_hash_lookup(struct conn_hash *h, __u16 handle) +static inline struct hci_conn *conn_hash_lookup(struct conn_hash *h, __u16 handle) { - void *conn; - - if (handle >= HCI_MAX_CONN) - return NULL; + struct hci_conn *conn; 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; @@ -211,6 +188,9 @@ struct hci_dev { __u16 id; __u8 type; bdaddr_t bdaddr; + __u8 features[8]; + + __u16 pkt_type; atomic_t cmd_cnt; unsigned int acl_cnt; @@ -232,7 +212,8 @@ struct hci_dev { struct sk_buff_head rx_q; struct sk_buff_head raw_q; struct sk_buff_head cmd_q; - struct sk_buff *cmd_sent; + + struct sk_buff *sent_cmd; struct semaphore req_lock; wait_queue_head_t req_wait_q; @@ -251,20 +232,17 @@ struct hci_dev { int (*send)(struct sk_buff *skb); }; -static __inline__ void hci_dev_hold(struct hci_dev *hdev) +static inline void hci_dev_hold(struct hci_dev *hdev) { atomic_inc(&hdev->refcnt); } -static __inline__ void hci_dev_put(struct hci_dev *hdev) +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); @@ -275,6 +253,8 @@ 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_dev_setptype(unsigned long arg); +extern int hci_conn_list(unsigned long arg); extern int hci_inquiry(unsigned long arg); extern __u32 hci_dev_setmode(struct hci_dev *hdev, __u32 mode); @@ -282,18 +262,21 @@ extern __u32 hci_dev_getmode(struct hci_dev *hdev); extern int hci_recv_frame(struct sk_buff *skb); +/* ----- LMP capabilities ----- */ +#define lmp_rswitch_capable(dev) (dev->features[0] & LMP_RSWITCH) + /* ----- HCI tasks ----- */ -static __inline__ void hci_sched_cmd(struct hci_dev *hdev) +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) +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) +static inline void hci_sched_tx(struct hci_dev *hdev) { tasklet_schedule(&hdev->tx_task); } @@ -330,9 +313,9 @@ 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; + struct hci_dev *hdev; + struct hci_filter filter; + __u32 cmsg_mask; }; /* ----- HCI requests ----- */ @@ -340,4 +323,4 @@ struct hci_pinfo { #define HCI_REQ_PEND 1 #define HCI_REQ_CANCELED 2 -#endif /* __IF_HCI_CORE_H */ +#endif /* __HCI_CORE_H */ diff --git a/include/net/bluetooth/hci_uart.h b/include/net/bluetooth/hci_uart.h index f9d6c4f8e712..8d1ca8118d31 100644 --- a/include/net/bluetooth/hci_uart.h +++ b/include/net/bluetooth/hci_uart.h @@ -23,10 +23,12 @@ */ /* - * $Id: hci_uart.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: hci_uart.h,v 1.2 2001/06/02 01:40:08 maxk Exp $ */ -#define HCI_MAX_READ 2048 +#ifndef N_HCI +#define N_HCI 15 +#endif #ifdef __KERNEL__ diff --git a/include/net/bluetooth/hci_usb.h b/include/net/bluetooth/hci_usb.h index e5dcfb1933e9..348b4d49ea7d 100644 --- a/include/net/bluetooth/hci_usb.h +++ b/include/net/bluetooth/hci_usb.h @@ -23,13 +23,11 @@ */ /* - * $Id: hci_usb.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: hci_usb.h,v 1.3 2001/06/02 01:40:08 maxk Exp $ */ #ifdef __KERNEL__ -#define HCI_USB_MAX_READ 2048 - /* Class, SubClass, and Protocol codes that describe a Bluetooth device */ #define HCI_DEV_CLASS 0xe0 /* Wireless class */ #define HCI_DEV_SUBCLASS 0x01 /* RF subclass */ diff --git a/include/net/bluetooth/hci_emu.h b/include/net/bluetooth/hci_vhci.h index d349ba85621f..e448c3a79e5f 100644 --- a/include/net/bluetooth/hci_emu.h +++ b/include/net/bluetooth/hci_vhci.h @@ -23,15 +23,15 @@ */ /* - * $Id: hci_emu.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: hci_vhci.h,v 1.2 2001/08/01 01:02:20 maxk Exp $ */ -#ifndef __IF_HCI_EMU_H -#define __IF_HCI_EMU_H +#ifndef __HCI_VHCI_H +#define __HCI_VHCI_H #ifdef __KERNEL__ -struct hci_emu_struct { +struct hci_vhci_struct { struct hci_dev hdev; __u32 flags; wait_queue_head_t read_wait; @@ -39,14 +39,12 @@ struct hci_emu_struct { struct fasync_struct *fasync; }; -#endif /* __KERNEL__ */ - -#define HCI_EMU_MINOR 250 +/* VHCI device flags */ +#define VHCI_FASYNC 0x0010 -/* Max frame size */ -#define HCI_EMU_MAX_FRAME 4096 +#endif /* __KERNEL__ */ -/* HCI_EMU device flags */ -#define HCI_EMU_FASYNC 0x0010 +#define VHCI_DEV "/dev/vhci" +#define VHCI_MINOR 250 -#endif /* __IF_HCI_EMU_H */ +#endif /* __HCI_VHCI_H */ diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index a9d7db05d83c..b3535653e4e6 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -23,7 +23,7 @@ */ /* - * $Id: l2cap.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: l2cap.h,v 1.5 2001/06/14 21:28:26 maxk Exp $ */ #ifndef __L2CAP_H @@ -32,6 +32,14 @@ #include <asm/types.h> #include <asm/byteorder.h> +/* L2CAP defaults */ +#define L2CAP_DEFAULT_MTU 672 +#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF + +#define L2CAP_CONN_TIMEOUT (HZ * 40) +#define L2CAP_DISCONN_TIMEOUT (HZ * 2) +#define L2CAP_CONN_IDLE_TIMEOUT (HZ * 60) + /* L2CAP socket address */ struct sockaddr_l2 { sa_family_t l2_family; @@ -52,11 +60,10 @@ struct l2cap_options { __u32 delay_var; }; -/* L2CAP defaults */ -#define L2CAP_DEFAULT_MTU 672 -#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF - -#define L2CAP_CONN_TIMEOUT (HZ * 40) +#define L2CAP_CONNINFO 0x02 +struct l2cap_conninfo { + __u16 hci_handle; +}; /* L2CAP command codes */ #define L2CAP_COMMAND_REJ 0x01 diff --git a/include/net/bluetooth/l2cap_core.h b/include/net/bluetooth/l2cap_core.h index f4efcd94a41f..61da5097f118 100644 --- a/include/net/bluetooth/l2cap_core.h +++ b/include/net/bluetooth/l2cap_core.h @@ -23,7 +23,7 @@ */ /* - * $Id: l2cap_core.h,v 1.1 2001/06/01 08:12:11 davem Exp $ + * $Id: l2cap_core.h,v 1.6 2001/08/03 04:19:49 maxk Exp $ */ #ifndef __L2CAP_CORE_H @@ -41,12 +41,12 @@ struct l2cap_iff { struct list_head conn_list; }; -static __inline__ void l2cap_iff_lock(struct l2cap_iff *iff) +static inline void l2cap_iff_lock(struct l2cap_iff *iff) { spin_lock(&iff->lock); } -static __inline__ void l2cap_iff_unlock(struct l2cap_iff *iff) +static inline void l2cap_iff_unlock(struct l2cap_iff *iff) { spin_unlock(&iff->lock); } @@ -78,14 +78,16 @@ struct l2cap_conn { __u8 tx_ident; struct l2cap_chan_list chan_list; + + struct timer_list timer; }; -static __inline__ void __l2cap_conn_link(struct l2cap_iff *iff, struct l2cap_conn *c) +static inline void __l2cap_conn_link(struct l2cap_iff *iff, struct l2cap_conn *c) { list_add(&c->list, &iff->conn_list); } -static __inline__ void __l2cap_conn_unlink(struct l2cap_iff *iff, struct l2cap_conn *c) +static inline void __l2cap_conn_unlink(struct l2cap_iff *iff, struct l2cap_conn *c) { list_del(&c->list); } @@ -126,9 +128,9 @@ struct l2cap_pinfo { struct l2cap_accept_q accept_q; }; -#define CONF_INPUT 0x01 -#define CONF_OUTPUT 0x02 -#define CONF_DONE (CONF_INPUT | CONF_OUTPUT) +#define CONF_REQ_SENT 0x01 +#define CONF_INPUT_DONE 0x02 +#define CONF_OUTPUT_DONE 0x04 extern struct bluez_sock_list l2cap_sk_list; extern struct list_head l2cap_iff_list; |
