diff options
author | Mat Martineau <mathewm@codeaurora.org> | 2012-10-23 18:24:06 -0400 |
---|---|---|
committer | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2012-10-23 21:57:02 -0400 |
commit | 08333283a7347c33589f31c9b1d1b7a4f3c3f7a3 (patch) | |
tree | 62b1f6b622ec5f486809e7d1bed44dd098b39ddb | |
parent | 9917c85b06c2eb9d61c0f2dadd2d5d8788f7e563 (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.h | 29 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 5 |
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 { | |||
644 | enum { | 651 | enum { |
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 | ||
649 | enum { | 659 | enum { |
@@ -674,6 +684,25 @@ enum { | |||
674 | L2CAP_EV_RECV_FRAME, | 684 | L2CAP_EV_RECV_FRAME, |
675 | }; | 685 | }; |
676 | 686 | ||
687 | enum { | ||
688 | L2CAP_MOVE_ROLE_NONE, | ||
689 | L2CAP_MOVE_ROLE_INITIATOR, | ||
690 | L2CAP_MOVE_ROLE_RESPONDER, | ||
691 | }; | ||
692 | |||
693 | enum { | ||
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 | |||
677 | void l2cap_chan_hold(struct l2cap_chan *c); | 706 | void l2cap_chan_hold(struct l2cap_chan *c); |
678 | void l2cap_chan_put(struct l2cap_chan *c); | 707 | void 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 | ||