summaryrefslogtreecommitdiffstats
path: root/net/bluetooth/l2cap_core.c
diff options
context:
space:
mode:
authorMat Martineau2012-05-18 05:53:40 +0200
committerJohan Hedberg2012-06-05 05:34:03 +0200
commit61aa4f5b9f43b21668aec51da2df3e9ed5f4226d (patch)
treebc0a489cee38fad2be02c8a95b480e666088b9a4 /net/bluetooth/l2cap_core.c
parentBluetooth: Refactor l2cap_send_ack (diff)
downloadkernel-qcow2-linux-61aa4f5b9f43b21668aec51da2df3e9ed5f4226d.tar.gz
kernel-qcow2-linux-61aa4f5b9f43b21668aec51da2df3e9ed5f4226d.tar.xz
kernel-qcow2-linux-61aa4f5b9f43b21668aec51da2df3e9ed5f4226d.zip
Bluetooth: Use the transmit state machine for busy state changes
This lets the transmit state machine handle local busy state changes, since different actions are taken in the different transmit states. Signed-off-by: Mat Martineau <mathewm@codeaurora.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth/l2cap_core.c')
-rw-r--r--net/bluetooth/l2cap_core.c45
1 files changed, 6 insertions, 39 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index f4d4eafb805d..8436806835e0 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -4318,48 +4318,15 @@ static int l2cap_reassemble_sdu(struct l2cap_chan *chan, struct sk_buff *skb,
return err;
}
-static void l2cap_ertm_enter_local_busy(struct l2cap_chan *chan)
-{
- BT_DBG("chan %p, Enter local busy", chan);
-
- set_bit(CONN_LOCAL_BUSY, &chan->conn_state);
- l2cap_seq_list_clear(&chan->srej_list);
-
- __set_ack_timer(chan);
-}
-
-static void l2cap_ertm_exit_local_busy(struct l2cap_chan *chan)
+void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
{
- u32 control;
-
- if (!test_bit(CONN_RNR_SENT, &chan->conn_state))
- goto done;
-
- control = __set_reqseq(chan, chan->buffer_seq);
- control |= __set_ctrl_poll(chan);
- control |= __set_ctrl_super(chan, L2CAP_SUPER_RR);
- chan->retry_count = 1;
-
- __clear_retrans_timer(chan);
- __set_monitor_timer(chan);
-
- set_bit(CONN_WAIT_F, &chan->conn_state);
-
-done:
- clear_bit(CONN_LOCAL_BUSY, &chan->conn_state);
- clear_bit(CONN_RNR_SENT, &chan->conn_state);
+ u8 event;
- BT_DBG("chan %p, Exit local busy", chan);
-}
+ if (chan->mode != L2CAP_MODE_ERTM)
+ return;
-void l2cap_chan_busy(struct l2cap_chan *chan, int busy)
-{
- if (chan->mode == L2CAP_MODE_ERTM) {
- if (busy)
- l2cap_ertm_enter_local_busy(chan);
- else
- l2cap_ertm_exit_local_busy(chan);
- }
+ event = busy ? L2CAP_EV_LOCAL_BUSY_DETECTED : L2CAP_EV_LOCAL_BUSY_CLEAR;
+ l2cap_tx(chan, 0, 0, event);
}
static u8 l2cap_classify_txseq(struct l2cap_chan *chan, u16 txseq)