HI Luiz, On Mon, Nov 15, 2021 at 2:35 PM Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx> wrote: > > Hi Alain, > > On Mon, Nov 15, 2021 at 9:07 AM Marcel Holtmann <marcel@xxxxxxxxxxxx> wrote: > > > > Hi Alain, > > > > > When multiple advertisement sets are active and a single instance is > > > removed, the processing of hci_cc_le_set_ext_adv_enable will result in > > > considering all advertisements as disabled since the instance has > > > already been removed from the list. > > > > > > The fix is to use the command parameters to validate the intent rather > > > than making an assumption based on the validity of the adv set. > > > > > > remove_advertising() hci0 > > > > > > hci_req_add_ev() hci0 opcode 0x2039 plen 6 > > > hci_req_add_ev() hci0 opcode 0x203c plen 1 > > > > > > hci_remove_adv_instance() hci0 removing 2MR > > > <-- This removes instance 2 from the adv_instances list > > > > > > hci_cc_le_set_ext_adv_enable() hci0 status 0x00 > > > hci_sent_cmd_data() hci0 opcode 0x2039 > > > hci_cc_le_set_ext_adv_enable() adv instance 0, enabled 0 > > > <-- This incorrectly assumes that all instances are > > > being disabled while only handle 2 is being disabled. > > > > > > hci_cc_le_set_ext_adv_enable() adv instance list status - before > > > hci_cc_le_set_ext_adv_enable() adv instance 3 is 1 > > > hci_cc_le_set_ext_adv_enable() adv instance 1 is 1 > > > hci_cc_le_set_ext_adv_enable() HCI_LE_ADV state before: 1 > > > hci_cc_le_set_ext_adv_enable() adv instance list status - after > > > hci_cc_le_set_ext_adv_enable() adv instance 3 is 0 > > > hci_cc_le_set_ext_adv_enable() adv instance 1 is 0 > > > hci_cc_le_set_ext_adv_enable() HCI_LE_ADV state after: 0 > > > <-- This is incorrect since handle 1 and 3 are still enabled > > > in the controller > > > > > > The fix was validated by running the ChromeOS bluetooth_AdapterAdvHealth > > > test suite. > > > > > > Reviewed-by: mcchou@xxxxxxxxxxxx > > > > we need clear name and email in the tags please. And I also like to have Fixes: tags here as well. > > > > > Signed-off-by: Alain Michaud <alainm@xxxxxxxxxxxx> > > > > > > --- > > > > > > net/bluetooth/hci_event.c | 8 +++++--- > > > 1 file changed, 5 insertions(+), 3 deletions(-) > > > > > > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c > > > index d4b75a6cfeee..52161d04136f 100644 > > > --- a/net/bluetooth/hci_event.c > > > +++ b/net/bluetooth/hci_event.c > > > @@ -1385,14 +1385,16 @@ static void hci_cc_le_set_ext_adv_enable(struct hci_dev *hdev, > > > if (adv->enabled) > > > goto unlock; > > > } > > > - } else { > > > + > > > + hci_dev_clear_flag(hdev, HCI_LE_ADV); > > > + } else if (!cp->num_of_sets || !set->handle) { > > > /* All instances shall be considered disabled */ > > > list_for_each_entry_safe(adv, n, &hdev->adv_instances, > > > list) > > > adv->enabled = false; > > > - } > > > > > > - hci_dev_clear_flag(hdev, HCI_LE_ADV); > > > + hci_dev_clear_flag(hdev, HCI_LE_ADV); > > > + } > > > } > > > > Just checking if this wouldn’t be cleaner: > > > > } else { > > if (foo) > > bar; > > > > hci_dev_clear_flag(hdev, HCI_LE_ADV); > > } > > Actually this seems to already have been fixed by: > > https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git/commit/?id=2128939fe2e771645dd88e1938c27fdf96bd1cd0 > > Perhaps the Chrome OS tree is outdated? You are right, looks like this would fix it and it was indeed not merged to the chromium tree. Please ignore this patch. > > > Regards > > > > Marcel > > > > > -- > Luiz Augusto von Dentz