All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gustavo Padovan <gustavo@padovan.org>
To: Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [RFCv5 01/26] Bluetooth: Add set_err to state_change callback
Date: Sun, 25 Mar 2012 13:48:02 -0300	[thread overview]
Message-ID: <20120325164802.GF3106@joana> (raw)
In-Reply-To: <1332519246-16656-2-git-send-email-Andrei.Emeltchenko.news@gmail.com>

Hi Andrei,

* Andrei Emeltchenko <Andrei.Emeltchenko.news@gmail.com> [2012-03-23 18:13:41 +0200]:

> From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> 
> There are several places in the code where l2cap_state_change and
> l2cap_chan_set_err used together. With combining them we remove
> socket lock in l2cap_send_disconn_req and simplify code in couple
> of other places with a price of adding extra parameter err to
> state_change.
> 
> Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
> ---
>  include/net/bluetooth/l2cap.h |    5 +++-
>  net/bluetooth/l2cap_core.c    |   56 ++++++++++++++++++----------------------
>  net/bluetooth/l2cap_sock.c    |    8 +++++-
>  3 files changed, 36 insertions(+), 33 deletions(-)
> 
> diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
> index 35334a0..9287c24 100644
> --- a/include/net/bluetooth/l2cap.h
> +++ b/include/net/bluetooth/l2cap.h
> @@ -506,7 +506,8 @@ struct l2cap_ops {
>  	struct l2cap_chan	*(*new_connection) (void *data);
>  	int			(*recv) (void *data, struct sk_buff *skb);
>  	void			(*close) (void *data);
> -	void			(*state_change) (void *data, int state);
> +	void			(*state_change) (void *data, int state,
> +								int err);
>  	struct sk_buff		*(*alloc_skb) (struct l2cap_chan *chan,
>  					unsigned long len, int nb, int *err);
>  
> @@ -867,4 +868,6 @@ int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len,
>  void l2cap_chan_busy(struct l2cap_chan *chan, int busy);
>  int l2cap_chan_check_security(struct l2cap_chan *chan);
>  
> +void __l2cap_chan_set_err(struct l2cap_chan *chan, int err);
> +
>  #endif /* __L2CAP_H */
> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
> index e66c9da..5b9a667 100644
> --- a/net/bluetooth/l2cap_core.c
> +++ b/net/bluetooth/l2cap_core.c
> @@ -199,25 +199,25 @@ static u16 l2cap_alloc_cid(struct l2cap_conn *conn)
>  	return 0;
>  }
>  
> -static void __l2cap_state_change(struct l2cap_chan *chan, int state)
> +static void __l2cap_state_change(struct l2cap_chan *chan, int state, int err)
>  {
>  	BT_DBG("chan %p %s -> %s", chan, state_to_string(chan->state),
>  						state_to_string(state));
>  
>  	chan->state = state;
> -	chan->ops->state_change(chan->data, state);
> +	chan->ops->state_change(chan->data, state, err);
>  }
>  
> -static void l2cap_state_change(struct l2cap_chan *chan, int state)
> +static inline void l2cap_state_change(struct l2cap_chan *chan, int state, int err)
>  {
>  	struct sock *sk = chan->sk;
>  
>  	lock_sock(sk);
> -	__l2cap_state_change(chan, state);
> +	__l2cap_state_change(chan, state, err);
>  	release_sock(sk);
>  }
>  
> -static inline void __l2cap_chan_set_err(struct l2cap_chan *chan, int err)
> +void __l2cap_chan_set_err(struct l2cap_chan *chan, int err)
>  {
>  	struct sock *sk = chan->sk;
>  
> @@ -377,11 +377,9 @@ static void l2cap_chan_del(struct l2cap_chan *chan, int err)
>  
>  	lock_sock(sk);
>  
> -	__l2cap_state_change(chan, BT_CLOSED);
> -	sock_set_flag(sk, SOCK_ZAPPED);
> +	__l2cap_state_change(chan, BT_CLOSED, err);
>  
> -	if (err)
> -		__l2cap_chan_set_err(chan, err);
> +	sock_set_flag(sk, SOCK_ZAPPED);
>  
>  	if (parent) {
>  		bt_accept_unlink(sk);
> @@ -445,7 +443,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
>  		lock_sock(sk);
>  		l2cap_chan_cleanup_listen(sk);
>  
> -		__l2cap_state_change(chan, BT_CLOSED);
> +		__l2cap_state_change(chan, BT_CLOSED, 0);
>  		sock_set_flag(sk, SOCK_ZAPPED);
>  		release_sock(sk);
>  		break;
> @@ -470,7 +468,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason)
>  				result = L2CAP_CR_SEC_BLOCK;
>  			else
>  				result = L2CAP_CR_BAD_PSM;
> -			l2cap_state_change(chan, BT_DISCONN);
> +			l2cap_state_change(chan, BT_DISCONN, 0);
>  
>  			rsp.scid   = cpu_to_le16(chan->dcid);
>  			rsp.dcid   = cpu_to_le16(chan->scid);
> @@ -724,7 +722,6 @@ static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask)
>  
>  static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *chan, int err)
>  {
> -	struct sock *sk = chan->sk;
>  	struct l2cap_disconn_req req;
>  
>  	if (!conn)
> @@ -741,10 +738,7 @@ static void l2cap_send_disconn_req(struct l2cap_conn *conn, struct l2cap_chan *c
>  	l2cap_send_cmd(conn, l2cap_get_ident(conn),
>  			L2CAP_DISCONN_REQ, sizeof(req), &req);
>  
> -	lock_sock(sk);
> -	__l2cap_state_change(chan, BT_DISCONN);
> -	__l2cap_chan_set_err(chan, err);
> -	release_sock(sk);
> +	l2cap_state_change(chan, BT_DISCONN, err);
>  }
>  
>  /* ---- L2CAP connections ---- */
> @@ -799,7 +793,7 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
>  						parent->sk_data_ready(parent, 0);
>  
>  				} else {
> -					__l2cap_state_change(chan, BT_CONFIG);
> +					__l2cap_state_change(chan, BT_CONFIG, 0);
>  					rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
>  					rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
>  				}
> @@ -903,7 +897,7 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)
>  
>  	__set_chan_timer(chan, sk->sk_sndtimeo);
>  
> -	__l2cap_state_change(chan, BT_CONNECTED);
> +	__l2cap_state_change(chan, BT_CONNECTED, 0);
>  	parent->sk_data_ready(parent, 0);
>  
>  clean:
> @@ -924,7 +918,7 @@ static void l2cap_chan_ready(struct l2cap_chan *chan)
>  	chan->conf_state = 0;
>  	__clear_chan_timer(chan);
>  
> -	__l2cap_state_change(chan, BT_CONNECTED);
> +	__l2cap_state_change(chan, BT_CONNECTED, 0);
>  	sk->sk_state_change(sk);
>  
>  	if (parent)
> @@ -959,7 +953,7 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
>  			struct sock *sk = chan->sk;
>  			__clear_chan_timer(chan);
>  			lock_sock(sk);
> -			__l2cap_state_change(chan, BT_CONNECTED);
> +			__l2cap_state_change(chan, BT_CONNECTED, 0);
>  			sk->sk_state_change(sk);
>  			release_sock(sk);
>  
> @@ -1243,14 +1237,14 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *d
>  	l2cap_chan_add(conn, chan);
>  	l2cap_chan_lock(chan);
>  
> -	l2cap_state_change(chan, BT_CONNECT);
> +	l2cap_state_change(chan, BT_CONNECT, 0);
>  	__set_chan_timer(chan, sk->sk_sndtimeo);
>  
>  	if (hcon->state == BT_CONNECTED) {
>  		if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
>  			__clear_chan_timer(chan);
>  			if (l2cap_chan_check_security(chan))
> -				l2cap_state_change(chan, BT_CONNECTED);
> +				l2cap_state_change(chan, BT_CONNECTED, 0);
>  		} else
>  			l2cap_do_start(chan);
>  	}
> @@ -2707,22 +2701,22 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd
>  	if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE) {
>  		if (l2cap_chan_check_security(chan)) {
>  			if (bt_sk(sk)->defer_setup) {
> -				__l2cap_state_change(chan, BT_CONNECT2);
> +				__l2cap_state_change(chan, BT_CONNECT2, 0);
>  				result = L2CAP_CR_PEND;
>  				status = L2CAP_CS_AUTHOR_PEND;
>  				parent->sk_data_ready(parent, 0);
>  			} else {
> -				__l2cap_state_change(chan, BT_CONFIG);
> +				__l2cap_state_change(chan, BT_CONFIG, 0);
>  				result = L2CAP_CR_SUCCESS;
>  				status = L2CAP_CS_NO_INFO;
>  			}
>  		} else {
> -			__l2cap_state_change(chan, BT_CONNECT2);
> +			__l2cap_state_change(chan, BT_CONNECT2, 0);
>  			result = L2CAP_CR_PEND;
>  			status = L2CAP_CS_AUTHEN_PEND;
>  		}
>  	} else {
> -		__l2cap_state_change(chan, BT_CONNECT2);
> +		__l2cap_state_change(chan, BT_CONNECT2, 0);
>  		result = L2CAP_CR_PEND;
>  		status = L2CAP_CS_NO_INFO;
>  	}
> @@ -2801,7 +2795,7 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd
>  
>  	switch (result) {
>  	case L2CAP_CR_SUCCESS:
> -		l2cap_state_change(chan, BT_CONFIG);
> +		l2cap_state_change(chan, BT_CONFIG, 0);
>  		chan->ident = 0;
>  		chan->dcid = dcid;
>  		clear_bit(CONF_CONNECT_PEND, &chan->conf_state);
> @@ -2913,7 +2907,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
>  	if (test_bit(CONF_INPUT_DONE, &chan->conf_state)) {
>  		set_default_fcs(chan);
>  
> -		l2cap_state_change(chan, BT_CONNECTED);
> +		l2cap_state_change(chan, BT_CONNECTED, 0);
>  
>  		chan->next_tx_seq = 0;
>  		chan->expected_tx_seq = 0;
> @@ -3044,7 +3038,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
>  	if (test_bit(CONF_OUTPUT_DONE, &chan->conf_state)) {
>  		set_default_fcs(chan);
>  
> -		l2cap_state_change(chan, BT_CONNECTED);
> +		l2cap_state_change(chan, BT_CONNECTED, 0);
>  		chan->next_tx_seq = 0;
>  		chan->expected_tx_seq = 0;
>  		skb_queue_head_init(&chan->tx_q);
> @@ -4614,12 +4608,12 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
>  					if (parent)
>  						parent->sk_data_ready(parent, 0);
>  				} else {
> -					__l2cap_state_change(chan, BT_CONFIG);
> +					__l2cap_state_change(chan, BT_CONFIG, 0);
>  					res = L2CAP_CR_SUCCESS;
>  					stat = L2CAP_CS_NO_INFO;
>  				}
>  			} else {
> -				__l2cap_state_change(chan, BT_DISCONN);
> +				__l2cap_state_change(chan, BT_DISCONN, 0);
>  				__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
>  				res = L2CAP_CR_SEC_BLOCK;
>  				stat = L2CAP_CS_NO_INFO;
> diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
> index 29122ed..7e26d63 100644
> --- a/net/bluetooth/l2cap_sock.c
> +++ b/net/bluetooth/l2cap_sock.c
> @@ -919,11 +919,17 @@ static void l2cap_sock_close_cb(void *data)
>  	l2cap_sock_kill(sk);
>  }
>  
> -static void l2cap_sock_state_change_cb(void *data, int state)
> +static void l2cap_sock_state_change_cb(void *data, int state, int err)
>  {
>  	struct sock *sk = data;
>  
>  	sk->sk_state = state;
> +
> +	if (err) {
> +		struct l2cap_chan *chan = l2cap_pi(sk)->chan;
> +
> +		__l2cap_chan_set_err(chan, err);

Why are you calling back l2cap_core.c here? It doesn't make any sense. You
are adding a extra loop in the code.

	Gustavo

  reply	other threads:[~2012-03-25 16:48 UTC|newest]

Thread overview: 100+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-23 16:13 [RFCv5 00/26] RFC Bluetooth A2MP implementation Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 01/26] Bluetooth: Add set_err to state_change callback Andrei Emeltchenko
2012-03-25 16:48   ` Gustavo Padovan [this message]
2012-03-23 16:13 ` [RFCv5 02/26] Bluetooth: Lock sk only if exist in state_change Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 03/26] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-03-25 17:12   ` Gustavo Padovan
2012-03-26  9:27     ` Andrei Emeltchenko
2012-03-27 15:54       ` Gustavo Padovan
2012-03-23 16:13 ` [RFCv5 04/26] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 05/26] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 06/26] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-03-25 17:16   ` Gustavo Padovan
2012-03-26 11:59     ` Andrei Emeltchenko
2012-03-27 16:06       ` Gustavo Padovan
2012-03-23 16:13 ` [RFCv5 07/26] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 08/26] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 09/26] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 10/26] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 11/26] Bluetooth: A2MP: Helper functions to count HCI devs Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 12/26] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 13/26] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 14/26] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 15/26] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 16/26] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 17/26] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 18/26] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-03-23 16:13 ` [RFCv5 19/26] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 20/26] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 21/26] Bluetooth: physical link HCI interface to AMP Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 22/26] Bluetooth: Define AMP controller statuses Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 23/26] Bluetooth: General HCI callback implementation Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 24/26] Bluetooth: Process HCI callbacks in a workqueue Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 25/26] Bluetooth: AMP: Use HCI callback for Read AMP Info Andrei Emeltchenko
2012-03-23 16:14 ` [RFCv5 26/26] Bluetooth: AMP: Read Local Assoc support Andrei Emeltchenko
2012-03-28 13:31   ` [RFCv6 00/26] RFC Bluetooth A2MP implementation Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 01/26] Bluetooth: Add Read Local AMP Info to init Andrei Emeltchenko
2012-04-06 22:38       ` Gustavo Padovan
2012-03-28 13:31     ` [RFCv6 02/26] Bluetooth: Adds set_default function in L2CAP setup Andrei Emeltchenko
2012-04-06 22:39       ` Gustavo Padovan
2012-03-28 13:31     ` [RFCv6 03/26] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 04/26] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 05/26] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-04-06 22:44       ` Gustavo Padovan
2012-04-11 13:33         ` Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 06/26] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-04-06 23:20       ` Gustavo Padovan
2012-04-12  8:00         ` Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 07/26] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 08/26] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 09/26] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 10/26] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-04-06 23:23       ` Gustavo Padovan
2012-04-12  8:06         ` Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 11/26] Bluetooth: A2MP: Helper functions to count HCI devs Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 12/26] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-04-06 23:55       ` Gustavo Padovan
2012-03-28 13:31     ` [RFCv6 13/26] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 14/26] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 15/26] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 16/26] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 17/26] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 18/26] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 19/26] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 20/26] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 21/26] Bluetooth: physical link HCI interface to AMP Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 22/26] Bluetooth: Define AMP controller statuses Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 23/26] Bluetooth: General HCI callback implementation Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 24/26] Bluetooth: Process HCI callbacks in a workqueue Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 25/26] Bluetooth: AMP: Use HCI callback for Read AMP Info Andrei Emeltchenko
2012-03-28 13:31     ` [RFCv6 26/26] Bluetooth: AMP: Read Local Assoc support Andrei Emeltchenko
2012-04-20 11:09   ` [RFCv7 00/23] RFC Bluetooth A2MP implementation Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 01/23] Bluetooth: A2MP: Create A2MP channel Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 02/23] Bluetooth: A2MP: AMP Manager basic functions Andrei Emeltchenko
2012-04-20 14:51       ` Ulisses Furquim
2012-04-23  7:22         ` Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 03/23] Bluetooth: A2MP: Build and Send msg helpers Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 04/23] Bluetooth: A2MP: Add chan callbacks Andrei Emeltchenko
2012-04-20 14:09       ` Ulisses Furquim
2012-04-23  7:26         ` Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 05/23] Bluetooth: A2MP: Definitions for A2MP commands Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 06/23] Bluetooth: A2MP: Define A2MP status codes Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 07/23] Bluetooth: A2MP: Process A2MP messages Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 08/23] Bluetooth: A2MP: Process A2MP Command Reject Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 09/23] Bluetooth: A2MP: Process A2MP Discover Request Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 10/23] Bluetooth: A2MP: Process A2MP Change Notify Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 11/23] Bluetooth: A2MP: Process A2MP Get Info Request Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 12/23] Bluetooth: A2MP: Process A2MP Get AMP Assoc Request Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 13/23] Bluetooth: A2MP: Process A2MP Create Physlink Request Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 14/23] Bluetooth: A2MP: Process A2MP Disc " Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 15/23] Bluetooth: A2MP: Process A2MP Command Responses Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 16/23] Bluetooth: A2MP: Handling fixed channels Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 17/23] Bluetooth: A2MP: Manage incoming connections Andrei Emeltchenko
2012-04-25 19:58       ` Gustavo Padovan
2012-04-26  8:29         ` Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 18/23] Bluetooth: physical link HCI interface to AMP Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 19/23] Bluetooth: Define AMP controller statuses Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 20/23] Bluetooth: General HCI callback implementation Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 21/23] Bluetooth: Process HCI callbacks in a workqueue Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 22/23] Bluetooth: AMP: Use HCI callback for Read AMP Info Andrei Emeltchenko
2012-04-20 11:09     ` [RFCv7 23/23] Bluetooth: AMP: Read Local Assoc support Andrei Emeltchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120325164802.GF3106@joana \
    --to=gustavo@padovan.org \
    --cc=Andrei.Emeltchenko.news@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.