aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMat Martineau <mathewm@codeaurora.org>2012-10-23 18:24:06 -0400
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2012-10-23 21:57:02 -0400
commit08333283a7347c33589f31c9b1d1b7a4f3c3f7a3 (patch)
tree62b1f6b622ec5f486809e7d1bed44dd098b39ddb
parent9917c85b06c2eb9d61c0f2dadd2d5d8788f7e563 (diff)
Bluetooth: Add new l2cap_chan struct members for high speed channels
An L2CAP channel using high speed continues to be associated with a BR/EDR l2cap_conn, while also tracking an additional hci_conn (representing a physical link on a high speed controller) and hci_chan (representing a logical link). There may only be one physical link between two high speed controllers. Each physical link may contain several logical links, with each logical link representing a channel with specific quality of service. During a channel move, the destination channel id, current move state, and role (initiator vs. responder) are tracked and used by the channel move state machine. The ident value associated with a move request must also be stored in order to use it in later move responses. The active channel is stored in local_amp_id. Signed-off-by: Mat Martineau <mathewm@codeaurora.org> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
-rw-r--r--include/net/bluetooth/l2cap.h29
-rw-r--r--net/bluetooth/l2cap_core.c5
2 files changed, 34 insertions, 0 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index 6e23afdf65c1..6d3615eed97c 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -434,6 +434,8 @@ struct l2cap_chan {
434 struct sock *sk; 434 struct sock *sk;
435 435
436 struct l2cap_conn *conn; 436 struct l2cap_conn *conn;
437 struct hci_conn *hs_hcon;
438 struct hci_chan *hs_hchan;
437 struct kref kref; 439 struct kref kref;
438 440
439 __u8 state; 441 __u8 state;
@@ -477,6 +479,11 @@ struct l2cap_chan {
477 unsigned long conn_state; 479 unsigned long conn_state;
478 unsigned long flags; 480 unsigned long flags;
479 481
482 __u8 local_amp_id;
483 __u8 move_id;
484 __u8 move_state;
485 __u8 move_role;
486
480 __u16 next_tx_seq; 487 __u16 next_tx_seq;
481 __u16 expected_ack_seq; 488 __u16 expected_ack_seq;
482 __u16 expected_tx_seq; 489 __u16 expected_tx_seq;
@@ -644,6 +651,9 @@ enum {
644enum { 651enum {
645 L2CAP_RX_STATE_RECV, 652 L2CAP_RX_STATE_RECV,
646 L2CAP_RX_STATE_SREJ_SENT, 653 L2CAP_RX_STATE_SREJ_SENT,
654 L2CAP_RX_STATE_MOVE,
655 L2CAP_RX_STATE_WAIT_P,
656 L2CAP_RX_STATE_WAIT_F,
647}; 657};
648 658
649enum { 659enum {
@@ -674,6 +684,25 @@ enum {
674 L2CAP_EV_RECV_FRAME, 684 L2CAP_EV_RECV_FRAME,
675}; 685};
676 686
687enum {
688 L2CAP_MOVE_ROLE_NONE,
689 L2CAP_MOVE_ROLE_INITIATOR,
690 L2CAP_MOVE_ROLE_RESPONDER,
691};
692
693enum {
694 L2CAP_MOVE_STABLE,
695 L2CAP_MOVE_WAIT_REQ,
696 L2CAP_MOVE_WAIT_RSP,
697 L2CAP_MOVE_WAIT_RSP_SUCCESS,
698 L2CAP_MOVE_WAIT_CONFIRM,
699 L2CAP_MOVE_WAIT_CONFIRM_RSP,
700 L2CAP_MOVE_WAIT_LOGICAL_COMP,
701 L2CAP_MOVE_WAIT_LOGICAL_CFM,
702 L2CAP_MOVE_WAIT_LOCAL_BUSY,
703 L2CAP_MOVE_WAIT_PREPARE,
704};
705
677void l2cap_chan_hold(struct l2cap_chan *c); 706void l2cap_chan_hold(struct l2cap_chan *c);
678void l2cap_chan_put(struct l2cap_chan *c); 707void l2cap_chan_put(struct l2cap_chan *c);
679 708
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 08efc256c931..c1b169f3ae0d 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -2788,6 +2788,11 @@ int l2cap_ertm_init(struct l2cap_chan *chan)
2788 2788
2789 skb_queue_head_init(&chan->tx_q); 2789 skb_queue_head_init(&chan->tx_q);
2790 2790
2791 chan->local_amp_id = 0;
2792 chan->move_id = 0;
2793 chan->move_state = L2CAP_MOVE_STABLE;
2794 chan->move_role = L2CAP_MOVE_ROLE_NONE;
2795
2791 if (chan->mode != L2CAP_MODE_ERTM) 2796 if (chan->mode != L2CAP_MODE_ERTM)
2792 return 0; 2797 return 0;
2793 2798