diff options
Diffstat (limited to 'drivers/bluetooth')
| -rw-r--r-- | drivers/bluetooth/Kconfig | 14 | ||||
| -rw-r--r-- | drivers/bluetooth/bluecard_cs.c | 8 | ||||
| -rw-r--r-- | drivers/bluetooth/bpa10x.c | 2 | ||||
| -rw-r--r-- | drivers/bluetooth/btbcm.c | 1 | ||||
| -rw-r--r-- | drivers/bluetooth/btbcm.h | 2 | ||||
| -rw-r--r-- | drivers/bluetooth/btintel.c | 157 | ||||
| -rw-r--r-- | drivers/bluetooth/btintel.h | 33 | ||||
| -rw-r--r-- | drivers/bluetooth/btqcomsmd.c | 3 | ||||
| -rw-r--r-- | drivers/bluetooth/btsdio.c | 9 | ||||
| -rw-r--r-- | drivers/bluetooth/btusb.c | 162 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_bcm.c | 243 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_intel.c | 186 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_ldisc.c | 2 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_ll.c | 107 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_qca.c | 3 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_serdev.c | 1 | ||||
| -rw-r--r-- | drivers/bluetooth/hci_vhci.c | 6 | 
17 files changed, 628 insertions, 311 deletions
| diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index 60e1c7d6986d..07e55cd8f8c8 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig @@ -31,6 +31,16 @@ config BT_HCIBTUSB  	  Say Y here to compile support for Bluetooth USB devices into the  	  kernel or say M to compile it as module (btusb). +config BT_HCIBTUSB_AUTOSUSPEND +	bool "Enable USB autosuspend for Bluetooth USB devices by default" +	depends on BT_HCIBTUSB +	help +	  Say Y here to enable USB autosuspend for Bluetooth USB devices by +	  default. + +	  This can be overridden by passing btusb.enable_autosuspend=[y|n] +	  on the kernel commandline. +  config BT_HCIBTUSB_BCM  	bool "Broadcom protocol support"  	depends on BT_HCIBTUSB @@ -67,6 +77,7 @@ config BT_HCIBTSDIO  config BT_HCIUART  	tristate "HCI UART driver"  	depends on SERIAL_DEV_BUS || !SERIAL_DEV_BUS +	depends on NVMEM || !NVMEM  	depends on TTY  	help  	  Bluetooth HCI UART driver. @@ -97,6 +108,7 @@ config BT_HCIUART_NOKIA  	tristate "UART Nokia H4+ protocol support"  	depends on BT_HCIUART  	depends on BT_HCIUART_SERDEV +	depends on GPIOLIB  	depends on PM  	select BT_HCIUART_H4  	select BT_BCM @@ -158,6 +170,7 @@ config BT_HCIUART_3WIRE  config BT_HCIUART_INTEL  	bool "Intel protocol support"  	depends on BT_HCIUART +	depends on GPIOLIB  	select BT_HCIUART_H4  	select BT_INTEL  	help @@ -171,6 +184,7 @@ config BT_HCIUART_BCM  	depends on BT_HCIUART  	depends on BT_HCIUART_SERDEV  	depends on (!ACPI || SERIAL_DEV_CTRL_TTYPORT) +	depends on GPIOLIB  	select BT_HCIUART_H4  	select BT_BCM  	help diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index d513ef4743dc..82437a69f99c 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c @@ -302,9 +302,7 @@ static void bluecard_write_wakeup(struct bluecard_info *info)  			}  			/* Wait until the command reaches the baseband */ -			prepare_to_wait(&wq, &wait, TASK_INTERRUPTIBLE); -			schedule_timeout(HZ/10); -			finish_wait(&wq, &wait); +			mdelay(100);  			/* Set baud on baseband */  			info->ctrl_reg &= ~0x03; @@ -316,9 +314,7 @@ static void bluecard_write_wakeup(struct bluecard_info *info)  			outb(info->ctrl_reg, iobase + REG_CONTROL);  			/* Wait before the next HCI packet can be send */ -			prepare_to_wait(&wq, &wait, TASK_INTERRUPTIBLE); -			schedule_timeout(HZ); -			finish_wait(&wq, &wait); +			mdelay(1000);  		}  		if (len == skb->len) { diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index 7971bfbd4321..801ea4ca65e4 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c @@ -259,7 +259,7 @@ static int bpa10x_flush(struct hci_dev *hdev)  static int bpa10x_setup(struct hci_dev *hdev)  { -	const u8 req[] = { 0x07 }; +	static const u8 req[] = { 0x07 };  	struct sk_buff *skb;  	BT_DBG("%s", hdev->name); diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c index afa4cb3b16e3..6659f113042c 100644 --- a/drivers/bluetooth/btbcm.c +++ b/drivers/bluetooth/btbcm.c @@ -323,6 +323,7 @@ static const struct {  	{ 0x410e, "BCM43341B0"	},	/* 002.001.014 */  	{ 0x4406, "BCM4324B3"	},	/* 002.004.006 */  	{ 0x610c, "BCM4354"	},	/* 003.001.012 */ +	{ 0x2122, "BCM4343A0"	},	/* 001.001.034 */  	{ 0x2209, "BCM43430A1"  },	/* 001.002.009 */  	{ 0x6119, "BCM4345C0"	},	/* 003.001.025 */  	{ 0x230f, "BCM4356A2"	},	/* 001.003.015 */ diff --git a/drivers/bluetooth/btbcm.h b/drivers/bluetooth/btbcm.h index d9e6b41658e5..cfe6ad4cc621 100644 --- a/drivers/bluetooth/btbcm.h +++ b/drivers/bluetooth/btbcm.h @@ -44,8 +44,8 @@ struct bcm_set_sleep_mode {  	__u8 tristate_control;  	__u8 usb_auto_sleep;  	__u8 usb_resume_timeout; -	__u8 pulsed_host_wake;  	__u8 break_to_host; +	__u8 pulsed_host_wake;  } __packed;  struct bcm_set_pcm_int_params { diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index 4459555c9d88..5270d5513201 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c @@ -24,6 +24,7 @@  #include <linux/module.h>  #include <linux/firmware.h>  #include <linux/regmap.h> +#include <asm/unaligned.h>  #include <net/bluetooth/bluetooth.h>  #include <net/bluetooth/hci_core.h> @@ -75,7 +76,7 @@ EXPORT_SYMBOL_GPL(btintel_check_bdaddr);  int btintel_enter_mfg(struct hci_dev *hdev)  { -	const u8 param[] = { 0x01, 0x00 }; +	static const u8 param[] = { 0x01, 0x00 };  	struct sk_buff *skb;  	skb = __hci_cmd_sync(hdev, 0xfc11, 2, param, HCI_CMD_TIMEOUT); @@ -569,6 +570,160 @@ struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read,  }  EXPORT_SYMBOL_GPL(btintel_regmap_init); +int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param) +{ +	struct intel_reset params = { 0x00, 0x01, 0x00, 0x01, 0x00000000 }; +	struct sk_buff *skb; + +	params.boot_param = cpu_to_le32(boot_param); + +	skb = __hci_cmd_sync(hdev, 0xfc01, sizeof(params), ¶ms, +			     HCI_INIT_TIMEOUT); +	if (IS_ERR(skb)) { +		bt_dev_err(hdev, "Failed to send Intel Reset command"); +		return PTR_ERR(skb); +	} + +	kfree_skb(skb); + +	return 0; +} +EXPORT_SYMBOL_GPL(btintel_send_intel_reset); + +int btintel_read_boot_params(struct hci_dev *hdev, +			     struct intel_boot_params *params) +{ +	struct sk_buff *skb; + +	skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_INIT_TIMEOUT); +	if (IS_ERR(skb)) { +		bt_dev_err(hdev, "Reading Intel boot parameters failed (%ld)", +			   PTR_ERR(skb)); +		return PTR_ERR(skb); +	} + +	if (skb->len != sizeof(*params)) { +		bt_dev_err(hdev, "Intel boot parameters size mismatch"); +		kfree_skb(skb); +		return -EILSEQ; +	} + +	memcpy(params, skb->data, sizeof(*params)); + +	kfree_skb(skb); + +	if (params->status) { +		bt_dev_err(hdev, "Intel boot parameters command failed (%02x)", +			   params->status); +		return -bt_to_errno(params->status); +	} + +	bt_dev_info(hdev, "Device revision is %u", +		    le16_to_cpu(params->dev_revid)); + +	bt_dev_info(hdev, "Secure boot is %s", +		    params->secure_boot ? "enabled" : "disabled"); + +	bt_dev_info(hdev, "OTP lock is %s", +		    params->otp_lock ? "enabled" : "disabled"); + +	bt_dev_info(hdev, "API lock is %s", +		    params->api_lock ? "enabled" : "disabled"); + +	bt_dev_info(hdev, "Debug lock is %s", +		    params->debug_lock ? "enabled" : "disabled"); + +	bt_dev_info(hdev, "Minimum firmware build %u week %u %u", +		    params->min_fw_build_nn, params->min_fw_build_cw, +		    2000 + params->min_fw_build_yy); + +	return 0; +} +EXPORT_SYMBOL_GPL(btintel_read_boot_params); + +int btintel_download_firmware(struct hci_dev *hdev, const struct firmware *fw, +			      u32 *boot_param) +{ +	int err; +	const u8 *fw_ptr; +	u32 frag_len; + +	/* Start the firmware download transaction with the Init fragment +	 * represented by the 128 bytes of CSS header. +	 */ +	err = btintel_secure_send(hdev, 0x00, 128, fw->data); +	if (err < 0) { +		bt_dev_err(hdev, "Failed to send firmware header (%d)", err); +		goto done; +	} + +	/* Send the 256 bytes of public key information from the firmware +	 * as the PKey fragment. +	 */ +	err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128); +	if (err < 0) { +		bt_dev_err(hdev, "Failed to send firmware pkey (%d)", err); +		goto done; +	} + +	/* Send the 256 bytes of signature information from the firmware +	 * as the Sign fragment. +	 */ +	err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388); +	if (err < 0) { +		bt_dev_err(hdev, "Failed to send firmware signature (%d)", err); +		goto done; +	} + +	fw_ptr = fw->data + 644; +	frag_len = 0; + +	while (fw_ptr - fw->data < fw->size) { +		struct hci_command_hdr *cmd = (void *)(fw_ptr + frag_len); + +		/* Each SKU has a different reset parameter to use in the +		 * HCI_Intel_Reset command and it is embedded in the firmware +		 * data. So, instead of using static value per SKU, check +		 * the firmware data and save it for later use. +		 */ +		if (le16_to_cpu(cmd->opcode) == 0xfc0e) { +			/* The boot parameter is the first 32-bit value +			 * and rest of 3 octets are reserved. +			 */ +			*boot_param = get_unaligned_le32(fw_ptr + sizeof(*cmd)); + +			bt_dev_dbg(hdev, "boot_param=0x%x", *boot_param); +		} + +		frag_len += sizeof(*cmd) + cmd->plen; + +		/* The parameter length of the secure send command requires +		 * a 4 byte alignment. It happens so that the firmware file +		 * contains proper Intel_NOP commands to align the fragments +		 * as needed. +		 * +		 * Send set of commands with 4 byte alignment from the +		 * firmware data buffer as a single Data fragement. +		 */ +		if (!(frag_len % 4)) { +			err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr); +			if (err < 0) { +				bt_dev_err(hdev, +					   "Failed to send firmware data (%d)", +					   err); +				goto done; +			} + +			fw_ptr += frag_len; +			frag_len = 0; +		} +	} + +done: +	return err; +} +EXPORT_SYMBOL_GPL(btintel_download_firmware); +  MODULE_AUTHOR("Marcel Holtmann <[email protected]>");  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 1e8955aaafed..41c642cc523f 100644 --- a/drivers/bluetooth/btintel.h +++ b/drivers/bluetooth/btintel.h @@ -69,6 +69,14 @@ struct intel_secure_send_result {  	__u8     status;  } __packed; +struct intel_reset { +	__u8     reset_type; +	__u8     patch_enable; +	__u8     ddc_reload; +	__u8     boot_option; +	__le32   boot_param; +} __packed; +  #if IS_ENABLED(CONFIG_BT_INTEL)  int btintel_check_bdaddr(struct hci_dev *hdev); @@ -89,7 +97,11 @@ int btintel_read_version(struct hci_dev *hdev, struct intel_version *ver);  struct regmap *btintel_regmap_init(struct hci_dev *hdev, u16 opcode_read,  				   u16 opcode_write); - +int btintel_send_intel_reset(struct hci_dev *hdev, u32 boot_param); +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);  #else  static inline int btintel_check_bdaddr(struct hci_dev *hdev) @@ -165,4 +177,23 @@ static inline struct regmap *btintel_regmap_init(struct hci_dev *hdev,  {  	return ERR_PTR(-EINVAL);  } + +static inline int btintel_send_intel_reset(struct hci_dev *hdev, +					   u32 reset_param) +{ +	return -EOPNOTSUPP; +} + +static inline int btintel_read_boot_params(struct hci_dev *hdev, +					   struct intel_boot_params *params) +{ +	return -EOPNOTSUPP; +} + +static inline int btintel_download_firmware(struct hci_dev *dev, +					    const struct firmware *fw, +					    u32 *boot_param) +{ +	return -EOPNOTSUPP; +}  #endif diff --git a/drivers/bluetooth/btqcomsmd.c b/drivers/bluetooth/btqcomsmd.c index 663bed63b871..2c9a5fc9137d 100644 --- a/drivers/bluetooth/btqcomsmd.c +++ b/drivers/bluetooth/btqcomsmd.c @@ -88,7 +88,8 @@ static int btqcomsmd_send(struct hci_dev *hdev, struct sk_buff *skb)  		break;  	} -	kfree_skb(skb); +	if (!ret) +		kfree_skb(skb);  	return ret;  } diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c index c8e945d19ffe..20142bc77554 100644 --- a/drivers/bluetooth/btsdio.c +++ b/drivers/bluetooth/btsdio.c @@ -31,6 +31,7 @@  #include <linux/errno.h>  #include <linux/skbuff.h> +#include <linux/mmc/host.h>  #include <linux/mmc/sdio_ids.h>  #include <linux/mmc/sdio_func.h> @@ -292,6 +293,14 @@ static int btsdio_probe(struct sdio_func *func,  		tuple = tuple->next;  	} +	/* BCM43341 devices soldered onto the PCB (non-removable) use an +	 * uart connection for bluetooth, ignore the BT SDIO interface. +	 */ +	if (func->vendor == SDIO_VENDOR_ID_BROADCOM && +	    func->device == SDIO_DEVICE_ID_BROADCOM_43341 && +	    !mmc_card_is_removable(func->card->host)) +		return -ENODEV; +  	data = devm_kzalloc(&func->dev, sizeof(*data), GFP_KERNEL);  	if (!data)  		return -ENOMEM; diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index f7120c9eb9bd..2a55380ad730 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -23,6 +23,7 @@  #include <linux/module.h>  #include <linux/usb.h> +#include <linux/usb/quirks.h>  #include <linux/firmware.h>  #include <linux/of_device.h>  #include <linux/of_irq.h> @@ -40,6 +41,7 @@  static bool disable_scofix;  static bool force_scofix; +static bool enable_autosuspend = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTOSUSPEND);  static bool reset = true; @@ -263,6 +265,7 @@ static const struct usb_device_id blacklist_table[] = {  	/* QCA ROME chipset */  	{ USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x0cf3, 0xe009), .driver_info = BTUSB_QCA_ROME }, +	{ USB_DEVICE(0x0cf3, 0xe010), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x0cf3, 0xe300), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x0cf3, 0xe301), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x0cf3, 0xe360), .driver_info = BTUSB_QCA_ROME }, @@ -270,6 +273,7 @@ static const struct usb_device_id blacklist_table[] = {  	{ USB_DEVICE(0x0489, 0xe09f), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x0489, 0xe0a2), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME }, +	{ USB_DEVICE(0x04ca, 0x3015), .driver_info = BTUSB_QCA_ROME },  	{ USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME },  	/* Broadcom BCM2035 */ @@ -387,9 +391,8 @@ static const struct usb_device_id blacklist_table[] = {  #define BTUSB_FIRMWARE_LOADED	7  #define BTUSB_FIRMWARE_FAILED	8  #define BTUSB_BOOTING		9 -#define BTUSB_RESET_RESUME	10 -#define BTUSB_DIAG_RUNNING	11 -#define BTUSB_OOB_WAKE_ENABLED	12 +#define BTUSB_DIAG_RUNNING	10 +#define BTUSB_OOB_WAKE_ENABLED	11  struct btusb_data {  	struct hci_dev       *hdev; @@ -2006,15 +2009,11 @@ static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)  static int btusb_setup_intel_new(struct hci_dev *hdev)  { -	static const u8 reset_param[] = { 0x00, 0x01, 0x00, 0x01, -					  0x00, 0x08, 0x04, 0x00 };  	struct btusb_data *data = hci_get_drvdata(hdev); -	struct sk_buff *skb;  	struct intel_version ver; -	struct intel_boot_params *params; +	struct intel_boot_params params;  	const struct firmware *fw; -	const u8 *fw_ptr; -	u32 frag_len; +	u32 boot_param;  	char fwname[64];  	ktime_t calltime, delta, rettime;  	unsigned long long duration; @@ -2022,6 +2021,12 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  	BT_DBG("%s", hdev->name); +	/* Set the default boot parameter to 0x0 and it is updated to +	 * SKU specific boot parameter after reading Intel_Write_Boot_Params +	 * command while downloading the firmware. +	 */ +	boot_param = 0x00000000; +  	calltime = ktime_get();  	/* Read the Intel version information to determine if the device @@ -2092,55 +2097,24 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  	/* Read the secure boot parameters to identify the operating  	 * details of the bootloader.  	 */ -	skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_INIT_TIMEOUT); -	if (IS_ERR(skb)) { -		BT_ERR("%s: Reading Intel boot parameters failed (%ld)", -		       hdev->name, PTR_ERR(skb)); -		return PTR_ERR(skb); -	} - -	if (skb->len != sizeof(*params)) { -		BT_ERR("%s: Intel boot parameters size mismatch", hdev->name); -		kfree_skb(skb); -		return -EILSEQ; -	} - -	params = (struct intel_boot_params *)skb->data; - -	bt_dev_info(hdev, "Device revision is %u", -		    le16_to_cpu(params->dev_revid)); - -	bt_dev_info(hdev, "Secure boot is %s", -		    params->secure_boot ? "enabled" : "disabled"); - -	bt_dev_info(hdev, "OTP lock is %s", -		    params->otp_lock ? "enabled" : "disabled"); - -	bt_dev_info(hdev, "API lock is %s", -		    params->api_lock ? "enabled" : "disabled"); - -	bt_dev_info(hdev, "Debug lock is %s", -		    params->debug_lock ? "enabled" : "disabled"); - -	bt_dev_info(hdev, "Minimum firmware build %u week %u %u", -		    params->min_fw_build_nn, params->min_fw_build_cw, -		    2000 + params->min_fw_build_yy); +	err = btintel_read_boot_params(hdev, ¶ms); +	if (err) +		return err;  	/* It is required that every single firmware fragment is acknowledged  	 * with a command complete event. If the boot parameters indicate  	 * that this bootloader does not send them, then abort the setup.  	 */ -	if (params->limited_cce != 0x00) { +	if (params.limited_cce != 0x00) {  		BT_ERR("%s: Unsupported Intel firmware loading method (%u)", -		       hdev->name, params->limited_cce); -		kfree_skb(skb); +		       hdev->name, params.limited_cce);  		return -EINVAL;  	}  	/* If the OTP has no valid Bluetooth device address, then there will  	 * also be no valid address for the operational firmware.  	 */ -	if (!bacmp(¶ms->otp_bdaddr, BDADDR_ANY)) { +	if (!bacmp(¶ms.otp_bdaddr, BDADDR_ANY)) {  		bt_dev_info(hdev, "No device address configured");  		set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);  	} @@ -2171,7 +2145,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  	case 0x0c:	/* WsP */  		snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",  			 le16_to_cpu(ver.hw_variant), -			 le16_to_cpu(params->dev_revid)); +			 le16_to_cpu(params.dev_revid));  		break;  	case 0x11:	/* JfP */  	case 0x12:	/* ThP */ @@ -2189,7 +2163,6 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  	if (err < 0) {  		BT_ERR("%s: Failed to load Intel firmware file (%d)",  		       hdev->name, err); -		kfree_skb(skb);  		return err;  	} @@ -2203,7 +2176,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  	case 0x0c:	/* WsP */  		snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc",  			 le16_to_cpu(ver.hw_variant), -			 le16_to_cpu(params->dev_revid)); +			 le16_to_cpu(params.dev_revid));  		break;  	case 0x11:	/* JfP */  	case 0x12:	/* ThP */ @@ -2217,8 +2190,6 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  		return -EINVAL;  	} -	kfree_skb(skb); -  	if (fw->size < 644) {  		BT_ERR("%s: Invalid size of firmware file (%zu)",  		       hdev->name, fw->size); @@ -2228,64 +2199,10 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)  	set_bit(BTUSB_DOWNLOADING, &data->flags); -	/* Start the firmware download transaction with the Init fragment -	 * represented by the 128 bytes of CSS header. -	 */ -	err = btintel_secure_send(hdev, 0x00, 128, fw->data); -	if (err < 0) { -		BT_ERR("%s: Failed to send firmware header (%d)", -		       hdev->name, err); -		goto done; -	} - -	/* Send the 256 bytes of public key information from the firmware -	 * as the PKey fragment. -	 */ -	err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128); -	if (err < 0) { -		BT_ERR("%s: Failed to send firmware public key (%d)", -		       hdev->name, err); -		goto done; -	} - -	/* Send the 256 bytes of signature information from the firmware -	 * as the Sign fragment. -	 */ -	err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388); -	if (err < 0) { -		BT_ERR("%s: Failed to send firmware signature (%d)", -		       hdev->name, err); +	/* Start firmware downloading and get boot parameter */ +	err = btintel_download_firmware(hdev, fw, &boot_param); +	if (err < 0)  		goto done; -	} - -	fw_ptr = fw->data + 644; -	frag_len = 0; - -	while (fw_ptr - fw->data < fw->size) { -		struct hci_command_hdr *cmd = (void *)(fw_ptr + frag_len); - -		frag_len += sizeof(*cmd) + cmd->plen; - -		/* The parameter length of the secure send command requires -		 * a 4 byte alignment. It happens so that the firmware file -		 * contains proper Intel_NOP commands to align the fragments -		 * as needed. -		 * -		 * Send set of commands with 4 byte alignment from the -		 * firmware data buffer as a single Data fragement. -		 */ -		if (!(frag_len % 4)) { -			err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr); -			if (err < 0) { -				BT_ERR("%s: Failed to send firmware data (%d)", -				       hdev->name, err); -				goto done; -			} - -			fw_ptr += frag_len; -			frag_len = 0; -		} -	}  	set_bit(BTUSB_FIRMWARE_LOADED, &data->flags); @@ -2338,12 +2255,9 @@ done:  	set_bit(BTUSB_BOOTING, &data->flags); -	skb = __hci_cmd_sync(hdev, 0xfc01, sizeof(reset_param), reset_param, -			     HCI_INIT_TIMEOUT); -	if (IS_ERR(skb)) -		return PTR_ERR(skb); - -	kfree_skb(skb); +	err = btintel_send_intel_reset(hdev, boot_param); +	if (err) +		return err;  	/* The bootloader will not indicate when the device is ready. This  	 * is done by the operational firmware sending bootup notification. @@ -3120,9 +3034,9 @@ static int btusb_probe(struct usb_interface *intf,  		/* QCA Rome devices lose their updated firmware over suspend,  		 * but the USB hub doesn't notice any status change. -		 * Explicitly request a device reset on resume. +		 * explicitly request a device reset on resume.  		 */ -		set_bit(BTUSB_RESET_RESUME, &data->flags); +		interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;  	}  #ifdef CONFIG_BT_HCIBTUSB_RTL @@ -3133,7 +3047,7 @@ static int btusb_probe(struct usb_interface *intf,  		 * but the USB hub doesn't notice any status change.  		 * Explicitly request a device reset on resume.  		 */ -		set_bit(BTUSB_RESET_RESUME, &data->flags); +		interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;  	}  #endif @@ -3213,6 +3127,9 @@ static int btusb_probe(struct usb_interface *intf,  	}  #endif +	if (enable_autosuspend) +		usb_enable_autosuspend(data->udev); +  	err = hci_register_dev(hdev);  	if (err < 0)  		goto out_free_dev; @@ -3299,14 +3216,6 @@ static int btusb_suspend(struct usb_interface *intf, pm_message_t message)  		enable_irq(data->oob_wake_irq);  	} -	/* Optionally request a device reset on resume, but only when -	 * wakeups are disabled. If wakeups are enabled we assume the -	 * device will stay powered up throughout suspend. -	 */ -	if (test_bit(BTUSB_RESET_RESUME, &data->flags) && -	    !device_may_wakeup(&data->udev->dev)) -		data->udev->reset_resume = 1; -  	return 0;  } @@ -3425,6 +3334,9 @@ MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");  module_param(force_scofix, bool, 0644);  MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size"); +module_param(enable_autosuspend, bool, 0644); +MODULE_PARM_DESC(enable_autosuspend, "Enable USB autosuspend by default"); +  module_param(reset, bool, 0644);  MODULE_PARM_DESC(reset, "Send HCI reset command on initialization"); diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c index 707c2d1b84c7..0438a64b8185 100644 --- a/drivers/bluetooth/hci_bcm.c +++ b/drivers/bluetooth/hci_bcm.c @@ -29,6 +29,7 @@  #include <linux/acpi.h>  #include <linux/of.h>  #include <linux/property.h> +#include <linux/platform_data/x86/apple.h>  #include <linux/platform_device.h>  #include <linux/clk.h>  #include <linux/gpio/consumer.h> @@ -52,7 +53,37 @@  #define BCM_AUTOSUSPEND_DELAY	5000 /* default autosleep delay */ -/* device driver resources */ +/** + * struct bcm_device - device driver resources + * @serdev_hu: HCI UART controller struct + * @list: bcm_device_list node + * @dev: physical UART slave + * @name: device name logged by bt_dev_*() functions + * @device_wakeup: BT_WAKE pin, + *	assert = Bluetooth device must wake up or remain awake, + *	deassert = Bluetooth device may sleep when sleep criteria are met + * @shutdown: BT_REG_ON pin, + *	power up or power down Bluetooth device internal regulators + * @set_device_wakeup: callback to toggle BT_WAKE pin + *	either by accessing @device_wakeup or by calling @btlp + * @set_shutdown: callback to toggle BT_REG_ON pin + *	either by accessing @shutdown or by calling @btpu/@btpd + * @btlp: Apple ACPI method to toggle BT_WAKE pin ("Bluetooth Low Power") + * @btpu: Apple ACPI method to drive BT_REG_ON pin high ("Bluetooth Power Up") + * @btpd: Apple ACPI method to drive BT_REG_ON pin low ("Bluetooth Power Down") + * @clk: clock used by Bluetooth device + * @clk_enabled: whether @clk is prepared and enabled + * @init_speed: default baudrate of Bluetooth device; + *	the host UART is initially set to this baudrate so that + *	it can configure the Bluetooth device for @oper_speed + * @oper_speed: preferred baudrate of Bluetooth device; + *	set to 0 if @init_speed is already the preferred baudrate + * @irq: interrupt triggered by HOST_WAKE_BT pin + * @irq_active_low: whether @irq is active low + * @hu: pointer to HCI UART controller struct, + *	used to disable flow control during runtime suspend and system sleep + * @is_suspended: whether flow control is currently disabled + */  struct bcm_device {  	/* Must be the first member, hci_serdev.c expects this. */  	struct hci_uart		serdev_hu; @@ -63,6 +94,11 @@ struct bcm_device {  	const char		*name;  	struct gpio_desc	*device_wakeup;  	struct gpio_desc	*shutdown; +	int			(*set_device_wakeup)(struct bcm_device *, bool); +	int			(*set_shutdown)(struct bcm_device *, bool); +#ifdef CONFIG_ACPI +	acpi_handle		btlp, btpu, btpd; +#endif  	struct clk		*clk;  	bool			clk_enabled; @@ -74,7 +110,7 @@ struct bcm_device {  #ifdef CONFIG_PM  	struct hci_uart		*hu; -	bool			is_suspended; /* suspend/resume flag */ +	bool			is_suspended;  #endif  }; @@ -170,11 +206,21 @@ static bool bcm_device_exists(struct bcm_device *device)  static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)  { -	if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled) -		clk_prepare_enable(dev->clk); +	int err; -	gpiod_set_value(dev->shutdown, powered); -	gpiod_set_value(dev->device_wakeup, powered); +	if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled) { +		err = clk_prepare_enable(dev->clk); +		if (err) +			return err; +	} + +	err = dev->set_shutdown(dev, powered); +	if (err) +		goto err_clk_disable; + +	err = dev->set_device_wakeup(dev, powered); +	if (err) +		goto err_revert_shutdown;  	if (!powered && !IS_ERR(dev->clk) && dev->clk_enabled)  		clk_disable_unprepare(dev->clk); @@ -182,6 +228,13 @@ static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)  	dev->clk_enabled = powered;  	return 0; + +err_revert_shutdown: +	dev->set_shutdown(dev, !powered); +err_clk_disable: +	if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled) +		clk_disable_unprepare(dev->clk); +	return err;  }  #ifdef CONFIG_PM @@ -191,9 +244,7 @@ static irqreturn_t bcm_host_wake(int irq, void *data)  	bt_dev_dbg(bdev, "Host wake IRQ"); -	pm_runtime_get(bdev->dev); -	pm_runtime_mark_last_busy(bdev->dev); -	pm_runtime_put_autosuspend(bdev->dev); +	pm_request_resume(bdev->dev);  	return IRQ_HANDLED;  } @@ -218,8 +269,10 @@ static int bcm_request_irq(struct bcm_data *bcm)  			       bdev->irq_active_low ? IRQF_TRIGGER_FALLING :  						      IRQF_TRIGGER_RISING,  			       "host_wake", bdev); -	if (err) +	if (err) { +		bdev->irq = err;  		goto unlock; +	}  	device_init_wakeup(bdev->dev, true); @@ -247,8 +300,8 @@ static const struct bcm_set_sleep_mode default_sleep_params = {  	/* Irrelevant USB flags */  	.usb_auto_sleep = 0,  	.usb_resume_timeout = 0, +	.break_to_host = 0,  	.pulsed_host_wake = 0, -	.break_to_host = 0  };  static int bcm_setup_sleep(struct hci_uart *hu) @@ -304,6 +357,7 @@ static int bcm_open(struct hci_uart *hu)  {  	struct bcm_data *bcm;  	struct list_head *p; +	int err;  	bt_dev_dbg(hu->hdev, "hu %p", hu); @@ -318,7 +372,10 @@ static int bcm_open(struct hci_uart *hu)  	mutex_lock(&bcm_device_lock);  	if (hu->serdev) { -		serdev_device_open(hu->serdev); +		err = serdev_device_open(hu->serdev); +		if (err) +			goto err_free; +  		bcm->dev = serdev_device_get_drvdata(hu->serdev);  		goto out;  	} @@ -346,17 +403,33 @@ out:  	if (bcm->dev) {  		hu->init_speed = bcm->dev->init_speed;  		hu->oper_speed = bcm->dev->oper_speed; -		bcm_gpio_set_power(bcm->dev, true); +		err = bcm_gpio_set_power(bcm->dev, true); +		if (err) +			goto err_unset_hu;  	}  	mutex_unlock(&bcm_device_lock);  	return 0; + +err_unset_hu: +	if (hu->serdev) +		serdev_device_close(hu->serdev); +#ifdef CONFIG_PM +	else +		bcm->dev->hu = NULL; +#endif +err_free: +	mutex_unlock(&bcm_device_lock); +	hu->priv = NULL; +	kfree(bcm); +	return err;  }  static int bcm_close(struct hci_uart *hu)  {  	struct bcm_data *bcm = hu->priv;  	struct bcm_device *bdev = NULL; +	int err;  	bt_dev_dbg(hu->hdev, "hu %p", hu); @@ -374,16 +447,17 @@ static int bcm_close(struct hci_uart *hu)  	}  	if (bdev) { -		bcm_gpio_set_power(bdev, false); -#ifdef CONFIG_PM -		pm_runtime_disable(bdev->dev); -		pm_runtime_set_suspended(bdev->dev); - -		if (device_can_wakeup(bdev->dev)) { +		if (IS_ENABLED(CONFIG_PM) && bdev->irq > 0) {  			devm_free_irq(bdev->dev, bdev->irq, bdev);  			device_init_wakeup(bdev->dev, false); +			pm_runtime_disable(bdev->dev);  		} -#endif + +		err = bcm_gpio_set_power(bdev, false); +		if (err) +			bt_dev_err(hu->hdev, "Failed to power down"); +		else +			pm_runtime_set_suspended(bdev->dev);  	}  	mutex_unlock(&bcm_device_lock); @@ -512,11 +586,8 @@ static int bcm_recv(struct hci_uart *hu, const void *data, int count)  	} else if (!bcm->rx_skb) {  		/* Delay auto-suspend when receiving completed packet */  		mutex_lock(&bcm_device_lock); -		if (bcm->dev && bcm_device_exists(bcm->dev)) { -			pm_runtime_get(bcm->dev->dev); -			pm_runtime_mark_last_busy(bcm->dev->dev); -			pm_runtime_put_autosuspend(bcm->dev->dev); -		} +		if (bcm->dev && bcm_device_exists(bcm->dev)) +			pm_request_resume(bcm->dev->dev);  		mutex_unlock(&bcm_device_lock);  	} @@ -566,6 +637,7 @@ static struct sk_buff *bcm_dequeue(struct hci_uart *hu)  static int bcm_suspend_device(struct device *dev)  {  	struct bcm_device *bdev = dev_get_drvdata(dev); +	int err;  	bt_dev_dbg(bdev, ""); @@ -577,27 +649,37 @@ static int bcm_suspend_device(struct device *dev)  	}  	/* Suspend the device */ -	if (bdev->device_wakeup) { -		gpiod_set_value(bdev->device_wakeup, false); -		bt_dev_dbg(bdev, "suspend, delaying 15 ms"); -		mdelay(15); +	err = bdev->set_device_wakeup(bdev, false); +	if (err) { +		if (bdev->is_suspended && bdev->hu) { +			bdev->is_suspended = false; +			hci_uart_set_flow_control(bdev->hu, false); +		} +		return -EBUSY;  	} +	bt_dev_dbg(bdev, "suspend, delaying 15 ms"); +	msleep(15); +  	return 0;  }  static int bcm_resume_device(struct device *dev)  {  	struct bcm_device *bdev = dev_get_drvdata(dev); +	int err;  	bt_dev_dbg(bdev, ""); -	if (bdev->device_wakeup) { -		gpiod_set_value(bdev->device_wakeup, true); -		bt_dev_dbg(bdev, "resume, delaying 15 ms"); -		mdelay(15); +	err = bdev->set_device_wakeup(bdev, true); +	if (err) { +		dev_err(dev, "Failed to power up\n"); +		return err;  	} +	bt_dev_dbg(bdev, "resume, delaying 15 ms"); +	msleep(15); +  	/* When this executes, the device has woken up already */  	if (bdev->is_suspended && bdev->hu) {  		bdev->is_suspended = false; @@ -632,7 +714,7 @@ static int bcm_suspend(struct device *dev)  	if (pm_runtime_active(dev))  		bcm_suspend_device(dev); -	if (device_may_wakeup(dev)) { +	if (device_may_wakeup(dev) && bdev->irq > 0) {  		error = enable_irq_wake(bdev->irq);  		if (!error)  			bt_dev_dbg(bdev, "BCM irq: enabled"); @@ -648,6 +730,7 @@ unlock:  static int bcm_resume(struct device *dev)  {  	struct bcm_device *bdev = dev_get_drvdata(dev); +	int err = 0;  	bt_dev_dbg(bdev, "resume: is_suspended %d", bdev->is_suspended); @@ -662,19 +745,21 @@ static int bcm_resume(struct device *dev)  	if (!bdev->hu)  		goto unlock; -	if (device_may_wakeup(dev)) { +	if (device_may_wakeup(dev) && bdev->irq > 0) {  		disable_irq_wake(bdev->irq);  		bt_dev_dbg(bdev, "BCM irq: disabled");  	} -	bcm_resume_device(dev); +	err = bcm_resume_device(dev);  unlock:  	mutex_unlock(&bcm_device_lock); -	pm_runtime_disable(dev); -	pm_runtime_set_active(dev); -	pm_runtime_enable(dev); +	if (!err) { +		pm_runtime_disable(dev); +		pm_runtime_set_active(dev); +		pm_runtime_enable(dev); +	}  	return 0;  } @@ -771,25 +856,84 @@ static int bcm_resource(struct acpi_resource *ares, void *data)  	return 0;  } + +static int bcm_apple_set_device_wakeup(struct bcm_device *dev, bool awake) +{ +	if (ACPI_FAILURE(acpi_execute_simple_method(dev->btlp, NULL, !awake))) +		return -EIO; + +	return 0; +} + +static int bcm_apple_set_shutdown(struct bcm_device *dev, bool powered) +{ +	if (ACPI_FAILURE(acpi_evaluate_object(powered ? dev->btpu : dev->btpd, +					      NULL, NULL, NULL))) +		return -EIO; + +	return 0; +} + +static int bcm_apple_get_resources(struct bcm_device *dev) +{ +	struct acpi_device *adev = ACPI_COMPANION(dev->dev); +	const union acpi_object *obj; + +	if (!adev || +	    ACPI_FAILURE(acpi_get_handle(adev->handle, "BTLP", &dev->btlp)) || +	    ACPI_FAILURE(acpi_get_handle(adev->handle, "BTPU", &dev->btpu)) || +	    ACPI_FAILURE(acpi_get_handle(adev->handle, "BTPD", &dev->btpd))) +		return -ENODEV; + +	if (!acpi_dev_get_property(adev, "baud", ACPI_TYPE_BUFFER, &obj) && +	    obj->buffer.length == 8) +		dev->init_speed = *(u64 *)obj->buffer.pointer; + +	dev->set_device_wakeup = bcm_apple_set_device_wakeup; +	dev->set_shutdown = bcm_apple_set_shutdown; + +	return 0; +} +#else +static inline int bcm_apple_get_resources(struct bcm_device *dev) +{ +	return -EOPNOTSUPP; +}  #endif /* CONFIG_ACPI */ +static int bcm_gpio_set_device_wakeup(struct bcm_device *dev, bool awake) +{ +	gpiod_set_value(dev->device_wakeup, awake); +	return 0; +} + +static int bcm_gpio_set_shutdown(struct bcm_device *dev, bool powered) +{ +	gpiod_set_value(dev->shutdown, powered); +	return 0; +} +  static int bcm_get_resources(struct bcm_device *dev)  {  	dev->name = dev_name(dev->dev); +	if (x86_apple_machine && !bcm_apple_get_resources(dev)) +		return 0; +  	dev->clk = devm_clk_get(dev->dev, NULL); -	dev->device_wakeup = devm_gpiod_get_optional(dev->dev, -						     "device-wakeup", -						     GPIOD_OUT_LOW); +	dev->device_wakeup = devm_gpiod_get(dev->dev, "device-wakeup", +					    GPIOD_OUT_LOW);  	if (IS_ERR(dev->device_wakeup))  		return PTR_ERR(dev->device_wakeup); -	dev->shutdown = devm_gpiod_get_optional(dev->dev, "shutdown", -						GPIOD_OUT_LOW); +	dev->shutdown = devm_gpiod_get(dev->dev, "shutdown", GPIOD_OUT_LOW);  	if (IS_ERR(dev->shutdown))  		return PTR_ERR(dev->shutdown); +	dev->set_device_wakeup = bcm_gpio_set_device_wakeup; +	dev->set_shutdown = bcm_gpio_set_shutdown; +  	/* IRQ can be declared in ACPI table as Interrupt or GpioInt */  	if (dev->irq <= 0) {  		struct gpio_desc *gpio; @@ -802,7 +946,7 @@ static int bcm_get_resources(struct bcm_device *dev)  		dev->irq = gpiod_to_irq(gpio);  	} -	dev_info(dev->dev, "BCM irq: %d\n", dev->irq); +	dev_dbg(dev->dev, "BCM irq: %d\n", dev->irq);  	return 0;  } @@ -892,7 +1036,9 @@ static int bcm_probe(struct platform_device *pdev)  	list_add_tail(&dev->list, &bcm_device_list);  	mutex_unlock(&bcm_device_lock); -	bcm_gpio_set_power(dev, false); +	ret = bcm_gpio_set_power(dev, false); +	if (ret) +		dev_err(&pdev->dev, "Failed to power down\n");  	return 0;  } @@ -939,6 +1085,7 @@ static const struct acpi_device_id bcm_acpi_match[] = {  	{ "BCM2E65", (kernel_ulong_t)&acpi_bcm_int_last_gpios },  	{ "BCM2E67", (kernel_ulong_t)&acpi_bcm_int_last_gpios },  	{ "BCM2E71", (kernel_ulong_t)&acpi_bcm_int_last_gpios }, +	{ "BCM2E72", (kernel_ulong_t)&acpi_bcm_int_last_gpios },  	{ "BCM2E7B", (kernel_ulong_t)&acpi_bcm_int_last_gpios },  	{ "BCM2E7C", (kernel_ulong_t)&acpi_bcm_int_last_gpios },  	{ "BCM2E7E", (kernel_ulong_t)&acpi_bcm_int_first_gpios }, @@ -993,7 +1140,9 @@ static int bcm_serdev_probe(struct serdev_device *serdev)  	if (err)  		return err; -	bcm_gpio_set_power(bcmdev, false); +	err = bcm_gpio_set_power(bcmdev, false); +	if (err) +		dev_err(&serdev->dev, "Failed to power down\n");  	return hci_uart_register_device(&bcmdev->serdev_hu, &bcm_proto);  } diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c index aad07e40ea4f..7c166e3b308b 100644 --- a/drivers/bluetooth/hci_intel.c +++ b/drivers/bluetooth/hci_intel.c @@ -540,18 +540,15 @@ static int intel_set_baudrate(struct hci_uart *hu, unsigned int speed)  static int intel_setup(struct hci_uart *hu)  { -	static const u8 reset_param[] = { 0x00, 0x01, 0x00, 0x01, -					  0x00, 0x08, 0x04, 0x00 };  	struct intel_data *intel = hu->priv;  	struct hci_dev *hdev = hu->hdev;  	struct sk_buff *skb;  	struct intel_version ver; -	struct intel_boot_params *params; +	struct intel_boot_params params;  	struct list_head *p;  	const struct firmware *fw; -	const u8 *fw_ptr;  	char fwname[64]; -	u32 frag_len; +	u32 boot_param;  	ktime_t calltime, delta, rettime;  	unsigned long long duration;  	unsigned int init_speed, oper_speed; @@ -563,6 +560,12 @@ static int intel_setup(struct hci_uart *hu)  	hu->hdev->set_diag = btintel_set_diag;  	hu->hdev->set_bdaddr = btintel_set_bdaddr; +	/* Set the default boot parameter to 0x0 and it is updated to +	 * SKU specific boot parameter after reading Intel_Write_Boot_Params +	 * command while downloading the firmware. +	 */ +	boot_param = 0x00000000; +  	calltime = ktime_get();  	if (hu->init_speed) @@ -656,85 +659,95 @@ static int intel_setup(struct hci_uart *hu)  	/* Read the secure boot parameters to identify the operating  	 * details of the bootloader.  	 */ -	skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_CMD_TIMEOUT); -	if (IS_ERR(skb)) { -		bt_dev_err(hdev, "Reading Intel boot parameters failed (%ld)", -			   PTR_ERR(skb)); -		return PTR_ERR(skb); -	} - -	if (skb->len != sizeof(*params)) { -		bt_dev_err(hdev, "Intel boot parameters size mismatch"); -		kfree_skb(skb); -		return -EILSEQ; -	} - -	params = (struct intel_boot_params *)skb->data; -	if (params->status) { -		bt_dev_err(hdev, "Intel boot parameters command failure (%02x)", -			   params->status); -		err = -bt_to_errno(params->status); -		kfree_skb(skb); +	err = btintel_read_boot_params(hdev, ¶ms); +	if (err)  		return err; -	} - -	bt_dev_info(hdev, "Device revision is %u", -		    le16_to_cpu(params->dev_revid)); - -	bt_dev_info(hdev, "Secure boot is %s", -		    params->secure_boot ? "enabled" : "disabled"); - -	bt_dev_info(hdev, "Minimum firmware build %u week %u %u", -		params->min_fw_build_nn, params->min_fw_build_cw, -		2000 + params->min_fw_build_yy);  	/* It is required that every single firmware fragment is acknowledged  	 * with a command complete event. If the boot parameters indicate  	 * that this bootloader does not send them, then abort the setup.  	 */ -	if (params->limited_cce != 0x00) { +	if (params.limited_cce != 0x00) {  		bt_dev_err(hdev, "Unsupported Intel firmware loading method (%u)", -			   params->limited_cce); -		kfree_skb(skb); +			   params.limited_cce);  		return -EINVAL;  	}  	/* If the OTP has no valid Bluetooth device address, then there will  	 * also be no valid address for the operational firmware.  	 */ -	if (!bacmp(¶ms->otp_bdaddr, BDADDR_ANY)) { +	if (!bacmp(¶ms.otp_bdaddr, BDADDR_ANY)) {  		bt_dev_info(hdev, "No device address configured");  		set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);  	}  	/* With this Intel bootloader only the hardware variant and device -	 * revision information are used to select the right firmware. +	 * revision information are used to select the right firmware for SfP +	 * and WsP.  	 *  	 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi.  	 *  	 * Currently the supported hardware variants are:  	 *   11 (0x0b) for iBT 3.0 (LnP/SfP) +	 *   12 (0x0c) for iBT 3.5 (WsP) +	 * +	 * For ThP/JfP and for future SKU's, the FW name varies based on HW +	 * variant, HW revision and FW revision, as these are dependent on CNVi +	 * and RF Combination. +	 * +	 *   18 (0x12) for iBT3.5 (ThP/JfP) +	 * +	 * The firmware file name for these will be +	 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi. +	 *  	 */ -	snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi", -		le16_to_cpu(ver.hw_variant), -		le16_to_cpu(params->dev_revid)); +	switch (ver.hw_variant) { +	case 0x0b:      /* SfP */ +	case 0x0c:      /* WsP */ +		snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi", +			 le16_to_cpu(ver.hw_variant), +			 le16_to_cpu(params.dev_revid)); +		break; +	case 0x12:      /* ThP */ +		snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.sfi", +			 le16_to_cpu(ver.hw_variant), +			 le16_to_cpu(ver.hw_revision), +			 le16_to_cpu(ver.fw_revision)); +		break; +	default: +		bt_dev_err(hdev, "Unsupported Intel hardware variant (%u)", +			   ver.hw_variant); +		return -EINVAL; +	}  	err = request_firmware(&fw, fwname, &hdev->dev);  	if (err < 0) {  		bt_dev_err(hdev, "Failed to load Intel firmware file (%d)",  			   err); -		kfree_skb(skb);  		return err;  	}  	bt_dev_info(hdev, "Found device firmware: %s", fwname);  	/* Save the DDC file name for later */ -	snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc", -		le16_to_cpu(ver.hw_variant), -		le16_to_cpu(params->dev_revid)); - -	kfree_skb(skb); +	switch (ver.hw_variant) { +	case 0x0b:      /* SfP */ +	case 0x0c:      /* WsP */ +		snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc", +			 le16_to_cpu(ver.hw_variant), +			 le16_to_cpu(params.dev_revid)); +		break; +	case 0x12:      /* ThP */ +		snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.ddc", +			 le16_to_cpu(ver.hw_variant), +			 le16_to_cpu(ver.hw_revision), +			 le16_to_cpu(ver.fw_revision)); +		break; +	default: +		bt_dev_err(hdev, "Unsupported Intel hardware variant (%u)", +			   ver.hw_variant); +		return -EINVAL; +	}  	if (fw->size < 644) {  		bt_dev_err(hdev, "Invalid size of firmware file (%zu)", @@ -745,70 +758,10 @@ static int intel_setup(struct hci_uart *hu)  	set_bit(STATE_DOWNLOADING, &intel->flags); -	/* Start the firmware download transaction with the Init fragment -	 * represented by the 128 bytes of CSS header. -	 */ -	err = btintel_secure_send(hdev, 0x00, 128, fw->data); -	if (err < 0) { -		bt_dev_err(hdev, "Failed to send firmware header (%d)", err); -		goto done; -	} - -	/* Send the 256 bytes of public key information from the firmware -	 * as the PKey fragment. -	 */ -	err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128); -	if (err < 0) { -		bt_dev_err(hdev, "Failed to send firmware public key (%d)", -			   err); -		goto done; -	} - -	/* Send the 256 bytes of signature information from the firmware -	 * as the Sign fragment. -	 */ -	err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388); -	if (err < 0) { -		bt_dev_err(hdev, "Failed to send firmware signature (%d)", -			   err); +	/* Start firmware downloading and get boot parameter */ +	err = btintel_download_firmware(hdev, fw, &boot_param); +	if (err < 0)  		goto done; -	} - -	fw_ptr = fw->data + 644; -	frag_len = 0; - -	while (fw_ptr - fw->data < fw->size) { -		struct hci_command_hdr *cmd = (void *)(fw_ptr + frag_len); - -		frag_len += sizeof(*cmd) + cmd->plen; - -		bt_dev_dbg(hdev, "Patching %td/%zu", (fw_ptr - fw->data), -			   fw->size); - -		/* The parameter length of the secure send command requires -		 * a 4 byte alignment. It happens so that the firmware file -		 * contains proper Intel_NOP commands to align the fragments -		 * as needed. -		 * -		 * Send set of commands with 4 byte alignment from the -		 * firmware data buffer as a single Data fragement. -		 */ -		if (frag_len % 4) -			continue; - -		/* Send each command from the firmware data buffer as -		 * a single Data fragment. -		 */ -		err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr); -		if (err < 0) { -			bt_dev_err(hdev, "Failed to send firmware data (%d)", -				   err); -			goto done; -		} - -		fw_ptr += frag_len; -		frag_len = 0; -	}  	set_bit(STATE_FIRMWARE_LOADED, &intel->flags); @@ -869,12 +822,9 @@ done:  	set_bit(STATE_BOOTING, &intel->flags); -	skb = __hci_cmd_sync(hdev, 0xfc01, sizeof(reset_param), reset_param, -			     HCI_CMD_TIMEOUT); -	if (IS_ERR(skb)) -		return PTR_ERR(skb); - -	kfree_skb(skb); +	err = btintel_send_intel_reset(hdev, boot_param); +	if (err) +		return err;  	/* The bootloader will not indicate when the device is ready. This  	 * is done by the operational firmware sending bootup notification. diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index c823914b3a80..b6a71705b7d6 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c @@ -794,7 +794,7 @@ static ssize_t hci_uart_tty_write(struct tty_struct *tty, struct file *file,  	return 0;  } -static unsigned int hci_uart_tty_poll(struct tty_struct *tty, +static __poll_t hci_uart_tty_poll(struct tty_struct *tty,  				      struct file *filp, poll_table *wait)  {  	return 0; diff --git a/drivers/bluetooth/hci_ll.c b/drivers/bluetooth/hci_ll.c index e2c078d61730..1b4417a623a4 100644 --- a/drivers/bluetooth/hci_ll.c +++ b/drivers/bluetooth/hci_ll.c @@ -53,9 +53,14 @@  #include <net/bluetooth/bluetooth.h>  #include <net/bluetooth/hci_core.h>  #include <linux/gpio/consumer.h> +#include <linux/nvmem-consumer.h>  #include "hci_uart.h" +/* Vendor-specific HCI commands */ +#define HCI_VS_WRITE_BD_ADDR			0xfc06 +#define HCI_VS_UPDATE_UART_HCI_BAUDRATE		0xff36 +  /* HCILL commands */  #define HCILL_GO_TO_SLEEP_IND	0x30  #define HCILL_GO_TO_SLEEP_ACK	0x31 @@ -86,6 +91,7 @@ struct ll_device {  	struct serdev_device *serdev;  	struct gpio_desc *enable_gpio;  	struct clk *ext_clk; +	bdaddr_t bdaddr;  };  struct ll_struct { @@ -620,7 +626,7 @@ static int download_firmware(struct ll_device *lldev)  		case ACTION_SEND_COMMAND:	/* action send */  			bt_dev_dbg(lldev->hu.hdev, "S");  			cmd = (struct hci_command *)action_ptr; -			if (cmd->opcode == 0xff36) { +			if (cmd->opcode == HCI_VS_UPDATE_UART_HCI_BAUDRATE) {  				/* ignore remote change  				 * baud rate HCI VS command  				 */ @@ -628,11 +634,11 @@ static int download_firmware(struct ll_device *lldev)  				break;  			}  			if (cmd->prefix != 1) -				bt_dev_dbg(lldev->hu.hdev, "command type %d\n", cmd->prefix); +				bt_dev_dbg(lldev->hu.hdev, "command type %d", cmd->prefix);  			skb = __hci_cmd_sync(lldev->hu.hdev, cmd->opcode, cmd->plen, &cmd->speed, HCI_INIT_TIMEOUT);  			if (IS_ERR(skb)) { -				bt_dev_err(lldev->hu.hdev, "send command failed\n"); +				bt_dev_err(lldev->hu.hdev, "send command failed");  				err = PTR_ERR(skb);  				goto out_rel_fw;  			} @@ -659,6 +665,24 @@ out_rel_fw:  	return err;  } +static int ll_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) +{ +	bdaddr_t bdaddr_swapped; +	struct sk_buff *skb; + +	/* HCI_VS_WRITE_BD_ADDR (at least on a CC2560A chip) expects the BD +	 * address to be MSB first, but bdaddr_t has the convention of being +	 * LSB first. +	 */ +	baswap(&bdaddr_swapped, bdaddr); +	skb = __hci_cmd_sync(hdev, HCI_VS_WRITE_BD_ADDR, sizeof(bdaddr_t), +			     &bdaddr_swapped, HCI_INIT_TIMEOUT); +	if (!IS_ERR(skb)) +		kfree_skb(skb); + +	return PTR_ERR_OR_ZERO(skb); +} +  static int ll_setup(struct hci_uart *hu)  {  	int err, retry = 3; @@ -671,14 +695,20 @@ static int ll_setup(struct hci_uart *hu)  	lldev = serdev_device_get_drvdata(serdev); +	hu->hdev->set_bdaddr = ll_set_bdaddr; +  	serdev_device_set_flow_control(serdev, true);  	do { -		/* Configure BT_EN to HIGH state */ +		/* Reset the Bluetooth device */  		gpiod_set_value_cansleep(lldev->enable_gpio, 0);  		msleep(5);  		gpiod_set_value_cansleep(lldev->enable_gpio, 1); -		msleep(100); +		err = serdev_device_wait_for_cts(serdev, true, 200); +		if (err) { +			bt_dev_err(hu->hdev, "Failed to get CTS"); +			return err; +		}  		err = download_firmware(lldev);  		if (!err) @@ -691,6 +721,18 @@ static int ll_setup(struct hci_uart *hu)  	if (err)  		return err; +	/* Set BD address if one was specified at probe */ +	if (!bacmp(&lldev->bdaddr, BDADDR_NONE)) { +		/* This means that there was an error getting the BD address +		 * during probe, so mark the device as having a bad address. +		 */ +		set_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks); +	} else if (bacmp(&lldev->bdaddr, BDADDR_ANY)) { +		err = ll_set_bdaddr(hu->hdev, &lldev->bdaddr); +		if (err) +			set_bit(HCI_QUIRK_INVALID_BDADDR, &hu->hdev->quirks); +	} +  	/* Operational speed if any */  	if (hu->oper_speed)  		speed = hu->oper_speed; @@ -700,7 +742,12 @@ static int ll_setup(struct hci_uart *hu)  		speed = 0;  	if (speed) { -		struct sk_buff *skb = __hci_cmd_sync(hu->hdev, 0xff36, sizeof(speed), &speed, HCI_INIT_TIMEOUT); +		__le32 speed_le = cpu_to_le32(speed); +		struct sk_buff *skb; + +		skb = __hci_cmd_sync(hu->hdev, HCI_VS_UPDATE_UART_HCI_BAUDRATE, +				     sizeof(speed_le), &speed_le, +				     HCI_INIT_TIMEOUT);  		if (!IS_ERR(skb)) {  			kfree_skb(skb);  			serdev_device_set_baudrate(serdev, speed); @@ -716,6 +763,7 @@ static int hci_ti_probe(struct serdev_device *serdev)  {  	struct hci_uart *hu;  	struct ll_device *lldev; +	struct nvmem_cell *bdaddr_cell;  	u32 max_speed = 3000000;  	lldev = devm_kzalloc(&serdev->dev, sizeof(struct ll_device), GFP_KERNEL); @@ -737,6 +785,52 @@ static int hci_ti_probe(struct serdev_device *serdev)  	of_property_read_u32(serdev->dev.of_node, "max-speed", &max_speed);  	hci_uart_set_speeds(hu, 115200, max_speed); +	/* optional BD address from nvram */ +	bdaddr_cell = nvmem_cell_get(&serdev->dev, "bd-address"); +	if (IS_ERR(bdaddr_cell)) { +		int err = PTR_ERR(bdaddr_cell); + +		if (err == -EPROBE_DEFER) +			return err; + +		/* ENOENT means there is no matching nvmem cell and ENOSYS +		 * means that nvmem is not enabled in the kernel configuration. +		 */ +		if (err != -ENOENT && err != -ENOSYS) { +			/* If there was some other error, give userspace a +			 * chance to fix the problem instead of failing to load +			 * the driver. Using BDADDR_NONE as a flag that is +			 * tested later in the setup function. +			 */ +			dev_warn(&serdev->dev, +				 "Failed to get \"bd-address\" nvmem cell (%d)\n", +				 err); +			bacpy(&lldev->bdaddr, BDADDR_NONE); +		} +	} else { +		bdaddr_t *bdaddr; +		size_t len; + +		bdaddr = nvmem_cell_read(bdaddr_cell, &len); +		nvmem_cell_put(bdaddr_cell); +		if (IS_ERR(bdaddr)) { +			dev_err(&serdev->dev, "Failed to read nvmem bd-address\n"); +			return PTR_ERR(bdaddr); +		} +		if (len != sizeof(bdaddr_t)) { +			dev_err(&serdev->dev, "Invalid nvmem bd-address length\n"); +			kfree(bdaddr); +			return -EINVAL; +		} + +		/* As per the device tree bindings, the value from nvmem is +		 * expected to be MSB first, but in the kernel it is expected +		 * that bdaddr_t is LSB first. +		 */ +		baswap(&lldev->bdaddr, bdaddr); +		kfree(bdaddr); +	} +  	return hci_uart_register_device(hu, &llp);  } @@ -748,6 +842,7 @@ static void hci_ti_remove(struct serdev_device *serdev)  }  static const struct of_device_id hci_ti_of_match[] = { +	{ .compatible = "ti,cc2560" },  	{ .compatible = "ti,wl1271-st" },  	{ .compatible = "ti,wl1273-st" },  	{ .compatible = "ti,wl1281-st" }, diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index bbd7db7384e6..05ec530b8a3a 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -932,6 +932,9 @@ static int qca_setup(struct hci_uart *hu)  	if (!ret) {  		set_bit(STATE_IN_BAND_SLEEP_ENABLED, &qca->flags);  		qca_debugfs_init(hdev); +	} else if (ret == -ENOENT) { +		/* No patch/nvm-config found, run with original fw/config */ +		ret = 0;  	}  	/* Setup bdaddr */ diff --git a/drivers/bluetooth/hci_serdev.c b/drivers/bluetooth/hci_serdev.c index 71664b22ec9d..e0e6461b9200 100644 --- a/drivers/bluetooth/hci_serdev.c +++ b/drivers/bluetooth/hci_serdev.c @@ -303,6 +303,7 @@ int hci_uart_register_device(struct hci_uart *hu,  	hci_set_drvdata(hdev, hu);  	INIT_WORK(&hu->write_work, hci_uart_write_work); +	percpu_init_rwsem(&hu->proto_lock);  	/* Only when vendor specific setup callback is provided, consider  	 * the manufacturer information valid. This avoids filling in the diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index e6f6dbc04131..22f9145a426f 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c @@ -299,16 +299,16 @@ static ssize_t vhci_write(struct kiocb *iocb, struct iov_iter *from)  	return vhci_get_user(data, from);  } -static unsigned int vhci_poll(struct file *file, poll_table *wait) +static __poll_t vhci_poll(struct file *file, poll_table *wait)  {  	struct vhci_data *data = file->private_data;  	poll_wait(file, &data->read_wait, wait);  	if (!skb_queue_empty(&data->readq)) -		return POLLIN | POLLRDNORM; +		return EPOLLIN | EPOLLRDNORM; -	return POLLOUT | POLLWRNORM; +	return EPOLLOUT | EPOLLWRNORM;  }  static void vhci_open_timeout(struct work_struct *work) |