Received: by 2002:a05:6358:9144:b0:117:f937:c515 with SMTP id r4csp1012515rwr; Thu, 4 May 2023 12:48:03 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4irZtHJ3LKC3LBOOU5X/cZK8/oKHj/Q2BhloxAJYwQwy6y5yfKx3nW57Hx5ns2UvI3/8AL X-Received: by 2002:a05:6a00:1702:b0:643:5455:2577 with SMTP id h2-20020a056a00170200b0064354552577mr3487147pfc.3.1683229683339; Thu, 04 May 2023 12:48:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683229683; cv=none; d=google.com; s=arc-20160816; b=OWOoB4jgm3WJL0bNayFevQSQDDtYy5oklc35i1e8WNEsx7ouuEQyIRvKUOZk/zlSXi C9lRtZZVcuR0An0eubjddTzZvARqievQveJJ/BLWQ9Skp6iQivHdhf4TPW0KQxAcPoBM QSy48xeY+tVUALgOOq5F0V1XQQyjaco2KCeTR/3/+Z3CkF4uHprHLnnf3aRiwUiHVkFL Pb/G/6OVzGxm5d0bbZ8LSzbbBswBYUjY9Kyq7EF4hDuPXTt9sD0EHOsq6U8/VMMxJOaE QAVMPrj3ottPAvnRWpAGIb9OBWr1yCdWIDZ4c4OfxLExRSMlT9NttYjI//L5vmGlJGYS nkyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=hx2oIL1qnQUn92SAp6TdBvnLX5IUYtxxctCBy++xToM=; b=o1RsU7+7zUY9L27aOAMmLJkJYIAKUoLhLLKq659p1EVUmD1y0MaYoST8YuQZPB41c9 kooG3qEl0ec+JyI0s5/3xL4xyPRv290L5LYbtjgfV8Ulyb18XNaK8OjHdmZTsxla+sfN 6eJ9IrnZbI1l0eoTXEhfYj4CKgz96Ru/1PzKbgqcPyGfxkfBZM2IIKJroT7amP2N5eLD zCBrY6kTmWswgvFz1VC6NhId2udn268WrIER0uyQ7y78BX7CFaFaXUAH6FABk4ojYd5Y +GzqUusDnI37CbKqoPq2LtNpVk02nKQ+OxUbOrRQTFm+rbX1Uo5wP9KzQh94v/ZKwKmg U7jA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="utH/HqAk"; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x184-20020a6386c1000000b0051367d909efsi206943pgd.106.2023.05.04.12.46.35; Thu, 04 May 2023 12:48:03 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="utH/HqAk"; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229807AbjEDTqU (ORCPT + 99 others); Thu, 4 May 2023 15:46:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48652 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230314AbjEDTpf (ORCPT ); Thu, 4 May 2023 15:45:35 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1132F14909; Thu, 4 May 2023 12:44:13 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D1AB263742; Thu, 4 May 2023 19:44:07 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 20523C433D2; Thu, 4 May 2023 19:44:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1683229447; bh=0GXFjYVqZ0PZmO9tVgTtfCagheAJigcdVsSQDV6JnJE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=utH/HqAkMMXx2/NqBjOH6ULvi7A7MkaauUxxywVHmPBADN7wDPBJQKnDMhoA/fkb+ BzZv1slPNJNHDPnHLbkuvgY03CkXfGw+zcHsPv7XzPiY2sFh8vnYihLit9xwwgDqZN POJ4jcyU9Fo4i6oj8rVCN8nWstrby7gHUqehXmiGja0tjN72YvPFDjiP2MQDBfcRTz HmUkyhgAHaD9ssgvPgroyg+5H85Xg6Wl+5haB+w1mYtokhO4HIq+CQ03k2rMKecYe6 op2FK6VDKZ2JHrEAQZiWcOmkKu+i0+9eNyNseexsPg3GcxmR/TB7GTMF8FxnYe4L99 q8kfgxbKQLXCA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Hans de Goede , Luiz Augusto von Dentz , Sasha Levin , marcel@holtmann.org, johan.hedberg@gmail.com, luiz.dentz@gmail.com, linux-bluetooth@vger.kernel.org Subject: [PATCH AUTOSEL 6.3 56/59] Bluetooth: hci_bcm: Fall back to getting bdaddr from EFI if not set Date: Thu, 4 May 2023 15:41:39 -0400 Message-Id: <20230504194142.3805425-56-sashal@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230504194142.3805425-1-sashal@kernel.org> References: <20230504194142.3805425-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Hans de Goede [ Upstream commit 0d218c3642b9ccf71f44987cd03c19320f3bd918 ] On some devices the BCM Bluetooth adapter does not have a valid bdaddr set. btbcm.c currently sets HCI_QUIRK_INVALID_BDADDR to indicate when this is the case. But this requires users to manual setup a btaddr, by doing e.g.: btmgmt -i hci0 public-addr 'B0:F1:EC:82:1D:B3' Which means that Bluetooth will not work out of the box on such devices. To avoid this (where possible) hci_bcm sets: HCI_QUIRK_USE_BDADDR_PROPERTY which tries to get the bdaddr from devicetree. But this only works on devicetree platforms. On UEFI based platforms there is a special Broadcom UEFI variable which when present contains the devices bdaddr, just like how there is another UEFI variable which contains wifi nvram contents including the wifi MAC address. Add support for getting the bdaddr from this Broadcom UEFI variable, so that Bluetooth will work OOTB for users on devices where this UEFI variable is present. This fixes Bluetooth not working on for example Asus T100HA 2-in-1s. Signed-off-by: Hans de Goede Signed-off-by: Luiz Augusto von Dentz Signed-off-by: Sasha Levin --- drivers/bluetooth/btbcm.c | 47 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c index 43e98a598bd9a..de2ea589aa49b 100644 --- a/drivers/bluetooth/btbcm.c +++ b/drivers/bluetooth/btbcm.c @@ -6,6 +6,7 @@ * Copyright (C) 2015 Intel Corporation */ +#include #include #include #include @@ -34,6 +35,43 @@ /* For kmalloc-ing the fw-name array instead of putting it on the stack */ typedef char bcm_fw_name[BCM_FW_NAME_LEN]; +#ifdef CONFIG_EFI +static int btbcm_set_bdaddr_from_efi(struct hci_dev *hdev) +{ + efi_guid_t guid = EFI_GUID(0x74b00bd9, 0x805a, 0x4d61, 0xb5, 0x1f, + 0x43, 0x26, 0x81, 0x23, 0xd1, 0x13); + bdaddr_t efi_bdaddr, bdaddr; + efi_status_t status; + unsigned long len; + int ret; + + if (!efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE)) + return -EOPNOTSUPP; + + len = sizeof(efi_bdaddr); + status = efi.get_variable(L"BDADDR", &guid, NULL, &len, &efi_bdaddr); + if (status != EFI_SUCCESS) + return -ENXIO; + + if (len != sizeof(efi_bdaddr)) + return -EIO; + + baswap(&bdaddr, &efi_bdaddr); + + ret = btbcm_set_bdaddr(hdev, &bdaddr); + if (ret) + return ret; + + bt_dev_info(hdev, "BCM: Using EFI device address (%pMR)", &bdaddr); + return 0; +} +#else +static int btbcm_set_bdaddr_from_efi(struct hci_dev *hdev) +{ + return -EOPNOTSUPP; +} +#endif + int btbcm_check_bdaddr(struct hci_dev *hdev) { struct hci_rp_read_bd_addr *bda; @@ -87,9 +125,12 @@ int btbcm_check_bdaddr(struct hci_dev *hdev) !bacmp(&bda->bdaddr, BDADDR_BCM4345C5) || !bacmp(&bda->bdaddr, BDADDR_BCM43430A0) || !bacmp(&bda->bdaddr, BDADDR_BCM43341B)) { - bt_dev_info(hdev, "BCM: Using default device address (%pMR)", - &bda->bdaddr); - set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); + /* Try falling back to BDADDR EFI variable */ + if (btbcm_set_bdaddr_from_efi(hdev) != 0) { + bt_dev_info(hdev, "BCM: Using default device address (%pMR)", + &bda->bdaddr); + set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); + } } kfree_skb(skb); -- 2.39.2