diff mbox series

Bluetooth: Fix - During le_conn_timeout disable EXT_ADV

Message ID 20200218123747.3006-1-sathish.narasimman@intel.com (mailing list archive)
State Changes Requested
Delegated to: Marcel Holtmann
Headers show
Series Bluetooth: Fix - During le_conn_timeout disable EXT_ADV | expand

Commit Message

Sathish Narasimman Feb. 18, 2020, 12:37 p.m. UTC
Disabling LE_LEGACY_ADV when LE_EXT_ADV is enabled causes 'command
disallowed . This patch fixes that issue and disables EXT_ADV if
enabled.

Signed-off-by: Sathish Narsimman <sathish.narasimman@intel.com>
---
 net/bluetooth/hci_conn.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

Comments

Marcel Holtmann Feb. 18, 2020, 2:10 p.m. UTC | #1
Hi Sathish,

> Disabling LE_LEGACY_ADV when LE_EXT_ADV is enabled causes 'command
> disallowed . This patch fixes that issue and disables EXT_ADV if
> enabled.
> 
> Signed-off-by: Sathish Narsimman <sathish.narasimman@intel.com>
> ---
> net/bluetooth/hci_conn.c | 16 +++++++++++++---
> 1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> index a582c676e584..a8d8a876363c 100644
> --- a/net/bluetooth/hci_conn.c
> +++ b/net/bluetooth/hci_conn.c
> @@ -481,9 +481,19 @@ static void le_conn_timeout(struct work_struct *work)
> 	 * (which doesn't have a timeout of its own).
> 	 */
> 	if (conn->role == HCI_ROLE_SLAVE) {
> -		u8 enable = 0x00;
> -		hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
> -			     &enable);
> +		if (ext_adv_capable(hdev)) {
> +			struct hci_cp_le_set_ext_adv_enable cp;
> +
> +			cp.enable = 0x00;
> +			cp.num_of_sets = 0x00;
> +
> +			hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
> +				     sizeof(cp), &cp);
> +		} else {
> +			u8 enable = 0x00;
> +			hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
> +				     sizeof(enable), &enable);
> +		}

hmmm, I wonder if it is better to create a helper function for this.

Regards

Marcel
Sathish Narasimman Feb. 18, 2020, 2:47 p.m. UTC | #2
Hi Marcel

On Tue, Feb 18, 2020 at 7:40 PM Marcel Holtmann <marcel@holtmann.org> wrote:
>
> Hi Sathish,
>
> > Disabling LE_LEGACY_ADV when LE_EXT_ADV is enabled causes 'command
> > disallowed . This patch fixes that issue and disables EXT_ADV if
> > enabled.
> >
> > Signed-off-by: Sathish Narsimman <sathish.narasimman@intel.com>
> > ---
> > net/bluetooth/hci_conn.c | 16 +++++++++++++---
> > 1 file changed, 13 insertions(+), 3 deletions(-)
> >
> > diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> > index a582c676e584..a8d8a876363c 100644
> > --- a/net/bluetooth/hci_conn.c
> > +++ b/net/bluetooth/hci_conn.c
> > @@ -481,9 +481,19 @@ static void le_conn_timeout(struct work_struct *work)
> >        * (which doesn't have a timeout of its own).
> >        */
> >       if (conn->role == HCI_ROLE_SLAVE) {
> > -             u8 enable = 0x00;
> > -             hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
> > -                          &enable);
> > +             if (ext_adv_capable(hdev)) {
> > +                     struct hci_cp_le_set_ext_adv_enable cp;
> > +
> > +                     cp.enable = 0x00;
> > +                     cp.num_of_sets = 0x00;
> > +
> > +                     hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
> > +                                  sizeof(cp), &cp);
> > +             } else {
> > +                     u8 enable = 0x00;
> > +                     hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
> > +                                  sizeof(enable), &enable);
> > +             }
>
> hmmm, I wonder if it is better to create a helper function for this.
>
> Regards
>
> Marcel
>

let me verify and submit patch with __hci_req_disable_advertising

Regards
Sathish N
Sathish Narasimman Feb. 19, 2020, 1:53 p.m. UTC | #3
Hi Marcel

On Tue, Feb 18, 2020 at 8:17 PM Sathish Narasimman <nsathish41@gmail.com> wrote:
>
> Hi Marcel
>
> On Tue, Feb 18, 2020 at 7:40 PM Marcel Holtmann <marcel@holtmann.org> wrote:
> >
> > Hi Sathish,
> >
> > > Disabling LE_LEGACY_ADV when LE_EXT_ADV is enabled causes 'command
> > > disallowed . This patch fixes that issue and disables EXT_ADV if
> > > enabled.
> > >
> > > Signed-off-by: Sathish Narsimman <sathish.narasimman@intel.com>
> > > ---
> > > net/bluetooth/hci_conn.c | 16 +++++++++++++---
> > > 1 file changed, 13 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> > > index a582c676e584..a8d8a876363c 100644
> > > --- a/net/bluetooth/hci_conn.c
> > > +++ b/net/bluetooth/hci_conn.c
> > > @@ -481,9 +481,19 @@ static void le_conn_timeout(struct work_struct *work)
> > >        * (which doesn't have a timeout of its own).
> > >        */
> > >       if (conn->role == HCI_ROLE_SLAVE) {
> > > -             u8 enable = 0x00;
> > > -             hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
> > > -                          &enable);
> > > +             if (ext_adv_capable(hdev)) {
> > > +                     struct hci_cp_le_set_ext_adv_enable cp;
> > > +
> > > +                     cp.enable = 0x00;
> > > +                     cp.num_of_sets = 0x00;
> > > +
> > > +                     hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
> > > +                                  sizeof(cp), &cp);
> > > +             } else {
> > > +                     u8 enable = 0x00;
> > > +                     hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
> > > +                                  sizeof(enable), &enable);
> > > +             }
> >
> > hmmm, I wonder if it is better to create a helper function for this.
> >
> > Regards
> >
> > Marcel
> >
>
> let me verify and submit patch with __hci_req_disable_advertising
>
> Regards
> Sathish N

calling __hci_req_disable_advertising is not working. the command is
not getting executed
I hope the below method is fine? where it works

+static void le_disable_advertising(struct hci_dev *hdev)
+{
+       if (ext_adv_capable(hdev)) {
+               struct hci_cp_le_set_ext_adv_enable cp;
+               cp.enable = 0x00;
+               cp.num_of_sets = 0x00;
+
+               hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(cp),
+                            &cp);
+       } else {
+               u8 enable = 0x00;
+               hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
+                            sizeof(enable), &enable);
+       }
+
+}

Regards
Sathish N
Marcel Holtmann Feb. 20, 2020, 7:34 a.m. UTC | #4
Hi Sathish,

>>>> Disabling LE_LEGACY_ADV when LE_EXT_ADV is enabled causes 'command
>>>> disallowed . This patch fixes that issue and disables EXT_ADV if
>>>> enabled.
>>>> 
>>>> Signed-off-by: Sathish Narsimman <sathish.narasimman@intel.com>
>>>> ---
>>>> net/bluetooth/hci_conn.c | 16 +++++++++++++---
>>>> 1 file changed, 13 insertions(+), 3 deletions(-)
>>>> 
>>>> diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
>>>> index a582c676e584..a8d8a876363c 100644
>>>> --- a/net/bluetooth/hci_conn.c
>>>> +++ b/net/bluetooth/hci_conn.c
>>>> @@ -481,9 +481,19 @@ static void le_conn_timeout(struct work_struct *work)
>>>>       * (which doesn't have a timeout of its own).
>>>>       */
>>>>      if (conn->role == HCI_ROLE_SLAVE) {
>>>> -             u8 enable = 0x00;
>>>> -             hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
>>>> -                          &enable);
>>>> +             if (ext_adv_capable(hdev)) {
>>>> +                     struct hci_cp_le_set_ext_adv_enable cp;
>>>> +
>>>> +                     cp.enable = 0x00;
>>>> +                     cp.num_of_sets = 0x00;
>>>> +
>>>> +                     hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
>>>> +                                  sizeof(cp), &cp);
>>>> +             } else {
>>>> +                     u8 enable = 0x00;
>>>> +                     hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
>>>> +                                  sizeof(enable), &enable);
>>>> +             }
>>> 
>>> hmmm, I wonder if it is better to create a helper function for this.
>>> 
>>> Regards
>>> 
>>> Marcel
>>> 
>> 
>> let me verify and submit patch with __hci_req_disable_advertising
>> 
>> Regards
>> Sathish N
> 
> calling __hci_req_disable_advertising is not working. the command is
> not getting executed
> I hope the below method is fine? where it works
> 
> +static void le_disable_advertising(struct hci_dev *hdev)
> +{
> +       if (ext_adv_capable(hdev)) {
> +               struct hci_cp_le_set_ext_adv_enable cp;
> +               cp.enable = 0x00;
> +               cp.num_of_sets = 0x00;
> +
> +               hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE, sizeof(cp),
> +                            &cp);
> +       } else {
> +               u8 enable = 0x00;
> +               hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
> +                            sizeof(enable), &enable);
> +       }
> +
> +}

at first glance this looks fine.

Regards

Marcel
diff mbox series

Patch

diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index a582c676e584..a8d8a876363c 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -481,9 +481,19 @@  static void le_conn_timeout(struct work_struct *work)
 	 * (which doesn't have a timeout of its own).
 	 */
 	if (conn->role == HCI_ROLE_SLAVE) {
-		u8 enable = 0x00;
-		hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE, sizeof(enable),
-			     &enable);
+		if (ext_adv_capable(hdev)) {
+			struct hci_cp_le_set_ext_adv_enable cp;
+
+			cp.enable = 0x00;
+			cp.num_of_sets = 0x00;
+
+			hci_send_cmd(hdev, HCI_OP_LE_SET_EXT_ADV_ENABLE,
+				     sizeof(cp), &cp);
+		} else {
+			u8 enable = 0x00;
+			hci_send_cmd(hdev, HCI_OP_LE_SET_ADV_ENABLE,
+				     sizeof(enable), &enable);
+		}
 		hci_le_conn_failed(conn, HCI_ERROR_ADVERTISING_TIMEOUT);
 		return;
 	}