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
c883f215
Commit
c883f215
authored
May 24, 2007
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6
parents
1ff75ed2
5dee9e7c
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
94 additions
and
74 deletions
+94
-74
drivers/bluetooth/hci_usb.c
drivers/bluetooth/hci_usb.c
+8
-8
include/net/bluetooth/l2cap.h
include/net/bluetooth/l2cap.h
+6
-2
net/bluetooth/l2cap.c
net/bluetooth/l2cap.c
+80
-64
No files found.
drivers/bluetooth/hci_usb.c
View file @
c883f215
...
...
@@ -115,11 +115,11 @@ static struct usb_device_id blacklist_ids[] = {
{
USB_DEVICE
(
0x0a5c
,
0x2009
),
.
driver_info
=
HCI_BCM92035
},
/* Broadcom BCM2045 */
{
USB_DEVICE
(
0x0a5c
,
0x2101
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x0a5c
,
0x2101
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
/* IBM/Lenovo ThinkPad with Broadcom chip */
{
USB_DEVICE
(
0x0a5c
,
0x201e
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x0a5c
,
0x2110
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x0a5c
,
0x201e
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x0a5c
,
0x2110
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
/* Targus ACB10US */
{
USB_DEVICE
(
0x0a5c
,
0x2100
),
.
driver_info
=
HCI_RESET
},
...
...
@@ -128,17 +128,17 @@ static struct usb_device_id blacklist_ids[] = {
{
USB_DEVICE
(
0x0a5c
,
0x2111
),
.
driver_info
=
HCI_RESET
},
/* HP laptop with Broadcom chip */
{
USB_DEVICE
(
0x03f0
,
0x171d
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x03f0
,
0x171d
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
/* Dell laptop with Broadcom chip */
{
USB_DEVICE
(
0x413c
,
0x8126
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x413c
,
0x8126
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
/* Microsoft Wireless Transceiver for Bluetooth 2.0 */
{
USB_DEVICE
(
0x045e
,
0x009c
),
.
driver_info
=
HCI_RESET
},
/* Kensington Bluetooth USB adapter */
{
USB_DEVICE
(
0x047d
,
0x105d
),
.
driver_info
=
HCI_RESET
},
{
USB_DEVICE
(
0x047d
,
0x105e
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x047d
,
0x105e
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
/* ISSC Bluetooth Adapter v3.1 */
{
USB_DEVICE
(
0x1131
,
0x1001
),
.
driver_info
=
HCI_RESET
},
...
...
@@ -148,8 +148,8 @@ static struct usb_device_id blacklist_ids[] = {
{
USB_DEVICE
(
0x0400
,
0x080a
),
.
driver_info
=
HCI_BROKEN_ISOC
},
/* Belkin F8T012 and F8T013 devices */
{
USB_DEVICE
(
0x050d
,
0x0012
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x050d
,
0x0013
),
.
driver_info
=
HCI_WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x050d
,
0x0012
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
{
USB_DEVICE
(
0x050d
,
0x0013
),
.
driver_info
=
HCI_
RESET
|
HCI_
WRONG_SCO_MTU
},
/* Digianswer devices */
{
USB_DEVICE
(
0x08fd
,
0x0001
),
.
driver_info
=
HCI_DIGIANSWER
},
...
...
include/net/bluetooth/l2cap.h
View file @
c883f215
...
...
@@ -129,8 +129,10 @@ struct l2cap_conf_rsp {
__u8
data
[
0
];
}
__attribute__
((
packed
));
#define L2CAP_CONF_SUCCESS 0x00
#define L2CAP_CONF_UNACCEPT 0x01
#define L2CAP_CONF_SUCCESS 0x0000
#define L2CAP_CONF_UNACCEPT 0x0001
#define L2CAP_CONF_REJECT 0x0002
#define L2CAP_CONF_UNKNOWN 0x0003
struct
l2cap_conf_opt
{
__u8
type
;
...
...
@@ -215,6 +217,8 @@ struct l2cap_pinfo {
__u32
link_mode
;
__u8
conf_req
[
64
];
__u8
conf_len
;
__u8
conf_state
;
__u8
conf_retry
;
__u16
conf_mtu
;
...
...
net/bluetooth/l2cap.c
View file @
c883f215
...
...
@@ -507,6 +507,7 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent)
}
/* Default config options */
pi
->
conf_len
=
0
;
pi
->
conf_mtu
=
L2CAP_DEFAULT_MTU
;
pi
->
flush_to
=
L2CAP_DEFAULT_FLUSH_TO
;
}
...
...
@@ -1271,42 +1272,6 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned
return
len
;
}
static
inline
void
l2cap_parse_conf_req
(
struct
sock
*
sk
,
void
*
data
,
int
len
)
{
int
type
,
hint
,
olen
;
unsigned
long
val
;
void
*
ptr
=
data
;
BT_DBG
(
"sk %p len %d"
,
sk
,
len
);
while
(
len
>=
L2CAP_CONF_OPT_SIZE
)
{
len
-=
l2cap_get_conf_opt
(
&
ptr
,
&
type
,
&
olen
,
&
val
);
hint
=
type
&
0x80
;
type
&=
0x7f
;
switch
(
type
)
{
case
L2CAP_CONF_MTU
:
l2cap_pi
(
sk
)
->
conf_mtu
=
val
;
break
;
case
L2CAP_CONF_FLUSH_TO
:
l2cap_pi
(
sk
)
->
flush_to
=
val
;
break
;
case
L2CAP_CONF_QOS
:
break
;
default:
if
(
hint
)
break
;
/* FIXME: Reject unknown option */
break
;
}
}
}
static
void
l2cap_add_conf_opt
(
void
**
ptr
,
u8
type
,
u8
len
,
unsigned
long
val
)
{
struct
l2cap_conf_opt
*
opt
=
*
ptr
;
...
...
@@ -1358,39 +1323,75 @@ static int l2cap_build_conf_req(struct sock *sk, void *data)
return
ptr
-
data
;
}
static
in
line
int
l2cap_conf_output
(
struct
sock
*
sk
,
void
**
ptr
)
static
in
t
l2cap_parse_conf_req
(
struct
sock
*
sk
,
void
*
data
)
{
struct
l2cap_pinfo
*
pi
=
l2cap_pi
(
sk
);
int
result
=
0
;
struct
l2cap_conf_rsp
*
rsp
=
data
;
void
*
ptr
=
rsp
->
data
;
void
*
req
=
pi
->
conf_req
;
int
len
=
pi
->
conf_len
;
int
type
,
hint
,
olen
;
unsigned
long
val
;
u16
result
=
L2CAP_CONF_SUCCESS
;
BT_DBG
(
"sk %p"
,
sk
);
while
(
len
>=
L2CAP_CONF_OPT_SIZE
)
{
len
-=
l2cap_get_conf_opt
(
&
req
,
&
type
,
&
olen
,
&
val
);
hint
=
type
&
0x80
;
type
&=
0x7f
;
switch
(
type
)
{
case
L2CAP_CONF_MTU
:
pi
->
conf_mtu
=
val
;
break
;
case
L2CAP_CONF_FLUSH_TO
:
pi
->
flush_to
=
val
;
break
;
case
L2CAP_CONF_QOS
:
break
;
default:
if
(
hint
)
break
;
result
=
L2CAP_CONF_UNKNOWN
;
*
((
u8
*
)
ptr
++
)
=
type
;
break
;
}
}
if
(
result
==
L2CAP_CONF_SUCCESS
)
{
/* Configure output options and let the other side know
* which ones we don't like. */
if
(
pi
->
conf_mtu
<
pi
->
omtu
)
result
=
L2CAP_CONF_UNACCEPT
;
else
pi
->
omtu
=
pi
->
conf_mtu
;
l2cap_add_conf_opt
(
ptr
,
L2CAP_CONF_MTU
,
2
,
pi
->
omtu
);
l2cap_add_conf_opt
(
&
ptr
,
L2CAP_CONF_MTU
,
2
,
pi
->
omtu
);
}
rsp
->
scid
=
cpu_to_le16
(
pi
->
dcid
);
rsp
->
result
=
cpu_to_le16
(
result
);
rsp
->
flags
=
cpu_to_le16
(
0x0000
);
BT_DBG
(
"sk %p result %d"
,
sk
,
result
);
return
result
;
return
ptr
-
data
;
}
static
int
l2cap_build_conf_rsp
(
struct
sock
*
sk
,
void
*
data
,
int
*
result
)
static
int
l2cap_build_conf_rsp
(
struct
sock
*
sk
,
void
*
data
,
u16
result
,
u16
flags
)
{
struct
l2cap_conf_rsp
*
rsp
=
data
;
void
*
ptr
=
rsp
->
data
;
u16
flags
=
0
;
BT_DBG
(
"sk %p complete %d"
,
sk
,
result
?
1
:
0
);
if
(
result
)
*
result
=
l2cap_conf_output
(
sk
,
&
ptr
);
else
flags
=
0x0001
;
BT_DBG
(
"sk %p"
,
sk
);
rsp
->
scid
=
cpu_to_le16
(
l2cap_pi
(
sk
)
->
dcid
);
rsp
->
result
=
cpu_to_le16
(
result
?
*
result
:
0
);
rsp
->
result
=
cpu_to_le16
(
result
);
rsp
->
flags
=
cpu_to_le16
(
flags
);
return
ptr
-
data
;
...
...
@@ -1535,7 +1536,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
u16
dcid
,
flags
;
u8
rsp
[
64
];
struct
sock
*
sk
;
int
result
;
int
len
;
dcid
=
__le16_to_cpu
(
req
->
dcid
);
flags
=
__le16_to_cpu
(
req
->
flags
);
...
...
@@ -1548,25 +1549,40 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
if
(
sk
->
sk_state
==
BT_DISCONN
)
goto
unlock
;
l2cap_parse_conf_req
(
sk
,
req
->
data
,
cmd
->
len
-
sizeof
(
*
req
));
/* Reject if config buffer is too small. */
len
=
cmd
->
len
-
sizeof
(
*
req
);
if
(
l2cap_pi
(
sk
)
->
conf_len
+
len
>
sizeof
(
l2cap_pi
(
sk
)
->
conf_req
))
{
l2cap_send_cmd
(
conn
,
cmd
->
ident
,
L2CAP_CONF_RSP
,
l2cap_build_conf_rsp
(
sk
,
rsp
,
L2CAP_CONF_REJECT
,
flags
),
rsp
);
goto
unlock
;
}
/* Store config. */
memcpy
(
l2cap_pi
(
sk
)
->
conf_req
+
l2cap_pi
(
sk
)
->
conf_len
,
req
->
data
,
len
);
l2cap_pi
(
sk
)
->
conf_len
+=
len
;
if
(
flags
&
0x0001
)
{
/* Incomplete config. Send empty response. */
l2cap_send_cmd
(
conn
,
cmd
->
ident
,
L2CAP_CONF_RSP
,
l2cap_build_conf_rsp
(
sk
,
rsp
,
NULL
),
rsp
);
l2cap_build_conf_rsp
(
sk
,
rsp
,
L2CAP_CONF_SUCCESS
,
0x0001
),
rsp
);
goto
unlock
;
}
/* Complete config. */
l2cap_send_cmd
(
conn
,
cmd
->
ident
,
L2CAP_CONF_RSP
,
l2cap_build_conf_rsp
(
sk
,
rsp
,
&
result
),
rsp
);
if
(
result
)
len
=
l2cap_parse_conf_req
(
sk
,
rsp
);
if
(
len
<
0
)
goto
unlock
;
/* Output config done */
l2cap_send_cmd
(
conn
,
cmd
->
ident
,
L2CAP_CONF_RSP
,
len
,
rsp
);
/* Output config done. */
l2cap_pi
(
sk
)
->
conf_state
|=
L2CAP_CONF_OUTPUT_DONE
;
/* Reset config buffer. */
l2cap_pi
(
sk
)
->
conf_len
=
0
;
if
(
l2cap_pi
(
sk
)
->
conf_state
&
L2CAP_CONF_INPUT_DONE
)
{
sk
->
sk_state
=
BT_CONNECTED
;
l2cap_chan_ready
(
sk
);
...
...
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