Re: [PATCH v3] bluetooth: Enable erroneous data reporting if wbs is supported

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Alain,

>>> This change intruduces a wide band speech setting which allows higher
>>> level clients to query the local controller support for wide band speech
>>> as well as set the setting state when the radio is powered off.
>>> Internally, this setting controls if erroneous data reporting is enabled
>>> on the controller.
>>> 
>>> Signed-off-by: Alain Michaud <alainm@xxxxxxxxxxxx>
>>> ---
>>> 
>>> include/net/bluetooth/hci.h      | 14 ++++++++
>>> include/net/bluetooth/hci_core.h |  1 +
>>> include/net/bluetooth/mgmt.h     |  2 ++
>>> net/bluetooth/hci_core.c         | 21 +++++++++++
>>> net/bluetooth/hci_event.c        | 39 ++++++++++++++++++++
>>> net/bluetooth/mgmt.c             | 62 ++++++++++++++++++++++++++++++++
>>> 6 files changed, 139 insertions(+)
>>> 
>>> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
>>> index 0b3ebd35681d..d66648e9ff13 100644
>>> --- a/include/net/bluetooth/hci.h
>>> +++ b/include/net/bluetooth/hci.h
>>> @@ -286,6 +286,7 @@ enum {
>>>      HCI_FAST_CONNECTABLE,
>>>      HCI_BREDR_ENABLED,
>>>      HCI_LE_SCAN_INTERRUPTED,
>>> +     HCI_WIDE_BAND_SPEECH_ENABLED,
>> 
>> lets use HCI_WIDEBAND_SPEECH_ENABLED. It might be just me, but when I look at WIDE_BAND compared to WIDEBAND, I prefer the latter.
> Ack.
>> 
>>> 
>>>      HCI_DUT_MODE,
>>>      HCI_VENDOR_DIAG,
>>> @@ -1095,6 +1096,19 @@ struct hci_rp_read_inq_rsp_tx_power {
>>>      __s8     tx_power;
>>> } __packed;
>>> 
>>> +#define HCI_OP_READ_DEF_ERR_DATA_REPORTING   0x0c5a
>>> +     #define ERR_DATA_REPORTING_DISABLED     0x00
>>> +     #define ERR_DATA_REPORTING_ENABLED      0x01
>>> +struct hci_rp_read_def_err_data_reporting {
>>> +     __u8     status;
>>> +     __u8     err_data_reporting;
>>> +} __packed;
>>> +
>>> +#define HCI_OP_WRITE_DEF_ERR_DATA_REPORTING  0x0c5b
>>> +struct hci_cp_write_def_err_data_reporting {
>>> +     __u8     err_data_reporting;
>>> +} __packed;
>>> +
>>> #define HCI_OP_SET_EVENT_MASK_PAGE_2  0x0c63
>>> 
>>> #define HCI_OP_READ_LOCATION_DATA     0x0c64
>>> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
>>> index dcc0dc6e2624..c498ac113930 100644
>>> --- a/include/net/bluetooth/hci_core.h
>>> +++ b/include/net/bluetooth/hci_core.h
>>> @@ -260,6 +260,7 @@ struct hci_dev {
>>>      __u8            stored_num_keys;
>>>      __u8            io_capability;
>>>      __s8            inq_tx_power;
>>> +     __u8            err_data_reporting;
>>>      __u16           page_scan_interval;
>>>      __u16           page_scan_window;
>>>      __u8            page_scan_type;
>>> diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
>>> index f69f88e8e109..b203df07e7fc 100644
>>> --- a/include/net/bluetooth/mgmt.h
>>> +++ b/include/net/bluetooth/mgmt.h
>>> @@ -672,6 +672,8 @@ struct mgmt_cp_set_blocked_keys {
>>> } __packed;
>>> #define MGMT_OP_SET_BLOCKED_KEYS_SIZE 2
>>> 
>>> +#define MGMT_OP_SET_WIDE_BAND_SPEECH 0x0047
>>> +
>>> #define MGMT_EV_CMD_COMPLETE          0x0001
>>> struct mgmt_ev_cmd_complete {
>>>      __le16  opcode;
>>> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
>>> index 4e6d61a95b20..d526d7568396 100644
>>> --- a/net/bluetooth/hci_core.c
>>> +++ b/net/bluetooth/hci_core.c
>>> @@ -603,6 +603,9 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
>>>      if (hdev->commands[8] & 0x01)
>>>              hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);
>>> 
>>> +     if (hdev->commands[18] & 0x02)
>>> +             hci_req_add(req, HCI_OP_READ_DEF_ERR_DATA_REPORTING, 0, NULL);
>>> +
>>>      /* Some older Broadcom based Bluetooth 1.2 controllers do not
>>>       * support the Read Page Scan Type command. Check support for
>>>       * this command in the bit mask of supported commands.
>>> @@ -838,6 +841,24 @@ static int hci_init4_req(struct hci_request *req, unsigned long opt)
>>>                          sizeof(support), &support);
>>>      }
>>> 
>>> +     /* Set erroneous data reporting if supported to the wideband speech
>>> +      * setting value
>>> +      */
>>> +     if (test_bit(HCI_QUIRK_WIDE_BAND_SPEECH_SUPPORTED, &hdev->quirks) &&
>>> +         (hdev->commands[18] & 0x04) &&
>>> +         hci_dev_test_flag(hdev, HCI_WIDE_BAND_SPEECH_ENABLED) !=
>>> +          (hdev->err_data_reporting != ERR_DATA_REPORTING_ENABLED)) {
>> 
>> So this statement is creating a knot in my brain ;)
>> 
>> 
>>        if (hdev->commands[18] & 0x04) {
>>                bool enabled = hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED);
>> 
>>                ..
>> 
>>                cp.err_data_reporting = enabled ? ERR_DATA_REPORTING_ENABLED :
>>                                                  ERR_DATA_REPORTING_DISABLED;
>> 
>>                ..
>>        }
>> 
>> I would not bother checking the quirk here. I would just configure that setting based on the HCI_WIDEBAND_SPEECH_ENABLED flag. Unless we have controllers that report this command and don’t allow setting the value, then we have to deal with it, but right now I assume that they get the basics of HCI right.
>> 
>> Btw. I am debating a coding style here.
>> 
>>                cp.err_data_reporting = enabled ? ERR_DATA_REPORTING_ENABLED
>>                                                : ERR_DATA_REPORTING_DISABLED;
>> 
>> But I am not even sure that is clearer or cleaner.
> 
> I agree the QUIRK check could be avoided, but I'd argue the following
> condition is still required to avoid sending a command that otherwise
> is not necessary to the controller:
> hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED) !=
> (hdev->err_data_reporting != ERR_DATA_REPORTING_ENABLED).  I can
> however simplify it by using a bool enabled flag as you suggested.

ok, then do that.

Regards

Marcel




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux