Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Johan Hedberg says: ==================== pull request: bluetooth-next 2019-03-02 Here's one more bluetooth-next pull request for the 5.1 kernel: - Added support for MediaTek MT7663U and MT7668U UART devices - Cleanups & fixes to the hci_qca driver - Fixed wakeup pin behavior for QCA6174A controller Please let me know if there are any issues pulling. Thanks. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -30,6 +30,7 @@
|
||||
#include <linux/rfkill.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/crypto.h>
|
||||
#include <linux/property.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
@@ -1355,6 +1356,32 @@ done:
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
* hci_dev_get_bd_addr_from_property - Get the Bluetooth Device Address
|
||||
* (BD_ADDR) for a HCI device from
|
||||
* a firmware node property.
|
||||
* @hdev: The HCI device
|
||||
*
|
||||
* Search the firmware node for 'local-bd-address'.
|
||||
*
|
||||
* All-zero BD addresses are rejected, because those could be properties
|
||||
* that exist in the firmware tables, but were not updated by the firmware. For
|
||||
* example, the DTS could define 'local-bd-address', with zero BD addresses.
|
||||
*/
|
||||
static void hci_dev_get_bd_addr_from_property(struct hci_dev *hdev)
|
||||
{
|
||||
struct fwnode_handle *fwnode = dev_fwnode(hdev->dev.parent);
|
||||
bdaddr_t ba;
|
||||
int ret;
|
||||
|
||||
ret = fwnode_property_read_u8_array(fwnode, "local-bd-address",
|
||||
(u8 *)&ba, sizeof(ba));
|
||||
if (ret < 0 || !bacmp(&ba, BDADDR_ANY))
|
||||
return;
|
||||
|
||||
bacpy(&hdev->public_addr, &ba);
|
||||
}
|
||||
|
||||
static int hci_dev_do_open(struct hci_dev *hdev)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -1422,6 +1449,22 @@ static int hci_dev_do_open(struct hci_dev *hdev)
|
||||
if (hdev->setup)
|
||||
ret = hdev->setup(hdev);
|
||||
|
||||
if (ret)
|
||||
goto setup_failed;
|
||||
|
||||
if (test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) {
|
||||
if (!bacmp(&hdev->public_addr, BDADDR_ANY))
|
||||
hci_dev_get_bd_addr_from_property(hdev);
|
||||
|
||||
if (bacmp(&hdev->public_addr, BDADDR_ANY) &&
|
||||
hdev->set_bdaddr)
|
||||
ret = hdev->set_bdaddr(hdev,
|
||||
&hdev->public_addr);
|
||||
else
|
||||
ret = -EADDRNOTAVAIL;
|
||||
}
|
||||
|
||||
setup_failed:
|
||||
/* The transport driver can set these quirks before
|
||||
* creating the HCI device or in its setup callback.
|
||||
*
|
||||
|
@@ -474,7 +474,6 @@ static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
|
||||
{
|
||||
struct mgmt_rp_read_ext_index_list *rp;
|
||||
struct hci_dev *d;
|
||||
size_t rp_len;
|
||||
u16 count;
|
||||
int err;
|
||||
|
||||
@@ -488,8 +487,7 @@ static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
|
||||
count++;
|
||||
}
|
||||
|
||||
rp_len = sizeof(*rp) + (sizeof(rp->entry[0]) * count);
|
||||
rp = kmalloc(rp_len, GFP_ATOMIC);
|
||||
rp = kmalloc(struct_size(rp, entry, count), GFP_ATOMIC);
|
||||
if (!rp) {
|
||||
read_unlock(&hci_dev_list_lock);
|
||||
return -ENOMEM;
|
||||
@@ -525,7 +523,6 @@ static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
|
||||
}
|
||||
|
||||
rp->num_controllers = cpu_to_le16(count);
|
||||
rp_len = sizeof(*rp) + (sizeof(rp->entry[0]) * count);
|
||||
|
||||
read_unlock(&hci_dev_list_lock);
|
||||
|
||||
@@ -538,7 +535,8 @@ static int read_ext_index_list(struct sock *sk, struct hci_dev *hdev,
|
||||
hci_sock_clear_flag(sk, HCI_MGMT_UNCONF_INDEX_EVENTS);
|
||||
|
||||
err = mgmt_cmd_complete(sk, MGMT_INDEX_NONE,
|
||||
MGMT_OP_READ_EXT_INDEX_LIST, 0, rp, rp_len);
|
||||
MGMT_OP_READ_EXT_INDEX_LIST, 0, rp,
|
||||
struct_size(rp, entry, count));
|
||||
|
||||
kfree(rp);
|
||||
|
||||
@@ -551,7 +549,8 @@ static bool is_configured(struct hci_dev *hdev)
|
||||
!hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
|
||||
return false;
|
||||
|
||||
if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) &&
|
||||
if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) ||
|
||||
test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
|
||||
!bacmp(&hdev->public_addr, BDADDR_ANY))
|
||||
return false;
|
||||
|
||||
@@ -566,7 +565,8 @@ static __le32 get_missing_options(struct hci_dev *hdev)
|
||||
!hci_dev_test_flag(hdev, HCI_EXT_CONFIGURED))
|
||||
options |= MGMT_OPTION_EXTERNAL_CONFIG;
|
||||
|
||||
if (test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) &&
|
||||
if ((test_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks) ||
|
||||
test_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks)) &&
|
||||
!bacmp(&hdev->public_addr, BDADDR_ANY))
|
||||
options |= MGMT_OPTION_PUBLIC_ADDRESS;
|
||||
|
||||
|
Reference in New Issue
Block a user