|
@@ -3719,19 +3719,11 @@ static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb, u3
|
|
|
|
|
|
static void l2cap_ertm_enter_local_busy(struct l2cap_chan *chan)
|
|
|
{
|
|
|
- u32 control;
|
|
|
-
|
|
|
BT_DBG("chan %p, Enter local busy", chan);
|
|
|
|
|
|
set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
|
|
|
|
|
|
- control = __set_reqseq(chan, chan->buffer_seq);
|
|
|
- control |= __set_ctrl_super(chan, L2CAP_SUPER_RNR);
|
|
|
- l2cap_send_sframe(chan, control);
|
|
|
-
|
|
|
- set_bit(CONN_RNR_SENT, &chan->conn_state);
|
|
|
-
|
|
|
- __clear_ack_timer(chan);
|
|
|
+ __set_ack_timer(chan);
|
|
|
}
|
|
|
|
|
|
static void l2cap_ertm_exit_local_busy(struct l2cap_chan *chan)
|
|
@@ -3871,8 +3863,11 @@ static inline int l2cap_data_channel_iframe(struct l2cap_chan *chan, u32 rx_cont
|
|
|
goto drop;
|
|
|
}
|
|
|
|
|
|
- if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state))
|
|
|
+ if (test_bit(CONN_LOCAL_BUSY, &chan->conn_state)) {
|
|
|
+ if (!test_bit(CONN_RNR_SENT, &chan->conn_state))
|
|
|
+ l2cap_send_ack(chan);
|
|
|
goto drop;
|
|
|
+ }
|
|
|
|
|
|
if (tx_seq == chan->expected_tx_seq)
|
|
|
goto expected;
|