* [RFCv1 0/6] Handle AMP_LINK
@ 2012-10-08 14:52 Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
` (6 more replies)
0 siblings, 7 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add code for handling High Speed link
Andrei Emeltchenko (6):
Bluetooth: Allow to set flush timeout
Bluetooth: AMP: Handle AMP_LINK timeout
Bluetooth: AMP: Add handle to hci_chan structure
Bluetooth: Handle number of compl blocks for AMP_LINK
Bluetooth: AMP: Handle AMP_LINK connection
Bluetooth: AMP: Hanlde AMP_LINK case in conn_put
include/net/bluetooth/hci_core.h | 36 +++++++++++++++++---
net/bluetooth/hci_conn.c | 69 ++++++++++++++++++++++++++++++++++++--
net/bluetooth/hci_core.c | 22 ++++++++++--
net/bluetooth/hci_event.c | 13 +++++--
net/bluetooth/l2cap_sock.c | 1 +
5 files changed, 128 insertions(+), 13 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 23+ messages in thread
* [RFCv1 1/6] Bluetooth: Allow to set flush timeout
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
@ 2012-10-08 14:52 ` Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
` (5 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_sock.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index a71c408..b0014d5 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -529,6 +529,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us
chan->fcs = opts.fcs;
chan->max_tx = opts.max_tx;
chan->tx_win = opts.txwin_size;
+ chan->flush_to = opts.flush_to;
break;
case L2CAP_LM:
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [RFCv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
@ 2012-10-08 14:52 ` Andrei Emeltchenko
2012-10-09 14:39 ` Marcel Holtmann
2012-10-08 14:52 ` [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
` (4 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
When AMP_LINK timeouts execute HCI_OP_DISCONN_PHY_LINK as analog to
HCI_OP_DISCONNECT for ACL_LINK.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/hci_conn.c | 35 ++++++++++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 53202f6..3584f58 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -130,6 +130,20 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
}
+static void hci_amp_disconn(struct hci_conn *conn, __u8 reason)
+{
+ struct hci_cp_disconn_phy_link cp;
+
+ BT_DBG("hcon %p", conn);
+
+ conn->state = BT_DISCONN;
+
+ cp.phy_handle = (u8) conn->handle;
+ cp.reason = reason;
+ hci_send_cmd(conn->hdev, HCI_OP_DISCONN_PHY_LINK,
+ sizeof(cp), &cp);
+}
+
static void hci_add_sco(struct hci_conn *conn, __u16 handle)
{
struct hci_dev *hdev = conn->hdev;
@@ -230,11 +244,27 @@ void hci_sco_setup(struct hci_conn *conn, __u8 status)
}
}
+static void hci_conn_disconnect(struct hci_conn *conn)
+{
+ u8 reason;
+
+ reason = hci_proto_disconn_ind(conn);
+
+ switch (conn->type) {
+ case ACL_LINK:
+ hci_acl_disconn(conn, reason);
+ break;
+
+ case AMP_LINK:
+ hci_amp_disconn(conn, reason);
+ break;
+ }
+}
+
static void hci_conn_timeout(struct work_struct *work)
{
struct hci_conn *conn = container_of(work, struct hci_conn,
disc_work.work);
- __u8 reason;
BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
@@ -253,8 +283,7 @@ static void hci_conn_timeout(struct work_struct *work)
break;
case BT_CONFIG:
case BT_CONNECTED:
- reason = hci_proto_disconn_ind(conn);
- hci_acl_disconn(conn, reason);
+ hci_conn_disconnect(conn);
break;
default:
conn->state = BT_CLOSED;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
@ 2012-10-08 14:52 ` Andrei Emeltchenko
2012-10-09 14:46 ` Marcel Holtmann
2012-10-08 14:52 ` [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
` (3 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
hci_chan will be identified by handle used in logical link creation
process. This handle is used in AMP ACL-U packet handle field.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 6 ++++--
net/bluetooth/hci_conn.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 90ae4f0..951f604 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -348,7 +348,7 @@ struct hci_conn {
struct hci_chan {
struct list_head list;
-
+ __u16 handle;
struct hci_conn *conn;
struct sk_buff_head data_q;
unsigned int sent;
@@ -565,7 +565,9 @@ void hci_conn_check_pending(struct hci_dev *hdev);
struct hci_chan *hci_chan_create(struct hci_conn *conn);
void hci_chan_del(struct hci_chan *chan);
void hci_chan_list_flush(struct hci_conn *conn);
-
+struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle);
+struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev,
+ __u16 handle);
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
__u8 dst_type, __u8 sec_level, __u8 auth_type);
int hci_conn_check_link_mode(struct hci_conn *conn);
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 3584f58..7387516 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -992,3 +992,37 @@ void hci_chan_list_flush(struct hci_conn *conn)
list_for_each_entry_safe(chan, n, &conn->chan_list, list)
hci_chan_del(chan);
}
+
+struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle)
+{
+ struct hci_chan *hchan;
+
+ list_for_each_entry(hchan, &hcon->chan_list, list) {
+ if (hchan->handle == handle)
+ return hchan;
+ }
+
+ return NULL;
+}
+
+struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev, __u16 handle)
+{
+ struct hci_conn_hash *h = &hdev->conn_hash;
+ struct hci_conn *hcon;
+
+ rcu_read_lock();
+
+ list_for_each_entry_rcu(hcon, &h->list, list) {
+ struct hci_chan *hchan;
+
+ hchan = hci_chan_lookup_handle(hcon, handle);
+ if (hchan) {
+ rcu_read_unlock();
+ return hchan;
+ }
+ }
+
+ rcu_read_unlock();
+
+ return NULL;
+}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (2 preceding siblings ...)
2012-10-08 14:52 ` [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
@ 2012-10-08 14:52 ` Andrei Emeltchenko
2012-10-09 14:49 ` Marcel Holtmann
2012-10-08 14:52 ` [RFCv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection Andrei Emeltchenko
` (2 subsequent siblings)
6 siblings, 1 reply; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add handling blocks count for AMP link.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/hci_event.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 82e478a..c479732 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -2698,13 +2698,21 @@ static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
for (i = 0; i < ev->num_hndl; i++) {
struct hci_comp_blocks_info *info = &ev->handles[i];
- struct hci_conn *conn;
+ struct hci_conn *conn = NULL;
+ struct hci_chan *chan;
__u16 handle, block_count;
handle = __le16_to_cpu(info->handle);
block_count = __le16_to_cpu(info->blocks);
- conn = hci_conn_hash_lookup_handle(hdev, handle);
+ if (hdev->dev_type == HCI_BREDR) {
+ conn = hci_conn_hash_lookup_handle(hdev, handle);
+ } else {
+ chan = hci_chan_lookup_handle_all(hdev, handle);
+ if (chan)
+ conn = chan->conn;
+ }
+
if (!conn)
continue;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [RFCv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (3 preceding siblings ...)
2012-10-08 14:52 ` [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
@ 2012-10-08 14:52 ` Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
AMP_LINK represents physical link between AMP controllers.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 13 +++++++++++++
net/bluetooth/hci_core.c | 22 +++++++++++++++++++---
net/bluetooth/hci_event.c | 1 +
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 951f604..744713b 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -73,6 +73,7 @@ struct discovery_state {
struct hci_conn_hash {
struct list_head list;
unsigned int acl_num;
+ unsigned int amp_num;
unsigned int sco_num;
unsigned int le_num;
};
@@ -447,6 +448,9 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
case ACL_LINK:
h->acl_num++;
break;
+ case AMP_LINK:
+ h->amp_num++;
+ break;
case LE_LINK:
h->le_num++;
break;
@@ -468,6 +472,9 @@ static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
case ACL_LINK:
h->acl_num--;
break;
+ case AMP_LINK:
+ h->amp_num--;
+ break;
case LE_LINK:
h->le_num--;
break;
@@ -484,6 +491,8 @@ static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
switch (type) {
case ACL_LINK:
return h->acl_num;
+ case AMP_LINK:
+ return h->amp_num;
case LE_LINK:
return h->le_num;
case SCO_LINK:
@@ -800,6 +809,10 @@ static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
sco_disconn_cfm(conn, reason);
break;
+ /* L2CAP would be handled for BREDR chan */
+ case AMP_LINK:
+ break;
+
default:
BT_ERR("unknown link type %d", conn->type);
break;
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index bd26cb5..2e72c41 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2379,6 +2379,9 @@ static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
case ACL_LINK:
cnt = hdev->acl_cnt;
break;
+ case AMP_LINK:
+ cnt = hdev->block_cnt;
+ break;
case SCO_LINK:
case ESCO_LINK:
cnt = hdev->sco_cnt;
@@ -2508,11 +2511,19 @@ static void hci_sched_acl_blk(struct hci_dev *hdev)
struct hci_chan *chan;
struct sk_buff *skb;
int quote;
+ u8 type;
__check_timeout(hdev, cnt);
+ BT_DBG("%s", hdev->name);
+
+ if (hdev->dev_type == HCI_AMP)
+ type = AMP_LINK;
+ else
+ type = ACL_LINK;
+
while (hdev->block_cnt > 0 &&
- (chan = hci_chan_sent(hdev, ACL_LINK, "e))) {
+ (chan = hci_chan_sent(hdev, type, "e))) {
u32 priority = (skb_peek(&chan->data_q))->priority;
while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
int blocks;
@@ -2545,14 +2556,19 @@ static void hci_sched_acl_blk(struct hci_dev *hdev)
}
if (cnt != hdev->block_cnt)
- hci_prio_recalculate(hdev, ACL_LINK);
+ hci_prio_recalculate(hdev, type);
}
static void hci_sched_acl(struct hci_dev *hdev)
{
BT_DBG("%s", hdev->name);
- if (!hci_conn_num(hdev, ACL_LINK))
+ /* No ACL link over BR/EDR controller */
+ if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
+ return;
+
+ /* No AMP link over AMP controller */
+ if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
return;
switch (hdev->flow_ctl_mode) {
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index c479732..9a1c2f6 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -2720,6 +2720,7 @@ static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
switch (conn->type) {
case ACL_LINK:
+ case AMP_LINK:
hdev->block_cnt += block_count;
if (hdev->block_cnt > hdev->num_blocks)
hdev->block_cnt = hdev->num_blocks;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [RFCv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (4 preceding siblings ...)
2012-10-08 14:52 ` [RFCv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection Andrei Emeltchenko
@ 2012-10-08 14:52 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-08 14:52 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Handle AMP link when setting up disconnect timeout.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 744713b..0cc8c85 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -604,7 +604,10 @@ static inline void hci_conn_put(struct hci_conn *conn)
if (atomic_dec_and_test(&conn->refcnt)) {
unsigned long timeo;
- if (conn->type == ACL_LINK || conn->type == LE_LINK) {
+
+ switch (conn->type) {
+ case ACL_LINK:
+ case LE_LINK:
del_timer(&conn->idle_timer);
if (conn->state == BT_CONNECTED) {
timeo = conn->disc_timeout;
@@ -613,12 +616,20 @@ static inline void hci_conn_put(struct hci_conn *conn)
} else {
timeo = msecs_to_jiffies(10);
}
- } else {
+ break;
+
+ case AMP_LINK:
+ timeo = conn->disc_timeout;
+ break;
+
+ default:
timeo = msecs_to_jiffies(10);
+ break;
}
+
cancel_delayed_work(&conn->disc_work);
queue_delayed_work(conn->hdev->workqueue,
- &conn->disc_work, timeo);
+ &conn->disc_work, timeo);
}
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [RFCv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout
2012-10-08 14:52 ` [RFCv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
@ 2012-10-09 14:39 ` Marcel Holtmann
0 siblings, 0 replies; 23+ messages in thread
From: Marcel Holtmann @ 2012-10-09 14:39 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth
Hi Andrei,
> When AMP_LINK timeouts execute HCI_OP_DISCONN_PHY_LINK as analog to
> HCI_OP_DISCONNECT for ACL_LINK.
>
> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
> net/bluetooth/hci_conn.c | 35 ++++++++++++++++++++++++++++++++---
> 1 file changed, 32 insertions(+), 3 deletions(-)
>
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index 53202f6..3584f58 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -130,6 +130,20 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
> hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
> }
>
> +static void hci_amp_disconn(struct hci_conn *conn, __u8 reason)
> +{
> + struct hci_cp_disconn_phy_link cp;
> +
> + BT_DBG("hcon %p", conn);
> +
> + conn->state = BT_DISCONN;
> +
> + cp.phy_handle = (u8) conn->handle;
I rather not do this cast. Maybe having conn->phy_handle is cleaner or
some helper macro like HCI_PHY_HANDLE(conn->handle) or something. Or
just do conn->handle & 0xff.
> + cp.reason = reason;
> + hci_send_cmd(conn->hdev, HCI_OP_DISCONN_PHY_LINK,
> + sizeof(cp), &cp);
> +}
> +
> static void hci_add_sco(struct hci_conn *conn, __u16 handle)
> {
> struct hci_dev *hdev = conn->hdev;
> @@ -230,11 +244,27 @@ void hci_sco_setup(struct hci_conn *conn, __u8 status)
> }
> }
>
> +static void hci_conn_disconnect(struct hci_conn *conn)
> +{
> + u8 reason;
> +
> + reason = hci_proto_disconn_ind(conn);
Please keep using __u8 and in this case just make it one line.
__u8 reason = hci_proto_disconn_ind(conn);
> +
> + switch (conn->type) {
> + case ACL_LINK:
> + hci_acl_disconn(conn, reason);
> + break;
> +
Don't bother with this empty line.
> + case AMP_LINK:
> + hci_amp_disconn(conn, reason);
> + break;
> + }
> +}
> +
> static void hci_conn_timeout(struct work_struct *work)
> {
> struct hci_conn *conn = container_of(work, struct hci_conn,
> disc_work.work);
> - __u8 reason;
>
> BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
>
> @@ -253,8 +283,7 @@ static void hci_conn_timeout(struct work_struct *work)
> break;
> case BT_CONFIG:
> case BT_CONNECTED:
> - reason = hci_proto_disconn_ind(conn);
> - hci_acl_disconn(conn, reason);
> + hci_conn_disconnect(conn);
> break;
> default:
> conn->state = BT_CLOSED;
Regards
Marcel
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure
2012-10-08 14:52 ` [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
@ 2012-10-09 14:46 ` Marcel Holtmann
2012-10-10 8:34 ` Andrei Emeltchenko
0 siblings, 1 reply; 23+ messages in thread
From: Marcel Holtmann @ 2012-10-09 14:46 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth
Hi Andrei,
> hci_chan will be identified by handle used in logical link creation
> process. This handle is used in AMP ACL-U packet handle field.
>
> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
> include/net/bluetooth/hci_core.h | 6 ++++--
> net/bluetooth/hci_conn.c | 34 ++++++++++++++++++++++++++++++++++
> 2 files changed, 38 insertions(+), 2 deletions(-)
>
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 90ae4f0..951f604 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -348,7 +348,7 @@ struct hci_conn {
>
> struct hci_chan {
> struct list_head list;
> -
> + __u16 handle;
> struct hci_conn *conn;
> struct sk_buff_head data_q;
> unsigned int sent;
> @@ -565,7 +565,9 @@ void hci_conn_check_pending(struct hci_dev *hdev);
> struct hci_chan *hci_chan_create(struct hci_conn *conn);
> void hci_chan_del(struct hci_chan *chan);
> void hci_chan_list_flush(struct hci_conn *conn);
> -
> +struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle);
> +struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev,
> + __u16 handle);
this naming is pretty bad. I have no idea what one function does
different compared to the other. Especially since none of them take a
hci_chan as argument, but start with that prefix.
Would be the naming hci_conn_lookup_chan be a lot clearer? Or maybe
hci_chan_lookup_from_dev or similar.
> struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
> __u8 dst_type, __u8 sec_level, __u8 auth_type);
> int hci_conn_check_link_mode(struct hci_conn *conn);
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index 3584f58..7387516 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -992,3 +992,37 @@ void hci_chan_list_flush(struct hci_conn *conn)
> list_for_each_entry_safe(chan, n, &conn->chan_list, list)
> hci_chan_del(chan);
> }
> +
> +struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle)
> +{
> + struct hci_chan *hchan;
> +
> + list_for_each_entry(hchan, &hcon->chan_list, list) {
> + if (hchan->handle == handle)
> + return hchan;
> + }
> +
> + return NULL;
> +}
Since this function is unprotected, you better make this __hci_....
And on a different note. It is not used at all. So why is this public
anyway?
> +
> +struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev, __u16 handle)
> +{
> + struct hci_conn_hash *h = &hdev->conn_hash;
> + struct hci_conn *hcon;
> +
> + rcu_read_lock();
> +
> + list_for_each_entry_rcu(hcon, &h->list, list) {
> + struct hci_chan *hchan;
> +
> + hchan = hci_chan_lookup_handle(hcon, handle);
> + if (hchan) {
> + rcu_read_unlock();
> + return hchan;
Please use break here. Have a global hchan variable assigned to NULL and
just break here.
> + }
> + }
> +
> + rcu_read_unlock();
> +
> + return NULL;
> +}
Regards
Marcel
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK
2012-10-08 14:52 ` [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
@ 2012-10-09 14:49 ` Marcel Holtmann
2012-10-10 8:22 ` Andrei Emeltchenko
0 siblings, 1 reply; 23+ messages in thread
From: Marcel Holtmann @ 2012-10-09 14:49 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth
Hi Andrei,
> Add handling blocks count for AMP link.
>
> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
> net/bluetooth/hci_event.c | 12 ++++++++++--
> 1 file changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 82e478a..c479732 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -2698,13 +2698,21 @@ static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
>
> for (i = 0; i < ev->num_hndl; i++) {
> struct hci_comp_blocks_info *info = &ev->handles[i];
> - struct hci_conn *conn;
> + struct hci_conn *conn = NULL;
> + struct hci_chan *chan;
> __u16 handle, block_count;
>
> handle = __le16_to_cpu(info->handle);
> block_count = __le16_to_cpu(info->blocks);
>
> - conn = hci_conn_hash_lookup_handle(hdev, handle);
> + if (hdev->dev_type == HCI_BREDR) {
> + conn = hci_conn_hash_lookup_handle(hdev, handle);
> + } else {
> + chan = hci_chan_lookup_handle_all(hdev, handle);
> + if (chan)
> + conn = chan->conn;
Just in case, we better use a switch statement here.
And now coming to think about it, do we ever need the hci_chan anyway.
Then why not have a function that looks up the hci_conn.
Maybe introduce a new hci_conn_lookup_handle(hdev, handle) and it will
do the right thing depending on what the device type is.
> + }
> +
> if (!conn)
> continue;
>
Regards
Marcel
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK
2012-10-09 14:49 ` Marcel Holtmann
@ 2012-10-10 8:22 ` Andrei Emeltchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 8:22 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: linux-bluetooth
Hi Marcel,
On Tue, Oct 09, 2012 at 04:49:18PM +0200, Marcel Holtmann wrote:
> Hi Andrei,
>
> > Add handling blocks count for AMP link.
> >
> > Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> > ---
> > net/bluetooth/hci_event.c | 12 ++++++++++--
> > 1 file changed, 10 insertions(+), 2 deletions(-)
> >
> > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> > index 82e478a..c479732 100644
> > --- a/net/bluetooth/hci_event.c
> > +++ b/net/bluetooth/hci_event.c
> > @@ -2698,13 +2698,21 @@ static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
> >
> > for (i = 0; i < ev->num_hndl; i++) {
> > struct hci_comp_blocks_info *info = &ev->handles[i];
> > - struct hci_conn *conn;
> > + struct hci_conn *conn = NULL;
> > + struct hci_chan *chan;
> > __u16 handle, block_count;
> >
> > handle = __le16_to_cpu(info->handle);
> > block_count = __le16_to_cpu(info->blocks);
> >
> > - conn = hci_conn_hash_lookup_handle(hdev, handle);
> > + if (hdev->dev_type == HCI_BREDR) {
> > + conn = hci_conn_hash_lookup_handle(hdev, handle);
> > + } else {
> > + chan = hci_chan_lookup_handle_all(hdev, handle);
> > + if (chan)
> > + conn = chan->conn;
>
> Just in case, we better use a switch statement here.
>
> And now coming to think about it, do we ever need the hci_chan anyway.
For AMP hchan represents logical link so it is needed.
> Then why not have a function that looks up the hci_conn.
>
> Maybe introduce a new hci_conn_lookup_handle(hdev, handle) and it will
> do the right thing depending on what the device type is.
This looks good, will do this way.
Best regards
Andrei Emeltchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure
2012-10-09 14:46 ` Marcel Holtmann
@ 2012-10-10 8:34 ` Andrei Emeltchenko
2012-10-10 10:07 ` Marcel Holtmann
0 siblings, 1 reply; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 8:34 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: linux-bluetooth
Hi Marcel,
On Tue, Oct 09, 2012 at 04:46:31PM +0200, Marcel Holtmann wrote:
...
> > -
> > +struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle);
> > +struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev,
> > + __u16 handle);
>
> this naming is pretty bad. I have no idea what one function does
> different compared to the other. Especially since none of them take a
> hci_chan as argument, but start with that prefix.
>
> Would be the naming hci_conn_lookup_chan be a lot clearer? Or maybe
> hci_chan_lookup_from_dev or similar.
So are names like:
hci_conn_lookup_hchan_by_handle
hci_conn_lookup_hchan_from_hdev
better?
...
> > +struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle)
> > +{
> > + struct hci_chan *hchan;
> > +
> > + list_for_each_entry(hchan, &hcon->chan_list, list) {
> > + if (hchan->handle == handle)
> > + return hchan;
> > + }
> > +
> > + return NULL;
> > +}
>
> Since this function is unprotected, you better make this __hci_....
>
> And on a different note. It is not used at all. So why is this public
> anyway?
I will make it static.
...
> > + rcu_read_lock();
> > +
> > + list_for_each_entry_rcu(hcon, &h->list, list) {
> > + struct hci_chan *hchan;
> > +
> > + hchan = hci_chan_lookup_handle(hcon, handle);
> > + if (hchan) {
> > + rcu_read_unlock();
> > + return hchan;
>
> Please use break here. Have a global hchan variable assigned to NULL and
> just break here.
OK.
Best regards
Andrei Emeltchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure
2012-10-10 8:34 ` Andrei Emeltchenko
@ 2012-10-10 10:07 ` Marcel Holtmann
2012-10-10 10:12 ` Andrei Emeltchenko
0 siblings, 1 reply; 23+ messages in thread
From: Marcel Holtmann @ 2012-10-10 10:07 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth
Hi Andrei,
> > > -
> > > +struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle);
> > > +struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev,
> > > + __u16 handle);
> >
> > this naming is pretty bad. I have no idea what one function does
> > different compared to the other. Especially since none of them take a
> > hci_chan as argument, but start with that prefix.
> >
> > Would be the naming hci_conn_lookup_chan be a lot clearer? Or maybe
> > hci_chan_lookup_from_dev or similar.
>
> So are names like:
>
> hci_conn_lookup_hchan_by_handle
since this one is only internal, you better have a shortcut version as
just a static helper inside that code.
> hci_conn_lookup_hchan_from_hdev
If we follow our naming convention then hci_chan_lookup_from_dev would
come closest. However since you only need one of these, then
hci_chan_lookup_handle would be fine and in sync with how we named
everything else.
I rather not have the prefixing h everywhere that we use in variable
names. That should be really only for variable names.
Regards
Marcel
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure
2012-10-10 10:07 ` Marcel Holtmann
@ 2012-10-10 10:12 ` Andrei Emeltchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 10:12 UTC (permalink / raw)
To: Marcel Holtmann; +Cc: linux-bluetooth
Hi Marcel,
On Wed, Oct 10, 2012 at 12:07:56PM +0200, Marcel Holtmann wrote:
> Hi Andrei,
>
> > > > -
> > > > +struct hci_chan *hci_chan_lookup_handle(struct hci_conn *hcon, __u16 handle);
> > > > +struct hci_chan *hci_chan_lookup_handle_all(struct hci_dev *hdev,
> > > > + __u16 handle);
> > >
> > > this naming is pretty bad. I have no idea what one function does
> > > different compared to the other. Especially since none of them take a
> > > hci_chan as argument, but start with that prefix.
> > >
> > > Would be the naming hci_conn_lookup_chan be a lot clearer? Or maybe
> > > hci_chan_lookup_from_dev or similar.
> >
> > So are names like:
> >
> > hci_conn_lookup_hchan_by_handle
>
> since this one is only internal, you better have a shortcut version as
> just a static helper inside that code.
OK, will name this like __hci_chan_lookup_handle
>
> > hci_conn_lookup_hchan_from_hdev
>
> If we follow our naming convention then hci_chan_lookup_from_dev would
> come closest. However since you only need one of these, then
> hci_chan_lookup_handle would be fine and in sync with how we named
> everything else.
then this would be:
hci_chan_lookup_handle
Best regards
Andrei Emeltchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCHv1 0/6] Handle AMP_LINK
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (5 preceding siblings ...)
2012-10-08 14:52 ` [RFCv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
` (6 more replies)
6 siblings, 7 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add code for handling High Speed link
Changes:
* v1: Fixes according to Marcel's review
* RFCv1: Initial release
Andrei Emeltchenko (6):
Bluetooth: Allow to set flush timeout
Bluetooth: AMP: Handle AMP_LINK timeout
Bluetooth: AMP: Add handle to hci_chan structure
Bluetooth: AMP: Handle number of compl blocks for AMP_LINK
Bluetooth: AMP: Handle AMP_LINK connection
Bluetooth: AMP: Hanlde AMP_LINK case in conn_put
include/net/bluetooth/hci_core.h | 35 ++++++++++++++++++---
net/bluetooth/hci_conn.c | 64 ++++++++++++++++++++++++++++++++++++--
net/bluetooth/hci_core.c | 22 +++++++++++--
net/bluetooth/hci_event.c | 26 ++++++++++++++--
net/bluetooth/l2cap_sock.c | 1 +
5 files changed, 136 insertions(+), 12 deletions(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCHv1 1/6] Bluetooth: Allow to set flush timeout
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
` (5 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/l2cap_sock.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index af467ce..ed2dfc9 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -529,6 +529,7 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us
chan->fcs = opts.fcs;
chan->max_tx = opts.max_tx;
chan->tx_win = opts.txwin_size;
+ chan->flush_to = opts.flush_to;
break;
case L2CAP_LM:
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCHv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
` (4 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
When AMP_LINK timeouts execute HCI_OP_DISCONN_PHY_LINK as analog to
HCI_OP_DISCONNECT for ACL_LINK.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 2 ++
net/bluetooth/hci_conn.c | 32 +++++++++++++++++++++++++++++---
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 90ae4f0..dfa108c 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -285,6 +285,8 @@ struct hci_dev {
int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
};
+#define HCI_PHY_HANDLE(handle) (handle & 0xff)
+
struct hci_conn {
struct list_head list;
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 53202f6..6487579 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -130,6 +130,20 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
}
+static void hci_amp_disconn(struct hci_conn *conn, __u8 reason)
+{
+ struct hci_cp_disconn_phy_link cp;
+
+ BT_DBG("hcon %p", conn);
+
+ conn->state = BT_DISCONN;
+
+ cp.phy_handle = HCI_PHY_HANDLE(conn->handle);
+ cp.reason = reason;
+ hci_send_cmd(conn->hdev, HCI_OP_DISCONN_PHY_LINK,
+ sizeof(cp), &cp);
+}
+
static void hci_add_sco(struct hci_conn *conn, __u16 handle)
{
struct hci_dev *hdev = conn->hdev;
@@ -230,11 +244,24 @@ void hci_sco_setup(struct hci_conn *conn, __u8 status)
}
}
+static void hci_conn_disconnect(struct hci_conn *conn)
+{
+ __u8 reason = hci_proto_disconn_ind(conn);
+
+ switch (conn->type) {
+ case ACL_LINK:
+ hci_acl_disconn(conn, reason);
+ break;
+ case AMP_LINK:
+ hci_amp_disconn(conn, reason);
+ break;
+ }
+}
+
static void hci_conn_timeout(struct work_struct *work)
{
struct hci_conn *conn = container_of(work, struct hci_conn,
disc_work.work);
- __u8 reason;
BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
@@ -253,8 +280,7 @@ static void hci_conn_timeout(struct work_struct *work)
break;
case BT_CONFIG:
case BT_CONNECTED:
- reason = hci_proto_disconn_ind(conn);
- hci_acl_disconn(conn, reason);
+ hci_conn_disconnect(conn);
break;
default:
conn->state = BT_CLOSED;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCHv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 4/6] Bluetooth: AMP: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
` (3 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
hci_chan will be identified by handle used in logical link creation
process. This handle is used in AMP ACL-U packet handle field.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 3 ++-
net/bluetooth/hci_conn.c | 32 ++++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index dfa108c..b697ef3 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -350,7 +350,7 @@ struct hci_conn {
struct hci_chan {
struct list_head list;
-
+ __u16 handle;
struct hci_conn *conn;
struct sk_buff_head data_q;
unsigned int sent;
@@ -567,6 +567,7 @@ void hci_conn_check_pending(struct hci_dev *hdev);
struct hci_chan *hci_chan_create(struct hci_conn *conn);
void hci_chan_del(struct hci_chan *chan);
void hci_chan_list_flush(struct hci_conn *conn);
+struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
__u8 dst_type, __u8 sec_level, __u8 auth_type);
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 6487579..fe64621 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -989,3 +989,35 @@ void hci_chan_list_flush(struct hci_conn *conn)
list_for_each_entry_safe(chan, n, &conn->chan_list, list)
hci_chan_del(chan);
}
+
+static struct hci_chan *__hci_chan_lookup_handle(struct hci_conn *hcon,
+ __u16 handle)
+{
+ struct hci_chan *hchan;
+
+ list_for_each_entry(hchan, &hcon->chan_list, list) {
+ if (hchan->handle == handle)
+ return hchan;
+ }
+
+ return NULL;
+}
+
+struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle)
+{
+ struct hci_conn_hash *h = &hdev->conn_hash;
+ struct hci_conn *hcon;
+ struct hci_chan *hchan = NULL;
+
+ rcu_read_lock();
+
+ list_for_each_entry_rcu(hcon, &h->list, list) {
+ hchan = __hci_chan_lookup_handle(hcon, handle);
+ if (hchan)
+ break;
+ }
+
+ rcu_read_unlock();
+
+ return hchan;
+}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCHv1 4/6] Bluetooth: AMP: Handle number of compl blocks for AMP_LINK
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (2 preceding siblings ...)
2012-10-10 14:38 ` [PATCHv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection Andrei Emeltchenko
` (2 subsequent siblings)
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Add handling blocks count for AMP link.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
net/bluetooth/hci_event.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 82e478a..5c0b6c1 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -2677,6 +2677,27 @@ static void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
queue_work(hdev->workqueue, &hdev->tx_work);
}
+static struct hci_conn *__hci_conn_lookup_handle(struct hci_dev *hdev,
+ __u16 handle)
+{
+ struct hci_chan *chan;
+
+ switch (hdev->dev_type) {
+ case HCI_BREDR:
+ return hci_conn_hash_lookup_handle(hdev, handle);
+ case HCI_AMP:
+ chan = hci_chan_lookup_handle(hdev, handle);
+ if (chan)
+ return chan->conn;
+ break;
+ default:
+ BT_ERR("%s unknown dev_type %d", hdev->name, hdev->dev_type);
+ break;
+ }
+
+ return NULL;
+}
+
static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
struct hci_ev_num_comp_blocks *ev = (void *) skb->data;
@@ -2698,13 +2719,13 @@ static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
for (i = 0; i < ev->num_hndl; i++) {
struct hci_comp_blocks_info *info = &ev->handles[i];
- struct hci_conn *conn;
+ struct hci_conn *conn = NULL;
__u16 handle, block_count;
handle = __le16_to_cpu(info->handle);
block_count = __le16_to_cpu(info->blocks);
- conn = hci_conn_hash_lookup_handle(hdev, handle);
+ conn = __hci_conn_lookup_handle(hdev, handle);
if (!conn)
continue;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCHv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (3 preceding siblings ...)
2012-10-10 14:38 ` [PATCHv1 4/6] Bluetooth: AMP: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
2012-10-10 15:28 ` [PATCHv1 0/6] Handle AMP_LINK Marcel Holtmann
6 siblings, 0 replies; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
AMP_LINK represents physical link between AMP controllers.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 13 +++++++++++++
net/bluetooth/hci_core.c | 22 +++++++++++++++++++---
net/bluetooth/hci_event.c | 1 +
3 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index b697ef3..d5ed054 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -73,6 +73,7 @@ struct discovery_state {
struct hci_conn_hash {
struct list_head list;
unsigned int acl_num;
+ unsigned int amp_num;
unsigned int sco_num;
unsigned int le_num;
};
@@ -449,6 +450,9 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
case ACL_LINK:
h->acl_num++;
break;
+ case AMP_LINK:
+ h->amp_num++;
+ break;
case LE_LINK:
h->le_num++;
break;
@@ -470,6 +474,9 @@ static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
case ACL_LINK:
h->acl_num--;
break;
+ case AMP_LINK:
+ h->amp_num--;
+ break;
case LE_LINK:
h->le_num--;
break;
@@ -486,6 +493,8 @@ static inline unsigned int hci_conn_num(struct hci_dev *hdev, __u8 type)
switch (type) {
case ACL_LINK:
return h->acl_num;
+ case AMP_LINK:
+ return h->amp_num;
case LE_LINK:
return h->le_num;
case SCO_LINK:
@@ -801,6 +810,10 @@ static inline void hci_proto_disconn_cfm(struct hci_conn *conn, __u8 reason)
sco_disconn_cfm(conn, reason);
break;
+ /* L2CAP would be handled for BREDR chan */
+ case AMP_LINK:
+ break;
+
default:
BT_ERR("unknown link type %d", conn->type);
break;
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index bd26cb5..2e72c41 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2379,6 +2379,9 @@ static struct hci_chan *hci_chan_sent(struct hci_dev *hdev, __u8 type,
case ACL_LINK:
cnt = hdev->acl_cnt;
break;
+ case AMP_LINK:
+ cnt = hdev->block_cnt;
+ break;
case SCO_LINK:
case ESCO_LINK:
cnt = hdev->sco_cnt;
@@ -2508,11 +2511,19 @@ static void hci_sched_acl_blk(struct hci_dev *hdev)
struct hci_chan *chan;
struct sk_buff *skb;
int quote;
+ u8 type;
__check_timeout(hdev, cnt);
+ BT_DBG("%s", hdev->name);
+
+ if (hdev->dev_type == HCI_AMP)
+ type = AMP_LINK;
+ else
+ type = ACL_LINK;
+
while (hdev->block_cnt > 0 &&
- (chan = hci_chan_sent(hdev, ACL_LINK, "e))) {
+ (chan = hci_chan_sent(hdev, type, "e))) {
u32 priority = (skb_peek(&chan->data_q))->priority;
while (quote > 0 && (skb = skb_peek(&chan->data_q))) {
int blocks;
@@ -2545,14 +2556,19 @@ static void hci_sched_acl_blk(struct hci_dev *hdev)
}
if (cnt != hdev->block_cnt)
- hci_prio_recalculate(hdev, ACL_LINK);
+ hci_prio_recalculate(hdev, type);
}
static void hci_sched_acl(struct hci_dev *hdev)
{
BT_DBG("%s", hdev->name);
- if (!hci_conn_num(hdev, ACL_LINK))
+ /* No ACL link over BR/EDR controller */
+ if (!hci_conn_num(hdev, ACL_LINK) && hdev->dev_type == HCI_BREDR)
+ return;
+
+ /* No AMP link over AMP controller */
+ if (!hci_conn_num(hdev, AMP_LINK) && hdev->dev_type == HCI_AMP)
return;
switch (hdev->flow_ctl_mode) {
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 5c0b6c1..0383635 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -2733,6 +2733,7 @@ static void hci_num_comp_blocks_evt(struct hci_dev *hdev, struct sk_buff *skb)
switch (conn->type) {
case ACL_LINK:
+ case AMP_LINK:
hdev->block_cnt += block_count;
if (hdev->block_cnt > hdev->num_blocks)
hdev->block_cnt = hdev->num_blocks;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCHv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (4 preceding siblings ...)
2012-10-10 14:38 ` [PATCHv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection Andrei Emeltchenko
@ 2012-10-10 14:38 ` Andrei Emeltchenko
2012-10-11 6:36 ` Gustavo Padovan
2012-10-10 15:28 ` [PATCHv1 0/6] Handle AMP_LINK Marcel Holtmann
6 siblings, 1 reply; 23+ messages in thread
From: Andrei Emeltchenko @ 2012-10-10 14:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Handle AMP link when setting up disconnect timeout.
Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
---
include/net/bluetooth/hci_core.h | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index d5ed054..9fe8e2d 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -605,7 +605,10 @@ static inline void hci_conn_put(struct hci_conn *conn)
if (atomic_dec_and_test(&conn->refcnt)) {
unsigned long timeo;
- if (conn->type == ACL_LINK || conn->type == LE_LINK) {
+
+ switch (conn->type) {
+ case ACL_LINK:
+ case LE_LINK:
del_timer(&conn->idle_timer);
if (conn->state == BT_CONNECTED) {
timeo = conn->disc_timeout;
@@ -614,12 +617,20 @@ static inline void hci_conn_put(struct hci_conn *conn)
} else {
timeo = msecs_to_jiffies(10);
}
- } else {
+ break;
+
+ case AMP_LINK:
+ timeo = conn->disc_timeout;
+ break;
+
+ default:
timeo = msecs_to_jiffies(10);
+ break;
}
+
cancel_delayed_work(&conn->disc_work);
queue_delayed_work(conn->hdev->workqueue,
- &conn->disc_work, timeo);
+ &conn->disc_work, timeo);
}
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCHv1 0/6] Handle AMP_LINK
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
` (5 preceding siblings ...)
2012-10-10 14:38 ` [PATCHv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
@ 2012-10-10 15:28 ` Marcel Holtmann
6 siblings, 0 replies; 23+ messages in thread
From: Marcel Holtmann @ 2012-10-10 15:28 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth
Hi Andrei,
> Add code for handling High Speed link
>
> Changes:
> * v1: Fixes according to Marcel's review
> * RFCv1: Initial release
>
> Andrei Emeltchenko (6):
> Bluetooth: Allow to set flush timeout
> Bluetooth: AMP: Handle AMP_LINK timeout
> Bluetooth: AMP: Add handle to hci_chan structure
> Bluetooth: AMP: Handle number of compl blocks for AMP_LINK
> Bluetooth: AMP: Handle AMP_LINK connection
> Bluetooth: AMP: Hanlde AMP_LINK case in conn_put
patches look fine to me.
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Regards
Marcel
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCHv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put
2012-10-10 14:38 ` [PATCHv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
@ 2012-10-11 6:36 ` Gustavo Padovan
0 siblings, 0 replies; 23+ messages in thread
From: Gustavo Padovan @ 2012-10-11 6:36 UTC (permalink / raw)
To: Andrei Emeltchenko; +Cc: linux-bluetooth
Hi Andrei,
* Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com> [2012-10-10 17:38:31 +0300]:
> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
>
> Handle AMP link when setting up disconnect timeout.
>
> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
> include/net/bluetooth/hci_core.h | 17 ++++++++++++++---
> 1 file changed, 14 insertions(+), 3 deletions(-)
All 6 patches have been applied to bluetooth-next. Thanks.
Gustavo
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2012-10-11 6:36 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-08 14:52 [RFCv1 0/6] Handle AMP_LINK Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
2012-10-09 14:39 ` Marcel Holtmann
2012-10-08 14:52 ` [RFCv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
2012-10-09 14:46 ` Marcel Holtmann
2012-10-10 8:34 ` Andrei Emeltchenko
2012-10-10 10:07 ` Marcel Holtmann
2012-10-10 10:12 ` Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 4/6] Bluetooth: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
2012-10-09 14:49 ` Marcel Holtmann
2012-10-10 8:22 ` Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection Andrei Emeltchenko
2012-10-08 14:52 ` [RFCv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 0/6] Handle AMP_LINK Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 1/6] Bluetooth: Allow to set flush timeout Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 2/6] Bluetooth: AMP: Handle AMP_LINK timeout Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 3/6] Bluetooth: AMP: Add handle to hci_chan structure Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 4/6] Bluetooth: AMP: Handle number of compl blocks for AMP_LINK Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 5/6] Bluetooth: AMP: Handle AMP_LINK connection Andrei Emeltchenko
2012-10-10 14:38 ` [PATCHv1 6/6] Bluetooth: AMP: Hanlde AMP_LINK case in conn_put Andrei Emeltchenko
2012-10-11 6:36 ` Gustavo Padovan
2012-10-10 15:28 ` [PATCHv1 0/6] Handle AMP_LINK Marcel Holtmann
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.