Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
bb400801
Commit
bb400801
authored
Jun 11, 2009
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-next-2.6
parents
130aa61a
611b30f7
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
184 additions
and
155 deletions
+184
-155
drivers/bluetooth/hci_vhci.c
drivers/bluetooth/hci_vhci.c
+19
-71
include/net/bluetooth/bluetooth.h
include/net/bluetooth/bluetooth.h
+0
-6
include/net/bluetooth/hci_core.h
include/net/bluetooth/hci_core.h
+2
-0
include/net/bluetooth/l2cap.h
include/net/bluetooth/l2cap.h
+50
-21
net/bluetooth/hci_core.c
net/bluetooth/hci_core.c
+40
-1
net/bluetooth/l2cap.c
net/bluetooth/l2cap.c
+67
-50
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/core.c
+6
-6
No files found.
drivers/bluetooth/hci_vhci.c
View file @
bb400801
...
...
@@ -40,7 +40,7 @@
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
#define VERSION "1.
2
"
#define VERSION "1.
3
"
static
int
minor
=
MISC_DYNAMIC_MINOR
;
...
...
@@ -51,14 +51,8 @@ struct vhci_data {
wait_queue_head_t
read_wait
;
struct
sk_buff_head
readq
;
struct
fasync_struct
*
fasync
;
};
#define VHCI_FASYNC 0x0010
static
struct
miscdevice
vhci_miscdev
;
static
int
vhci_open_dev
(
struct
hci_dev
*
hdev
)
{
set_bit
(
HCI_RUNNING
,
&
hdev
->
flags
);
...
...
@@ -105,9 +99,6 @@ static int vhci_send_frame(struct sk_buff *skb)
memcpy
(
skb_push
(
skb
,
1
),
&
bt_cb
(
skb
)
->
pkt_type
,
1
);
skb_queue_tail
(
&
data
->
readq
,
skb
);
if
(
data
->
flags
&
VHCI_FASYNC
)
kill_fasync
(
&
data
->
fasync
,
SIGIO
,
POLL_IN
);
wake_up_interruptible
(
&
data
->
read_wait
);
return
0
;
...
...
@@ -179,41 +170,31 @@ static inline ssize_t vhci_put_user(struct vhci_data *data,
static
ssize_t
vhci_read
(
struct
file
*
file
,
char
__user
*
buf
,
size_t
count
,
loff_t
*
pos
)
{
DECLARE_WAITQUEUE
(
wait
,
current
);
struct
vhci_data
*
data
=
file
->
private_data
;
struct
sk_buff
*
skb
;
ssize_t
ret
=
0
;
add_wait_queue
(
&
data
->
read_wait
,
&
wait
);
while
(
count
)
{
set_current_state
(
TASK_INTERRUPTIBLE
);
skb
=
skb_dequeue
(
&
data
->
readq
);
if
(
!
skb
)
{
if
(
file
->
f_flags
&
O_NONBLOCK
)
{
ret
=
-
EAGAIN
;
break
;
}
if
(
signal_pending
(
current
))
{
ret
=
-
ERESTARTSYS
;
break
;
}
schedule
();
continue
;
if
(
skb
)
{
ret
=
vhci_put_user
(
data
,
skb
,
buf
,
count
);
if
(
ret
<
0
)
skb_queue_head
(
&
data
->
readq
,
skb
);
else
kfree_skb
(
skb
);
break
;
}
if
(
access_ok
(
VERIFY_WRITE
,
buf
,
count
))
ret
=
vhci_put_user
(
data
,
skb
,
buf
,
count
)
;
else
ret
=
-
EFAULT
;
if
(
file
->
f_flags
&
O_NONBLOCK
)
{
ret
=
-
EAGAIN
;
break
;
}
kfree_skb
(
skb
);
break
;
ret
=
wait_event_interruptible
(
data
->
read_wait
,
!
skb_queue_empty
(
&
data
->
readq
));
if
(
ret
<
0
)
break
;
}
set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
&
data
->
read_wait
,
&
wait
);
return
ret
;
}
...
...
@@ -223,9 +204,6 @@ static ssize_t vhci_write(struct file *file,
{
struct
vhci_data
*
data
=
file
->
private_data
;
if
(
!
access_ok
(
VERIFY_READ
,
buf
,
count
))
return
-
EFAULT
;
return
vhci_get_user
(
data
,
buf
,
count
);
}
...
...
@@ -259,11 +237,9 @@ static int vhci_open(struct inode *inode, struct file *file)
skb_queue_head_init
(
&
data
->
readq
);
init_waitqueue_head
(
&
data
->
read_wait
);
lock_kernel
();
hdev
=
hci_alloc_dev
();
if
(
!
hdev
)
{
kfree
(
data
);
unlock_kernel
();
return
-
ENOMEM
;
}
...
...
@@ -284,12 +260,10 @@ static int vhci_open(struct inode *inode, struct file *file)
BT_ERR
(
"Can't register HCI device"
);
kfree
(
data
);
hci_free_dev
(
hdev
);
unlock_kernel
();
return
-
EBUSY
;
}
file
->
private_data
=
data
;
unlock_kernel
();
return
nonseekable_open
(
inode
,
file
);
}
...
...
@@ -310,48 +284,25 @@ static int vhci_release(struct inode *inode, struct file *file)
return
0
;
}
static
int
vhci_fasync
(
int
fd
,
struct
file
*
file
,
int
on
)
{
struct
vhci_data
*
data
=
file
->
private_data
;
int
err
=
0
;
lock_kernel
();
err
=
fasync_helper
(
fd
,
file
,
on
,
&
data
->
fasync
);
if
(
err
<
0
)
goto
out
;
if
(
on
)
data
->
flags
|=
VHCI_FASYNC
;
else
data
->
flags
&=
~
VHCI_FASYNC
;
out:
unlock_kernel
();
return
err
;
}
static
const
struct
file_operations
vhci_fops
=
{
.
owner
=
THIS_MODULE
,
.
read
=
vhci_read
,
.
write
=
vhci_write
,
.
poll
=
vhci_poll
,
.
ioctl
=
vhci_ioctl
,
.
open
=
vhci_open
,
.
release
=
vhci_release
,
.
fasync
=
vhci_fasync
,
};
static
struct
miscdevice
vhci_miscdev
=
{
.
name
=
"vhci"
,
.
fops
=
&
vhci_fops
,
.
name
=
"vhci"
,
.
fops
=
&
vhci_fops
,
.
minor
=
MISC_DYNAMIC_MINOR
,
};
static
int
__init
vhci_init
(
void
)
{
BT_INFO
(
"Virtual HCI driver ver %s"
,
VERSION
);
vhci_miscdev
.
minor
=
minor
;
if
(
misc_register
(
&
vhci_miscdev
)
<
0
)
{
BT_ERR
(
"Can't register misc device with minor %d"
,
minor
);
return
-
EIO
;
...
...
@@ -369,9 +320,6 @@ static void __exit vhci_exit(void)
module_init
(
vhci_init
);
module_exit
(
vhci_exit
);
module_param
(
minor
,
int
,
0444
);
MODULE_PARM_DESC
(
minor
,
"Miscellaneous minor device number"
);
MODULE_AUTHOR
(
"Marcel Holtmann <marcel@holtmann.org>"
);
MODULE_DESCRIPTION
(
"Bluetooth virtual HCI driver ver "
VERSION
);
MODULE_VERSION
(
VERSION
);
...
...
include/net/bluetooth/bluetooth.h
View file @
bb400801
...
...
@@ -81,12 +81,6 @@ 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
];
...
...
include/net/bluetooth/hci_core.h
View file @
bb400801
...
...
@@ -137,6 +137,8 @@ struct hci_dev {
struct
device
*
parent
;
struct
device
dev
;
struct
rfkill
*
rfkill
;
struct
module
*
owner
;
int
(
*
open
)(
struct
hci_dev
*
hdev
);
...
...
include/net/bluetooth/l2cap.h
View file @
bb400801
...
...
@@ -26,8 +26,13 @@
#define __L2CAP_H
/* L2CAP defaults */
#define L2CAP_DEFAULT_MTU 672
#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF
#define L2CAP_DEFAULT_MTU 672
#define L2CAP_DEFAULT_FLUSH_TO 0xffff
#define L2CAP_DEFAULT_RX_WINDOW 1
#define L2CAP_DEFAULT_MAX_RECEIVE 1
#define L2CAP_DEFAULT_RETRANS_TO 300
/* 300 milliseconds */
#define L2CAP_DEFAULT_MONITOR_TO 1000
/* 1 second */
#define L2CAP_DEFAULT_MAX_RX_APDU 0xfff7
#define L2CAP_CONN_TIMEOUT (40000)
/* 40 seconds */
#define L2CAP_INFO_TIMEOUT (4000)
/* 4 seconds */
...
...
@@ -64,17 +69,29 @@ struct l2cap_conninfo {
#define L2CAP_LM_SECURE 0x0020
/* L2CAP command codes */
#define L2CAP_COMMAND_REJ 0x01
#define L2CAP_CONN_REQ 0x02
#define L2CAP_CONN_RSP 0x03
#define L2CAP_CONF_REQ 0x04
#define L2CAP_CONF_RSP 0x05
#define L2CAP_DISCONN_REQ 0x06
#define L2CAP_DISCONN_RSP 0x07
#define L2CAP_ECHO_REQ 0x08
#define L2CAP_ECHO_RSP 0x09
#define L2CAP_INFO_REQ 0x0a
#define L2CAP_INFO_RSP 0x0b
#define L2CAP_COMMAND_REJ 0x01
#define L2CAP_CONN_REQ 0x02
#define L2CAP_CONN_RSP 0x03
#define L2CAP_CONF_REQ 0x04
#define L2CAP_CONF_RSP 0x05
#define L2CAP_DISCONN_REQ 0x06
#define L2CAP_DISCONN_RSP 0x07
#define L2CAP_ECHO_REQ 0x08
#define L2CAP_ECHO_RSP 0x09
#define L2CAP_INFO_REQ 0x0a
#define L2CAP_INFO_RSP 0x0b
/* L2CAP feature mask */
#define L2CAP_FEAT_FLOWCTL 0x00000001
#define L2CAP_FEAT_RETRANS 0x00000002
#define L2CAP_FEAT_ERTM 0x00000008
#define L2CAP_FEAT_STREAMING 0x00000010
#define L2CAP_FEAT_FCS 0x00000020
#define L2CAP_FEAT_FIXED_CHAN 0x00000080
/* L2CAP checksum option */
#define L2CAP_FCS_NONE 0x00
#define L2CAP_FCS_CRC16 0x01
/* L2CAP structures */
struct
l2cap_hdr
{
...
...
@@ -106,17 +123,23 @@ struct l2cap_conn_rsp {
__le16
status
;
}
__attribute__
((
packed
));
/* channel indentifier */
#define L2CAP_CID_SIGNALING 0x0001
#define L2CAP_CID_CONN_LESS 0x0002
#define L2CAP_CID_DYN_START 0x0040
#define L2CAP_CID_DYN_END 0xffff
/* connect result */
#define L2CAP_CR_SUCCESS
0x0000
#define L2CAP_CR_PEND
0x0001
#define L2CAP_CR_BAD_PSM
0x0002
#define L2CAP_CR_SEC_BLOCK
0x0003
#define L2CAP_CR_NO_MEM
0x0004
#define L2CAP_CR_SUCCESS
0x0000
#define L2CAP_CR_PEND
0x0001
#define L2CAP_CR_BAD_PSM
0x0002
#define L2CAP_CR_SEC_BLOCK
0x0003
#define L2CAP_CR_NO_MEM
0x0004
/* connect status */
#define L2CAP_CS_NO_INFO
0x0000
#define L2CAP_CS_AUTHEN_PEND
0x0001
#define L2CAP_CS_AUTHOR_PEND
0x0002
#define L2CAP_CS_NO_INFO
0x0000
#define L2CAP_CS_AUTHEN_PEND
0x0001
#define L2CAP_CS_AUTHOR_PEND
0x0002
struct
l2cap_conf_req
{
__le16
dcid
;
...
...
@@ -143,10 +166,14 @@ struct l2cap_conf_opt {
}
__attribute__
((
packed
));
#define L2CAP_CONF_OPT_SIZE 2
#define L2CAP_CONF_HINT 0x80
#define L2CAP_CONF_MASK 0x7f
#define L2CAP_CONF_MTU 0x01
#define L2CAP_CONF_FLUSH_TO 0x02
#define L2CAP_CONF_QOS 0x03
#define L2CAP_CONF_RFC 0x04
#define L2CAP_CONF_FCS 0x05
#define L2CAP_CONF_MAX_SIZE 22
...
...
@@ -162,6 +189,8 @@ struct l2cap_conf_rfc {
#define L2CAP_MODE_BASIC 0x00
#define L2CAP_MODE_RETRANS 0x01
#define L2CAP_MODE_FLOWCTL 0x02
#define L2CAP_MODE_ERTM 0x03
#define L2CAP_MODE_STREAM 0x04
struct
l2cap_disconn_req
{
__le16
dcid
;
...
...
net/bluetooth/hci_core.c
View file @
bb400801
...
...
@@ -39,6 +39,7 @@
#include <linux/skbuff.h>
#include <linux/interrupt.h>
#include <linux/notifier.h>
#include <linux/rfkill.h>
#include <net/sock.h>
#include <asm/system.h>
...
...
@@ -476,6 +477,11 @@ int hci_dev_open(__u16 dev)
hci_req_lock
(
hdev
);
if
(
hdev
->
rfkill
&&
rfkill_blocked
(
hdev
->
rfkill
))
{
ret
=
-
ERFKILL
;
goto
done
;
}
if
(
test_bit
(
HCI_UP
,
&
hdev
->
flags
))
{
ret
=
-
EALREADY
;
goto
done
;
...
...
@@ -813,6 +819,24 @@ int hci_get_dev_info(void __user *arg)
/* ---- Interface to HCI drivers ---- */
static
int
hci_rfkill_set_block
(
void
*
data
,
bool
blocked
)
{
struct
hci_dev
*
hdev
=
data
;
BT_DBG
(
"%p name %s blocked %d"
,
hdev
,
hdev
->
name
,
blocked
);
if
(
!
blocked
)
return
0
;
hci_dev_do_close
(
hdev
);
return
0
;
}
static
const
struct
rfkill_ops
hci_rfkill_ops
=
{
.
set_block
=
hci_rfkill_set_block
,
};
/* Alloc HCI device */
struct
hci_dev
*
hci_alloc_dev
(
void
)
{
...
...
@@ -844,7 +868,8 @@ int hci_register_dev(struct hci_dev *hdev)
struct
list_head
*
head
=
&
hci_dev_list
,
*
p
;
int
i
,
id
=
0
;
BT_DBG
(
"%p name %s type %d owner %p"
,
hdev
,
hdev
->
name
,
hdev
->
type
,
hdev
->
owner
);
BT_DBG
(
"%p name %s type %d owner %p"
,
hdev
,
hdev
->
name
,
hdev
->
type
,
hdev
->
owner
);
if
(
!
hdev
->
open
||
!
hdev
->
close
||
!
hdev
->
destruct
)
return
-
EINVAL
;
...
...
@@ -900,6 +925,15 @@ int hci_register_dev(struct hci_dev *hdev)
hci_register_sysfs
(
hdev
);
hdev
->
rfkill
=
rfkill_alloc
(
hdev
->
name
,
&
hdev
->
dev
,
RFKILL_TYPE_BLUETOOTH
,
&
hci_rfkill_ops
,
hdev
);
if
(
hdev
->
rfkill
)
{
if
(
rfkill_register
(
hdev
->
rfkill
)
<
0
)
{
rfkill_destroy
(
hdev
->
rfkill
);
hdev
->
rfkill
=
NULL
;
}
}
hci_notify
(
hdev
,
HCI_DEV_REG
);
return
id
;
...
...
@@ -924,6 +958,11 @@ int hci_unregister_dev(struct hci_dev *hdev)
hci_notify
(
hdev
,
HCI_DEV_UNREG
);
if
(
hdev
->
rfkill
)
{
rfkill_unregister
(
hdev
->
rfkill
);
rfkill_destroy
(
hdev
->
rfkill
);
}
hci_unregister_sysfs
(
hdev
);
__hci_dev_put
(
hdev
);
...
...
net/bluetooth/l2cap.c
View file @
bb400801
This diff is collapsed.
Click to expand it.
net/bluetooth/rfcomm/core.c
View file @
bb400801
...
...
@@ -679,7 +679,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst
bacpy
(
&
addr
.
l2_bdaddr
,
dst
);
addr
.
l2_family
=
AF_BLUETOOTH
;
addr
.
l2_psm
=
htobs
(
RFCOMM_PSM
);
addr
.
l2_psm
=
cpu_to_le16
(
RFCOMM_PSM
);
addr
.
l2_cid
=
0
;
*
err
=
kernel_connect
(
sock
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
(
addr
),
O_NONBLOCK
);
if
(
*
err
==
0
||
*
err
==
-
EINPROGRESS
)
...
...
@@ -852,9 +852,9 @@ static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d
}
if
(
cr
&&
channel_mtu
>=
0
)
pn
->
mtu
=
htobs
(
channel_mtu
);
pn
->
mtu
=
cpu_to_le16
(
channel_mtu
);
else
pn
->
mtu
=
htobs
(
d
->
mtu
);
pn
->
mtu
=
cpu_to_le16
(
d
->
mtu
);
*
ptr
=
__fcs
(
buf
);
ptr
++
;
...
...
@@ -1056,7 +1056,7 @@ static void rfcomm_make_uih(struct sk_buff *skb, u8 addr)
if
(
len
>
127
)
{
hdr
=
(
void
*
)
skb_push
(
skb
,
4
);
put_unaligned
(
htobs
(
__len16
(
len
)),
(
__le16
*
)
&
hdr
->
len
);
put_unaligned
(
cpu_to_le16
(
__len16
(
len
)),
(
__le16
*
)
&
hdr
->
len
);
}
else
{
hdr
=
(
void
*
)
skb_push
(
skb
,
3
);
hdr
->
len
=
__len8
(
len
);
...
...
@@ -1289,7 +1289,7 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
d
->
priority
=
pn
->
priority
;
d
->
mtu
=
btohs
(
pn
->
mtu
);
d
->
mtu
=
__le16_to_cpu
(
pn
->
mtu
);
if
(
cr
&&
d
->
mtu
>
s
->
mtu
)
d
->
mtu
=
s
->
mtu
;
...
...
@@ -1922,7 +1922,7 @@ static int rfcomm_add_listener(bdaddr_t *ba)
/* Bind socket */
bacpy
(
&
addr
.
l2_bdaddr
,
ba
);
addr
.
l2_family
=
AF_BLUETOOTH
;
addr
.
l2_psm
=
htobs
(
RFCOMM_PSM
);
addr
.
l2_psm
=
cpu_to_le16
(
RFCOMM_PSM
);
addr
.
l2_cid
=
0
;
err
=
kernel_bind
(
sock
,
(
struct
sockaddr
*
)
&
addr
,
sizeof
(
addr
));
if
(
err
<
0
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment