diff options
| -rw-r--r-- | net/bluetooth/l2cap_core.c | 29 | 
1 files changed, 18 insertions, 11 deletions
| diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 3ed93938370a..7114bdff5958 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -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); -		}  	}  } | 
