|
@@ -4517,15 +4517,31 @@ void l2cap_move_start(struct l2cap_chan *chan)
|
|
|
static void l2cap_do_create(struct l2cap_chan *chan, int result,
|
|
|
u8 local_amp_id, u8 remote_amp_id)
|
|
|
{
|
|
|
+ BT_DBG("chan %p state %s %u -> %u", chan, state_to_string(chan->state),
|
|
|
+ local_amp_id, remote_amp_id);
|
|
|
+
|
|
|
chan->fcs = L2CAP_FCS_NONE;
|
|
|
|
|
|
- if (!test_bit(CONF_CONNECT_PEND, &chan->conf_state)) {
|
|
|
+ /* Outgoing channel on AMP */
|
|
|
+ if (chan->state == BT_CONNECT) {
|
|
|
+ if (result == L2CAP_CR_SUCCESS) {
|
|
|
+ chan->local_amp_id = local_amp_id;
|
|
|
+ l2cap_send_create_chan_req(chan, remote_amp_id);
|
|
|
+ } else {
|
|
|
+ /* Revert to BR/EDR connect */
|
|
|
+ l2cap_send_conn_req(chan);
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Incoming channel on AMP */
|
|
|
+ if (__l2cap_no_conn_pending(chan)) {
|
|
|
struct l2cap_conn_rsp rsp;
|
|
|
char buf[128];
|
|
|
rsp.scid = cpu_to_le16(chan->dcid);
|
|
|
rsp.dcid = cpu_to_le16(chan->scid);
|
|
|
|
|
|
- /* Incoming channel on AMP */
|
|
|
if (result == L2CAP_CR_SUCCESS) {
|
|
|
/* Send successful response */
|
|
|
rsp.result = __constant_cpu_to_le16(L2CAP_CR_SUCCESS);
|
|
@@ -4547,15 +4563,6 @@ static void l2cap_do_create(struct l2cap_chan *chan, int result,
|
|
|
l2cap_build_conf_req(chan, buf), buf);
|
|
|
chan->num_conf_req++;
|
|
|
}
|
|
|
- } else {
|
|
|
- /* Outgoing channel on AMP */
|
|
|
- if (result == L2CAP_CR_SUCCESS) {
|
|
|
- chan->local_amp_id = local_amp_id;
|
|
|
- l2cap_send_create_chan_req(chan, remote_amp_id);
|
|
|
- } else {
|
|
|
- /* Revert to BR/EDR connect */
|
|
|
- l2cap_send_conn_req(chan);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|