Message ID | 20190717074920.21624-1-kai.heng.feng@canonical.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Johannes Berg |
Headers | show |
Series | [v2,1/3] Bluetooth: btintel: Add firmware lock function | expand |
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
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
[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
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
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