Linux-Bluetooth Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function
@ 2019-07-17  7:49 Kai-Heng Feng
  2019-07-17  7:49 ` [PATCH v2 2/3] Bluetooth: btusb: Load firmware exclusively for Intel BT Kai-Heng Feng
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2019-07-17  7:49 UTC (permalink / raw)
  To: johannes.berg, emmanuel.grumbach, luciano.coelho, marcel, johan.hedberg
  Cc: linuxwifi, linux-wireless, netdev, linux-bluetooth, linux-kernel,
	Kai-Heng Feng

When Intel 8260 starts to load Bluetooth firmware and WiFi firmware, by
calling btintel_download_firmware() and iwl_pcie_load_given_ucode_8000()
respectively, the Bluetooth btintel_download_firmware() aborts half way:
[   11.950216] Bluetooth: hci0: Failed to send firmware data (-38)

Let btusb and iwlwifi load firmwares exclusively can avoid the issue, so
introduce a lock to use in btusb and iwlwifi.

This issue still occurs with latest WiFi and Bluetooth firmwares.

BugLink: https://bugs.launchpad.net/bugs/1832988

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v2:
 - Add bug report link.
 - Rebase on latest wireless-next.

 drivers/bluetooth/btintel.c   | 14 ++++++++++++++
 drivers/bluetooth/btintel.h   | 10 ++++++++++
 include/linux/intel-wifi-bt.h |  8 ++++++++
 3 files changed, 32 insertions(+)
 create mode 100644 include/linux/intel-wifi-bt.h

diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
index bb99c8653aab..93ab18d6ddad 100644
--- a/drivers/bluetooth/btintel.c
+++ b/drivers/bluetooth/btintel.c
@@ -20,6 +20,8 @@
 
 #define BDADDR_INTEL (&(bdaddr_t) {{0x00, 0x8b, 0x9e, 0x19, 0x03, 0x00}})
 
+static DEFINE_MUTEX(firmware_lock);
+
 int btintel_check_bdaddr(struct hci_dev *hdev)
 {
 	struct hci_rp_read_bd_addr *bda;
@@ -709,6 +711,18 @@ int btintel_download_firmware(struct hci_dev *hdev, const struct firmware *fw,
 }
 EXPORT_SYMBOL_GPL(btintel_download_firmware);
 
+void btintel_firmware_lock(void)
+{
+	mutex_lock(&firmware_lock);
+}
+EXPORT_SYMBOL_GPL(btintel_firmware_lock);
+
+void btintel_firmware_unlock(void)
+{
+	mutex_unlock(&firmware_lock);
+}
+EXPORT_SYMBOL_GPL(btintel_firmware_unlock);
+
 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
 MODULE_DESCRIPTION("Bluetooth support for Intel devices ver " VERSION);
 MODULE_VERSION(VERSION);
diff --git a/drivers/bluetooth/btintel.h b/drivers/bluetooth/btintel.h
index 3d846190f2bf..b3682d27d2ee 100644
--- a/drivers/bluetooth/btintel.h
+++ b/drivers/bluetooth/btintel.h
@@ -87,6 +87,8 @@ int btintel_read_boot_params(struct hci_dev *hdev,
 			     struct intel_boot_params *params);
 int btintel_download_firmware(struct hci_dev *dev, const struct firmware *fw,
 			      u32 *boot_param);
+void btintel_firmware_lock(void);
+void btintel_firmware_unlock(void);
 #else
 
 static inline int btintel_check_bdaddr(struct hci_dev *hdev)
@@ -181,4 +183,12 @@ static inline int btintel_download_firmware(struct hci_dev *dev,
 {
 	return -EOPNOTSUPP;
 }
+
+static inline void btintel_firmware_lock(void)
+{
+}
+
+static inline void btintel_firmware_unlock(void)
+{
+}
 #endif
diff --git a/include/linux/intel-wifi-bt.h b/include/linux/intel-wifi-bt.h
new file mode 100644
index 000000000000..260ed628d19b
--- /dev/null
+++ b/include/linux/intel-wifi-bt.h
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __INTEL_WIFI_BT_H__
+#define __INTEL_WIFI_BT_H__
+
+void btintel_firmware_lock(void);
+void btintel_firmware_unlock(void);
+
+#endif
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 2/3] Bluetooth: btusb: Load firmware exclusively for Intel BT
  2019-07-17  7:49 [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Kai-Heng Feng
@ 2019-07-17  7:49 ` Kai-Heng Feng
  2019-07-17  7:49 ` [PATCH v2 3/3] iwlwifi: Load firmware exclusively for Intel WiFi Kai-Heng Feng
  2019-07-17 13:36 ` [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Marcel Holtmann
  2 siblings, 0 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2019-07-17  7:49 UTC (permalink / raw)
  To: johannes.berg, emmanuel.grumbach, luciano.coelho, marcel, johan.hedberg
  Cc: linuxwifi, linux-wireless, netdev, linux-bluetooth, linux-kernel,
	Kai-Heng Feng

To avoid the firmware loading race between Bluetooth and WiFi on Intel
8260, load firmware exclusively when IWLWIFI is enabled.

BugLink: https://bugs.launchpad.net/bugs/1832988

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v2:
 - Add bug report link.
 - Rebase on latest wireless-next.

 drivers/bluetooth/btusb.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 50aed5259c2b..ca7a5757a2ba 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -2272,8 +2272,16 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
 
 	set_bit(BTUSB_DOWNLOADING, &data->flags);
 
+#if IS_ENABLED(CONFIG_IWLWIFI)
+	btintel_firmware_lock();
+#endif
+
 	/* Start firmware downloading and get boot parameter */
 	err = btintel_download_firmware(hdev, fw, &boot_param);
+
+#if IS_ENABLED(CONFIG_IWLWIFI)
+	btintel_firmware_unlock();
+#endif
 	if (err < 0)
 		goto done;
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 3/3] iwlwifi: Load firmware exclusively for Intel WiFi
  2019-07-17  7:49 [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Kai-Heng Feng
  2019-07-17  7:49 ` [PATCH v2 2/3] Bluetooth: btusb: Load firmware exclusively for Intel BT Kai-Heng Feng
@ 2019-07-17  7:49 ` Kai-Heng Feng
  2019-07-17 13:36 ` [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Marcel Holtmann
  2 siblings, 0 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2019-07-17  7:49 UTC (permalink / raw)
  To: johannes.berg, emmanuel.grumbach, luciano.coelho, marcel, johan.hedberg
  Cc: linuxwifi, linux-wireless, netdev, linux-bluetooth, linux-kernel,
	Kai-Heng Feng

To avoid the firmware loading race between Bluetooth and WiFi on Intel
8260, load firmware exclusively when BT_INTEL is enabled.

BugLink: https://bugs.launchpad.net/bugs/1832988

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v2:
 - Add bug report link.
 - Rebase on latest wireless-next.

 .../net/wireless/intel/iwlwifi/pcie/trans.c   | 37 ++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 602c31b3992a..e10ff847b216 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -72,6 +72,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/module.h>
 #include <linux/wait.h>
+#include <linux/intel-wifi-bt.h>
 
 #include "iwl-drv.h"
 #include "iwl-trans.h"
@@ -1335,6 +1336,10 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
 	bool hw_rfkill;
 	int ret;
 
+#if IS_ENABLED(CONFIG_BT_INTEL)
+	void (*firmware_lock_func)(void);
+	void (*firmware_unlock_func)(void);
+#endif
 	/* This may fail if AMT took ownership of the device */
 	if (iwl_pcie_prepare_card_hw(trans)) {
 		IWL_WARN(trans, "Exit HW not ready\n");
@@ -1394,6 +1399,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
 	 * RF-Kill switch is toggled, we will find out after having loaded
 	 * the firmware and return the proper value to the caller.
 	 */
+
 	iwl_enable_fw_load_int(trans);
 
 	/* really make sure rfkill handshake bits are cleared */
@@ -1401,8 +1407,37 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
 	iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
 
 	/* Load the given image to the HW */
-	if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000)
+	if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_8000) {
+#if IS_ENABLED(CONFIG_BT_INTEL)
+		firmware_lock_func = symbol_request(btintel_firmware_lock);
+		firmware_unlock_func = symbol_request(btintel_firmware_unlock);
+		if (!firmware_lock_func || !firmware_unlock_func) {
+			if (firmware_lock_func) {
+				symbol_put(btintel_firmware_lock);
+				firmware_lock_func = NULL;
+			}
+
+			if (firmware_unlock_func) {
+				symbol_put(btintel_firmware_unlock);
+				firmware_unlock_func = NULL;
+			}
+		}
+
+		if (firmware_lock_func)
+			firmware_lock_func();
+#endif
 		ret = iwl_pcie_load_given_ucode_8000(trans, fw);
+
+#if IS_ENABLED(CONFIG_BT_INTEL)
+		if (firmware_unlock_func) {
+			firmware_unlock_func();
+			symbol_put(btintel_firmware_lock);
+			firmware_lock_func = NULL;
+			symbol_put(btintel_firmware_unlock);
+			firmware_unlock_func = NULL;
+		}
+#endif
+	}
 	else
 		ret = iwl_pcie_load_given_ucode(trans, fw);
 
-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function
  2019-07-17  7:49 [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Kai-Heng Feng
  2019-07-17  7:49 ` [PATCH v2 2/3] Bluetooth: btusb: Load firmware exclusively for Intel BT Kai-Heng Feng
  2019-07-17  7:49 ` [PATCH v2 3/3] iwlwifi: Load firmware exclusively for Intel WiFi Kai-Heng Feng
@ 2019-07-17 13:36 ` Marcel Holtmann
  2019-07-17 14:08   ` Kai-Heng Feng
  2 siblings, 1 reply; 6+ messages in thread
From: Marcel Holtmann @ 2019-07-17 13:36 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: Johannes Berg, emmanuel.grumbach, luciano.coelho, Johan Hedberg,
	linuxwifi, linux-wireless, netdev, linux-bluetooth, linux-kernel

Hi Kai-Heng,

> When Intel 8260 starts to load Bluetooth firmware and WiFi firmware, by
> calling btintel_download_firmware() and iwl_pcie_load_given_ucode_8000()
> respectively, the Bluetooth btintel_download_firmware() aborts half way:
> [   11.950216] Bluetooth: hci0: Failed to send firmware data (-38)
> 
> Let btusb and iwlwifi load firmwares exclusively can avoid the issue, so
> introduce a lock to use in btusb and iwlwifi.
> 
> This issue still occurs with latest WiFi and Bluetooth firmwares.
> 
> BugLink: https://bugs.launchpad.net/bugs/1832988
> 
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> ---
> v2:
> - Add bug report link.
> - Rebase on latest wireless-next.
> 
> drivers/bluetooth/btintel.c   | 14 ++++++++++++++
> drivers/bluetooth/btintel.h   | 10 ++++++++++
> include/linux/intel-wifi-bt.h |  8 ++++++++
> 3 files changed, 32 insertions(+)
> create mode 100644 include/linux/intel-wifi-bt.h
> 
> diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
> index bb99c8653aab..93ab18d6ddad 100644
> --- a/drivers/bluetooth/btintel.c
> +++ b/drivers/bluetooth/btintel.c
> @@ -20,6 +20,8 @@
> 
> #define BDADDR_INTEL (&(bdaddr_t) {{0x00, 0x8b, 0x9e, 0x19, 0x03, 0x00}})
> 
> +static DEFINE_MUTEX(firmware_lock);
> +
> int btintel_check_bdaddr(struct hci_dev *hdev)
> {
> 	struct hci_rp_read_bd_addr *bda;
> @@ -709,6 +711,18 @@ int btintel_download_firmware(struct hci_dev *hdev, const struct firmware *fw,
> }
> EXPORT_SYMBOL_GPL(btintel_download_firmware);
> 
> +void btintel_firmware_lock(void)
> +{
> +	mutex_lock(&firmware_lock);
> +}
> +EXPORT_SYMBOL_GPL(btintel_firmware_lock);
> +
> +void btintel_firmware_unlock(void)
> +{
> +	mutex_unlock(&firmware_lock);
> +}
> +EXPORT_SYMBOL_GPL(btintel_firmware_unlock);
> +

so I am not in favor of this solution. The hardware guys should start looking into fixing the firmware loading and provide proper firmware that can be loaded at the same time.

I am also not for sure penalizing all Intel Bluetooth/WiFi combos only because one of them has a bug during simultaneous loading of WiFi and Bluetooth firmware.

Frankly it would be better to detect a failed load and try a second time instead of trying to lock each other out. The cross-contamination of WiFi and Bluetooth drivers is just not clean.

Regards

Marcel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function
  2019-07-17 13:36 ` [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Marcel Holtmann
@ 2019-07-17 14:08   ` Kai-Heng Feng
  2019-07-26  7:01     ` Johannes Berg
  0 siblings, 1 reply; 6+ messages in thread
From: Kai-Heng Feng @ 2019-07-17 14:08 UTC (permalink / raw)
  To: Marcel Holtmann
  Cc: Johannes Berg, Grumbach, Emmanuel, Luciano Coelho, Johan Hedberg,
	linuxwifi, linux-wireless, netdev, linux-bluetooth, linux-kernel

at 21:36, Marcel Holtmann <marcel@holtmann.org> wrote:

> Hi Kai-Heng,
>
>> When Intel 8260 starts to load Bluetooth firmware and WiFi firmware, by
>> calling btintel_download_firmware() and iwl_pcie_load_given_ucode_8000()
>> respectively, the Bluetooth btintel_download_firmware() aborts half way:
>> [   11.950216] Bluetooth: hci0: Failed to send firmware data (-38)
>>
>> Let btusb and iwlwifi load firmwares exclusively can avoid the issue, so
>> introduce a lock to use in btusb and iwlwifi.
>>
>> This issue still occurs with latest WiFi and Bluetooth firmwares.
>>
>> BugLink: https://bugs.launchpad.net/bugs/1832988
>>
>> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
>> ---
>> v2:
>> - Add bug report link.
>> - Rebase on latest wireless-next.
>>
>> drivers/bluetooth/btintel.c   | 14 ++++++++++++++
>> drivers/bluetooth/btintel.h   | 10 ++++++++++
>> include/linux/intel-wifi-bt.h |  8 ++++++++
>> 3 files changed, 32 insertions(+)
>> create mode 100644 include/linux/intel-wifi-bt.h
>>
>> diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c
>> index bb99c8653aab..93ab18d6ddad 100644
>> --- a/drivers/bluetooth/btintel.c
>> +++ b/drivers/bluetooth/btintel.c
>> @@ -20,6 +20,8 @@
>>
>> #define BDADDR_INTEL (&(bdaddr_t) {{0x00, 0x8b, 0x9e, 0x19, 0x03, 0x00}})
>>
>> +static DEFINE_MUTEX(firmware_lock);
>> +
>> int btintel_check_bdaddr(struct hci_dev *hdev)
>> {
>> 	struct hci_rp_read_bd_addr *bda;
>> @@ -709,6 +711,18 @@ int btintel_download_firmware(struct hci_dev *hdev,  
>> const struct firmware *fw,
>> }
>> EXPORT_SYMBOL_GPL(btintel_download_firmware);
>>
>> +void btintel_firmware_lock(void)
>> +{
>> +	mutex_lock(&firmware_lock);
>> +}
>> +EXPORT_SYMBOL_GPL(btintel_firmware_lock);
>> +
>> +void btintel_firmware_unlock(void)
>> +{
>> +	mutex_unlock(&firmware_lock);
>> +}
>> +EXPORT_SYMBOL_GPL(btintel_firmware_unlock);
>> +
>
> so I am not in favor of this solution. The hardware guys should start  
> looking into fixing the firmware loading and provide proper firmware that  
> can be loaded at the same time.

Of course it’s much better to fix from hardware side.

>
> I am also not for sure penalizing all Intel Bluetooth/WiFi combos only  
> because one of them has a bug during simultaneous loading of WiFi and  
> Bluetooth firmware.

Yes, it’s not ideal.

>
> Frankly it would be better to detect a failed load and try a second time  
> instead of trying to lock each other out. The cross-contamination of WiFi  
> and Bluetooth drivers is just not clean.

Ok. Where do you think is better to handle it, Bluetooth core or USB core?

Kai-Heng

>
> Regards
>
> Marcel



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function
  2019-07-17 14:08   ` Kai-Heng Feng
@ 2019-07-26  7:01     ` Johannes Berg
  0 siblings, 0 replies; 6+ messages in thread
From: Johannes Berg @ 2019-07-26  7:01 UTC (permalink / raw)
  To: Kai-Heng Feng, Marcel Holtmann
  Cc: Luciano Coelho, Johan Hedberg, linuxwifi, linux-wireless,
	linux-bluetooth

[trimming CCs a bit]

> > so I am not in favor of this solution. The hardware guys should start  
> > looking into fixing the firmware loading and provide proper firmware that  
> > can be loaded at the same time.
> 
> Of course it’s much better to fix from hardware side.

I tried to ask around a bit, and am told that a firmware fix (to just
retry the relevant hardware block access) was made. I'll try to figure
out where/how it was (or wasn't?) released.

johannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, back to index

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-17  7:49 [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Kai-Heng Feng
2019-07-17  7:49 ` [PATCH v2 2/3] Bluetooth: btusb: Load firmware exclusively for Intel BT Kai-Heng Feng
2019-07-17  7:49 ` [PATCH v2 3/3] iwlwifi: Load firmware exclusively for Intel WiFi Kai-Heng Feng
2019-07-17 13:36 ` [PATCH v2 1/3] Bluetooth: btintel: Add firmware lock function Marcel Holtmann
2019-07-17 14:08   ` Kai-Heng Feng
2019-07-26  7:01     ` Johannes Berg

Linux-Bluetooth Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-bluetooth/0 linux-bluetooth/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-bluetooth linux-bluetooth/ https://lore.kernel.org/linux-bluetooth \
		linux-bluetooth@vger.kernel.org linux-bluetooth@archiver.kernel.org
	public-inbox-index linux-bluetooth


Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-bluetooth


AGPL code for this site: git clone https://public-inbox.org/ public-inbox