You've already forked linux-rockchip
mirror of
https://github.com/armbian/linux-rockchip.git
synced 2026-01-06 11:08:10 -08:00
Merge tag 'for-net-next-2021-06-28' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Luiz Augusto von Dentz says: ==================== bluetooth-next pull request for net-next: - Add support for QCA_ROME device (0cf3:e500) and RTL8822CE - Update management interface revision to 21 - Use of incluse language - Proper handling of HCI_LE_Advertising_Set_Terminated event - Recovery handing of HCI ncmd=0 - Various memory fixes ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1,69 +0,0 @@
|
||||
Qualcomm Bluetooth Chips
|
||||
---------------------
|
||||
|
||||
This documents the binding structure and common properties for serial
|
||||
attached Qualcomm devices.
|
||||
|
||||
Serial attached Qualcomm devices shall be a child node of the host UART
|
||||
device the slave device is attached to.
|
||||
|
||||
Required properties:
|
||||
- compatible: should contain one of the following:
|
||||
* "qcom,qca6174-bt"
|
||||
* "qcom,qca9377-bt"
|
||||
* "qcom,wcn3990-bt"
|
||||
* "qcom,wcn3991-bt"
|
||||
* "qcom,wcn3998-bt"
|
||||
* "qcom,qca6390-bt"
|
||||
|
||||
Optional properties for compatible string qcom,qca6174-bt:
|
||||
|
||||
- enable-gpios: gpio specifier used to enable chip
|
||||
- clocks: clock provided to the controller (SUSCLK_32KHZ)
|
||||
- firmware-name: specify the name of nvm firmware to load
|
||||
|
||||
Optional properties for compatible string qcom,qca9377-bt:
|
||||
|
||||
- max-speed: see Documentation/devicetree/bindings/serial/serial.yaml
|
||||
|
||||
Required properties for compatible string qcom,wcn399x-bt:
|
||||
|
||||
- vddio-supply: VDD_IO supply regulator handle.
|
||||
- vddxo-supply: VDD_XO supply regulator handle.
|
||||
- vddrf-supply: VDD_RF supply regulator handle.
|
||||
- vddch0-supply: VDD_CH0 supply regulator handle.
|
||||
|
||||
Optional properties for compatible string qcom,wcn399x-bt:
|
||||
|
||||
- max-speed: see Documentation/devicetree/bindings/serial/serial.yaml
|
||||
- firmware-name: specify the name of nvm firmware to load
|
||||
- clocks: clock provided to the controller
|
||||
|
||||
Examples:
|
||||
|
||||
serial@7570000 {
|
||||
label = "BT-UART";
|
||||
status = "okay";
|
||||
|
||||
bluetooth {
|
||||
compatible = "qcom,qca6174-bt";
|
||||
|
||||
enable-gpios = <&pm8994_gpios 19 GPIO_ACTIVE_HIGH>;
|
||||
clocks = <&divclk4>;
|
||||
firmware-name = "nvm_00440302.bin";
|
||||
};
|
||||
};
|
||||
|
||||
serial@898000 {
|
||||
bluetooth {
|
||||
compatible = "qcom,wcn3990-bt";
|
||||
|
||||
vddio-supply = <&vreg_s4a_1p8>;
|
||||
vddxo-supply = <&vreg_l7a_1p8>;
|
||||
vddrf-supply = <&vreg_l17a_1p3>;
|
||||
vddch0-supply = <&vreg_l25a_3p3>;
|
||||
max-speed = <3200000>;
|
||||
firmware-name = "crnv21.bin";
|
||||
clocks = <&rpmhcc RPMH_RF_CLK2>;
|
||||
};
|
||||
};
|
||||
183
Documentation/devicetree/bindings/net/qualcomm-bluetooth.yaml
Normal file
183
Documentation/devicetree/bindings/net/qualcomm-bluetooth.yaml
Normal file
@@ -0,0 +1,183 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/net/qualcomm-bluetooth.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Bluetooth Chips
|
||||
|
||||
maintainers:
|
||||
- Balakrishna Godavarthi <bgodavar@codeaurora.org>
|
||||
- Rocky Liao <rjliao@codeaurora.org>
|
||||
|
||||
description:
|
||||
This binding describes Qualcomm UART-attached bluetooth chips.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,qca6174-bt
|
||||
- qcom,qca9377-bt
|
||||
- qcom,wcn3990-bt
|
||||
- qcom,wcn3991-bt
|
||||
- qcom,wcn3998-bt
|
||||
- qcom,qca6390-bt
|
||||
- qcom,wcn6750-bt
|
||||
|
||||
enable-gpios:
|
||||
maxItems: 1
|
||||
description: gpio specifier used to enable chip
|
||||
|
||||
swctrl-gpios:
|
||||
maxItems: 1
|
||||
description: gpio specifier is used to find status
|
||||
of clock supply to SoC
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description: clock provided to the controller (SUSCLK_32KHZ)
|
||||
|
||||
vddio-supply:
|
||||
description: VDD_IO supply regulator handle
|
||||
|
||||
vddxo-supply:
|
||||
description: VDD_XO supply regulator handle
|
||||
|
||||
vddrf-supply:
|
||||
description: VDD_RF supply regulator handle
|
||||
|
||||
vddch0-supply:
|
||||
description: VDD_CH0 supply regulator handle
|
||||
|
||||
vddaon-supply:
|
||||
description: VDD_AON supply regulator handle
|
||||
|
||||
vddbtcxmx-supply:
|
||||
description: VDD_BT_CXMX supply regulator handle
|
||||
|
||||
vddrfacmn-supply:
|
||||
description: VDD_RFA_CMN supply regulator handle
|
||||
|
||||
vddrfa0p8-supply:
|
||||
description: VDD_RFA_0P8 suppply regulator handle
|
||||
|
||||
vddrfa1p7-supply:
|
||||
description: VDD_RFA_1P7 supply regulator handle
|
||||
|
||||
vddrfa1p2-supply:
|
||||
description: VDD_RFA_1P2 supply regulator handle
|
||||
|
||||
vddrfa2p2-supply:
|
||||
description: VDD_RFA_2P2 supply regulator handle
|
||||
|
||||
vddasd-supply:
|
||||
description: VDD_ASD supply regulator handle
|
||||
|
||||
max-speed:
|
||||
description: see Documentation/devicetree/bindings/serial/serial.yaml
|
||||
|
||||
firmware-name:
|
||||
description: specify the name of nvm firmware to load
|
||||
|
||||
local-bd-address:
|
||||
description: see Documentation/devicetree/bindings/net/bluetooth.txt
|
||||
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,qca6174-bt
|
||||
then:
|
||||
required:
|
||||
- enable-gpios
|
||||
- clocks
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,wcn3990-bt
|
||||
- qcom,wcn3991-bt
|
||||
- qcom,wcn3998-bt
|
||||
then:
|
||||
required:
|
||||
- vddio-supply
|
||||
- vddxo-supply
|
||||
- vddrf-supply
|
||||
- vddch0-supply
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,wcn6750-bt
|
||||
then:
|
||||
required:
|
||||
- enable-gpios
|
||||
- swctrl-gpios
|
||||
- vddio-supply
|
||||
- vddaon-supply
|
||||
- vddbtcxmx-supply
|
||||
- vddrfacmn-supply
|
||||
- vddrfa0p8-supply
|
||||
- vddrfa1p7-supply
|
||||
- vddrfa1p2-supply
|
||||
- vddasd-supply
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
serial {
|
||||
|
||||
bluetooth {
|
||||
compatible = "qcom,qca6174-bt";
|
||||
enable-gpios = <&pm8994_gpios 19 GPIO_ACTIVE_HIGH>;
|
||||
clocks = <&divclk4>;
|
||||
firmware-name = "nvm_00440302.bin";
|
||||
};
|
||||
};
|
||||
- |
|
||||
serial {
|
||||
|
||||
bluetooth {
|
||||
compatible = "qcom,wcn3990-bt";
|
||||
vddio-supply = <&vreg_s4a_1p8>;
|
||||
vddxo-supply = <&vreg_l7a_1p8>;
|
||||
vddrf-supply = <&vreg_l17a_1p3>;
|
||||
vddch0-supply = <&vreg_l25a_3p3>;
|
||||
max-speed = <3200000>;
|
||||
firmware-name = "crnv21.bin";
|
||||
};
|
||||
};
|
||||
- |
|
||||
serial {
|
||||
|
||||
bluetooth {
|
||||
compatible = "qcom,wcn6750-bt";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&bt_en_default>;
|
||||
enable-gpios = <&tlmm 85 GPIO_ACTIVE_HIGH>;
|
||||
swctrl-gpios = <&tlmm 86 GPIO_ACTIVE_HIGH>;
|
||||
vddio-supply = <&vreg_l19b_1p8>;
|
||||
vddaon-supply = <&vreg_s7b_0p9>;
|
||||
vddbtcxmx-supply = <&vreg_s7b_0p9>;
|
||||
vddrfacmn-supply = <&vreg_s7b_0p9>;
|
||||
vddrfa0p8-supply = <&vreg_s7b_0p9>;
|
||||
vddrfa1p7-supply = <&vreg_s1b_1p8>;
|
||||
vddrfa1p2-supply = <&vreg_s8b_1p2>;
|
||||
vddrfa2p2-supply = <&vreg_s1c_2p2>;
|
||||
vddasd-supply = <&vreg_l11c_2p8>;
|
||||
max-speed = <3200000>;
|
||||
firmware-name = "msnv11.bin";
|
||||
};
|
||||
};
|
||||
@@ -404,6 +404,7 @@ static const struct bcm_subver_table bcm_uart_subver_table[] = {
|
||||
{ 0x4217, "BCM4329B1" }, /* 002.002.023 */
|
||||
{ 0x6106, "BCM4359C0" }, /* 003.001.006 */
|
||||
{ 0x4106, "BCM4335A0" }, /* 002.001.006 */
|
||||
{ 0x410c, "BCM43430B0" }, /* 002.001.012 */
|
||||
{ }
|
||||
};
|
||||
|
||||
|
||||
@@ -1461,9 +1461,7 @@ static void btmrvl_sdio_coredump(struct device *dev)
|
||||
BT_ERR("Allocated buffer not enough");
|
||||
}
|
||||
|
||||
if (stat != RDWR_STATUS_DONE) {
|
||||
continue;
|
||||
} else {
|
||||
if (stat == RDWR_STATUS_DONE) {
|
||||
BT_INFO("%s done: size=0x%tx",
|
||||
entry->mem_name,
|
||||
dbg_ptr - entry->mem_ptr);
|
||||
|
||||
@@ -581,11 +581,9 @@ static int btmtkuart_open(struct hci_dev *hdev)
|
||||
|
||||
/* Enable the power domain and clock the device requires */
|
||||
pm_runtime_enable(dev);
|
||||
err = pm_runtime_get_sync(dev);
|
||||
if (err < 0) {
|
||||
pm_runtime_put_noidle(dev);
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err < 0)
|
||||
goto err_disable_rpm;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(bdev->clk);
|
||||
if (err < 0)
|
||||
|
||||
@@ -182,8 +182,9 @@ int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qca_send_pre_shutdown_cmd);
|
||||
|
||||
static void qca_tlv_check_data(struct qca_fw_config *config,
|
||||
const struct firmware *fw, enum qca_btsoc_type soc_type)
|
||||
static void qca_tlv_check_data(struct hci_dev *hdev,
|
||||
struct qca_fw_config *config,
|
||||
u8 *fw_data, enum qca_btsoc_type soc_type)
|
||||
{
|
||||
const u8 *data;
|
||||
u32 type_len;
|
||||
@@ -194,19 +195,21 @@ static void qca_tlv_check_data(struct qca_fw_config *config,
|
||||
struct tlv_type_nvm *tlv_nvm;
|
||||
uint8_t nvm_baud_rate = config->user_baud_rate;
|
||||
|
||||
tlv = (struct tlv_type_hdr *)fw->data;
|
||||
|
||||
type_len = le32_to_cpu(tlv->type_len);
|
||||
length = (type_len >> 8) & 0x00ffffff;
|
||||
|
||||
BT_DBG("TLV Type\t\t : 0x%x", type_len & 0x000000ff);
|
||||
BT_DBG("Length\t\t : %d bytes", length);
|
||||
|
||||
config->dnld_mode = QCA_SKIP_EVT_NONE;
|
||||
config->dnld_type = QCA_SKIP_EVT_NONE;
|
||||
|
||||
switch (config->type) {
|
||||
case ELF_TYPE_PATCH:
|
||||
config->dnld_mode = QCA_SKIP_EVT_VSE_CC;
|
||||
config->dnld_type = QCA_SKIP_EVT_VSE_CC;
|
||||
|
||||
bt_dev_dbg(hdev, "File Class : 0x%x", fw_data[4]);
|
||||
bt_dev_dbg(hdev, "Data Encoding : 0x%x", fw_data[5]);
|
||||
bt_dev_dbg(hdev, "File version : 0x%x", fw_data[6]);
|
||||
break;
|
||||
case TLV_TYPE_PATCH:
|
||||
tlv = (struct tlv_type_hdr *)fw_data;
|
||||
type_len = le32_to_cpu(tlv->type_len);
|
||||
tlv_patch = (struct tlv_type_patch *)tlv->data;
|
||||
|
||||
/* For Rome version 1.1 to 3.1, all segment commands
|
||||
@@ -218,6 +221,7 @@ static void qca_tlv_check_data(struct qca_fw_config *config,
|
||||
config->dnld_mode = tlv_patch->download_mode;
|
||||
config->dnld_type = config->dnld_mode;
|
||||
|
||||
BT_DBG("TLV Type\t\t : 0x%x", type_len & 0x000000ff);
|
||||
BT_DBG("Total Length : %d bytes",
|
||||
le32_to_cpu(tlv_patch->total_size));
|
||||
BT_DBG("Patch Data Length : %d bytes",
|
||||
@@ -243,6 +247,14 @@ static void qca_tlv_check_data(struct qca_fw_config *config,
|
||||
break;
|
||||
|
||||
case TLV_TYPE_NVM:
|
||||
tlv = (struct tlv_type_hdr *)fw_data;
|
||||
|
||||
type_len = le32_to_cpu(tlv->type_len);
|
||||
length = (type_len >> 8) & 0x00ffffff;
|
||||
|
||||
BT_DBG("TLV Type\t\t : 0x%x", type_len & 0x000000ff);
|
||||
BT_DBG("Length\t\t : %d bytes", length);
|
||||
|
||||
idx = 0;
|
||||
data = tlv->data;
|
||||
while (idx < length) {
|
||||
@@ -387,25 +399,57 @@ static int qca_inject_cmd_complete_event(struct hci_dev *hdev)
|
||||
|
||||
static int qca_download_firmware(struct hci_dev *hdev,
|
||||
struct qca_fw_config *config,
|
||||
enum qca_btsoc_type soc_type)
|
||||
enum qca_btsoc_type soc_type,
|
||||
u8 rom_ver)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
u8 *data;
|
||||
const u8 *segment;
|
||||
int ret, remain, i = 0;
|
||||
int ret, size, remain, i = 0;
|
||||
|
||||
bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
|
||||
|
||||
ret = request_firmware(&fw, config->fwname, &hdev->dev);
|
||||
if (ret) {
|
||||
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
|
||||
config->fwname, ret);
|
||||
return ret;
|
||||
/* For WCN6750, if mbn file is not present then check for
|
||||
* tlv file.
|
||||
*/
|
||||
if (soc_type == QCA_WCN6750 && config->type == ELF_TYPE_PATCH) {
|
||||
bt_dev_dbg(hdev, "QCA Failed to request file: %s (%d)",
|
||||
config->fwname, ret);
|
||||
config->type = TLV_TYPE_PATCH;
|
||||
snprintf(config->fwname, sizeof(config->fwname),
|
||||
"qca/msbtfw%02x.tlv", rom_ver);
|
||||
bt_dev_info(hdev, "QCA Downloading %s", config->fwname);
|
||||
ret = request_firmware(&fw, config->fwname, &hdev->dev);
|
||||
if (ret) {
|
||||
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
|
||||
config->fwname, ret);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
bt_dev_err(hdev, "QCA Failed to request file: %s (%d)",
|
||||
config->fwname, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
qca_tlv_check_data(config, fw, soc_type);
|
||||
size = fw->size;
|
||||
data = vmalloc(fw->size);
|
||||
if (!data) {
|
||||
bt_dev_err(hdev, "QCA Failed to allocate memory for file: %s",
|
||||
config->fwname);
|
||||
release_firmware(fw);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
segment = fw->data;
|
||||
remain = fw->size;
|
||||
memcpy(data, fw->data, size);
|
||||
release_firmware(fw);
|
||||
|
||||
qca_tlv_check_data(hdev, config, data, soc_type);
|
||||
|
||||
segment = data;
|
||||
remain = size;
|
||||
while (remain > 0) {
|
||||
int segsize = min(MAX_SIZE_PER_TLV_SEGMENT, remain);
|
||||
|
||||
@@ -435,7 +479,7 @@ static int qca_download_firmware(struct hci_dev *hdev,
|
||||
ret = qca_inject_cmd_complete_event(hdev);
|
||||
|
||||
out:
|
||||
release_firmware(fw);
|
||||
vfree(data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -502,27 +546,32 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
||||
|
||||
config.user_baud_rate = baudrate;
|
||||
|
||||
/* Firmware files to download are based on ROM version.
|
||||
* ROM version is derived from last two bytes of soc_ver.
|
||||
*/
|
||||
rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);
|
||||
|
||||
/* Download rampatch file */
|
||||
config.type = TLV_TYPE_PATCH;
|
||||
if (qca_is_wcn399x(soc_type)) {
|
||||
/* Firmware files to download are based on ROM version.
|
||||
* ROM version is derived from last two bytes of soc_ver.
|
||||
*/
|
||||
rom_ver = ((soc_ver & 0x00000f00) >> 0x04) |
|
||||
(soc_ver & 0x0000000f);
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/crbtfw%02x.tlv", rom_ver);
|
||||
} else if (soc_type == QCA_QCA6390) {
|
||||
rom_ver = ((soc_ver & 0x00000f00) >> 0x04) |
|
||||
(soc_ver & 0x0000000f);
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/htbtfw%02x.tlv", rom_ver);
|
||||
} else if (soc_type == QCA_WCN6750) {
|
||||
/* Choose mbn file by default.If mbn file is not found
|
||||
* then choose tlv file
|
||||
*/
|
||||
config.type = ELF_TYPE_PATCH;
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/msbtfw%02x.mbn", rom_ver);
|
||||
} else {
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/rampatch_%08x.bin", soc_ver);
|
||||
}
|
||||
|
||||
err = qca_download_firmware(hdev, &config, soc_type);
|
||||
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);
|
||||
if (err < 0) {
|
||||
bt_dev_err(hdev, "QCA Failed to download patch (%d)", err);
|
||||
return err;
|
||||
@@ -548,11 +597,14 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
||||
else if (soc_type == QCA_QCA6390)
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/htnv%02x.bin", rom_ver);
|
||||
else if (soc_type == QCA_WCN6750)
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/msnv%02x.bin", rom_ver);
|
||||
else
|
||||
snprintf(config.fwname, sizeof(config.fwname),
|
||||
"qca/nvm_%08x.bin", soc_ver);
|
||||
|
||||
err = qca_download_firmware(hdev, &config, soc_type);
|
||||
err = qca_download_firmware(hdev, &config, soc_type, rom_ver);
|
||||
if (err < 0) {
|
||||
bt_dev_err(hdev, "QCA Failed to download NVM (%d)", err);
|
||||
return err;
|
||||
@@ -564,13 +616,14 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
||||
return err;
|
||||
}
|
||||
|
||||
/* WCN399x supports the Microsoft vendor extension with 0xFD70 as the
|
||||
/* WCN399x and WCN6750 supports the Microsoft vendor extension with 0xFD70 as the
|
||||
* VsMsftOpCode.
|
||||
*/
|
||||
switch (soc_type) {
|
||||
case QCA_WCN3990:
|
||||
case QCA_WCN3991:
|
||||
case QCA_WCN3998:
|
||||
case QCA_WCN6750:
|
||||
hci_set_msft_opcode(hdev, 0xFD70);
|
||||
break;
|
||||
default:
|
||||
@@ -584,7 +637,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
||||
return err;
|
||||
}
|
||||
|
||||
if (soc_type == QCA_WCN3991) {
|
||||
if (soc_type == QCA_WCN3991 || soc_type == QCA_WCN6750) {
|
||||
/* get fw build info */
|
||||
err = qca_read_fw_build_info(hdev);
|
||||
if (err < 0)
|
||||
|
||||
@@ -80,7 +80,8 @@ enum qca_tlv_dnld_mode {
|
||||
|
||||
enum qca_tlv_type {
|
||||
TLV_TYPE_PATCH = 1,
|
||||
TLV_TYPE_NVM
|
||||
TLV_TYPE_NVM,
|
||||
ELF_TYPE_PATCH,
|
||||
};
|
||||
|
||||
struct qca_fw_config {
|
||||
@@ -143,6 +144,7 @@ enum qca_btsoc_type {
|
||||
QCA_WCN3998,
|
||||
QCA_WCN3991,
|
||||
QCA_QCA6390,
|
||||
QCA_WCN6750,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_BT_QCA)
|
||||
@@ -160,6 +162,11 @@ static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
|
||||
return soc_type == QCA_WCN3990 || soc_type == QCA_WCN3991 ||
|
||||
soc_type == QCA_WCN3998;
|
||||
}
|
||||
static inline bool qca_is_wcn6750(enum qca_btsoc_type soc_type)
|
||||
{
|
||||
return soc_type == QCA_WCN6750;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
|
||||
@@ -192,6 +199,11 @@ static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool qca_is_wcn6750(enum qca_btsoc_type soc_type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -132,12 +132,19 @@ static const struct id_table ic_id_table[] = {
|
||||
.cfg_name = "rtl_bt/rtl8761a_config" },
|
||||
|
||||
/* 8761B */
|
||||
{ IC_INFO(RTL_ROM_LMP_8761A, 0xb, 0xa, HCI_USB),
|
||||
{ IC_INFO(RTL_ROM_LMP_8761A, 0xb, 0xa, HCI_UART),
|
||||
.config_needed = false,
|
||||
.has_rom_version = true,
|
||||
.fw_name = "rtl_bt/rtl8761b_fw.bin",
|
||||
.cfg_name = "rtl_bt/rtl8761b_config" },
|
||||
|
||||
/* 8761BU */
|
||||
{ IC_INFO(RTL_ROM_LMP_8761A, 0xb, 0xa, HCI_USB),
|
||||
.config_needed = false,
|
||||
.has_rom_version = true,
|
||||
.fw_name = "rtl_bt/rtl8761bu_fw.bin",
|
||||
.cfg_name = "rtl_bt/rtl8761bu_config" },
|
||||
|
||||
/* 8822C with UART interface */
|
||||
{ IC_INFO(RTL_ROM_LMP_8822B, 0xc, 0xa, HCI_UART),
|
||||
.config_needed = true,
|
||||
@@ -719,17 +726,8 @@ int btrtl_download_firmware(struct hci_dev *hdev,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(btrtl_download_firmware);
|
||||
|
||||
int btrtl_setup_realtek(struct hci_dev *hdev)
|
||||
void btrtl_set_quirks(struct hci_dev *hdev, struct btrtl_device_info *btrtl_dev)
|
||||
{
|
||||
struct btrtl_device_info *btrtl_dev;
|
||||
int ret;
|
||||
|
||||
btrtl_dev = btrtl_initialize(hdev, NULL);
|
||||
if (IS_ERR(btrtl_dev))
|
||||
return PTR_ERR(btrtl_dev);
|
||||
|
||||
ret = btrtl_download_firmware(hdev, btrtl_dev);
|
||||
|
||||
/* Enable controller to do both LE scan and BR/EDR inquiry
|
||||
* simultaneously.
|
||||
*/
|
||||
@@ -750,6 +748,21 @@ int btrtl_setup_realtek(struct hci_dev *hdev)
|
||||
rtl_dev_dbg(hdev, "WBS supported not enabled.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(btrtl_set_quirks);
|
||||
|
||||
int btrtl_setup_realtek(struct hci_dev *hdev)
|
||||
{
|
||||
struct btrtl_device_info *btrtl_dev;
|
||||
int ret;
|
||||
|
||||
btrtl_dev = btrtl_initialize(hdev, NULL);
|
||||
if (IS_ERR(btrtl_dev))
|
||||
return PTR_ERR(btrtl_dev);
|
||||
|
||||
ret = btrtl_download_firmware(hdev, btrtl_dev);
|
||||
|
||||
btrtl_set_quirks(hdev, btrtl_dev);
|
||||
|
||||
btrtl_free(btrtl_dev);
|
||||
return ret;
|
||||
|
||||
@@ -54,6 +54,8 @@ struct btrtl_device_info *btrtl_initialize(struct hci_dev *hdev,
|
||||
void btrtl_free(struct btrtl_device_info *btrtl_dev);
|
||||
int btrtl_download_firmware(struct hci_dev *hdev,
|
||||
struct btrtl_device_info *btrtl_dev);
|
||||
void btrtl_set_quirks(struct hci_dev *hdev,
|
||||
struct btrtl_device_info *btrtl_dev);
|
||||
int btrtl_setup_realtek(struct hci_dev *hdev);
|
||||
int btrtl_shutdown_realtek(struct hci_dev *hdev);
|
||||
int btrtl_get_uart_settings(struct hci_dev *hdev,
|
||||
@@ -79,6 +81,11 @@ static inline int btrtl_download_firmware(struct hci_dev *hdev,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline void btrtl_set_quirks(struct hci_dev *hdev,
|
||||
struct btrtl_device_info *btrtl_dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int btrtl_setup_realtek(struct hci_dev *hdev)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@@ -270,6 +270,8 @@ static const struct usb_device_id blacklist_table[] = {
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
{ USB_DEVICE(0x0cf3, 0xe360), .driver_info = BTUSB_QCA_ROME |
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
{ USB_DEVICE(0x0cf3, 0xe500), .driver_info = BTUSB_QCA_ROME |
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
{ USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME |
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
{ USB_DEVICE(0x0489, 0xe09f), .driver_info = BTUSB_QCA_ROME |
|
||||
@@ -408,6 +410,11 @@ static const struct usb_device_id blacklist_table[] = {
|
||||
/* Additional MediaTek MT7615E Bluetooth devices */
|
||||
{ USB_DEVICE(0x13d3, 0x3560), .driver_info = BTUSB_MEDIATEK},
|
||||
|
||||
/* Additional MediaTek MT7921 Bluetooth devices */
|
||||
{ USB_DEVICE(0x04ca, 0x3802), .driver_info = BTUSB_MEDIATEK |
|
||||
BTUSB_WIDEBAND_SPEECH |
|
||||
BTUSB_VALID_LE_STATES },
|
||||
|
||||
/* Additional Realtek 8723AE Bluetooth devices */
|
||||
{ USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
|
||||
{ USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
|
||||
@@ -427,6 +434,10 @@ static const struct usb_device_id blacklist_table[] = {
|
||||
{ USB_DEVICE(0x0bda, 0xb009), .driver_info = BTUSB_REALTEK },
|
||||
{ USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK },
|
||||
|
||||
/* Additional Realtek 8761BU Bluetooth devices */
|
||||
{ USB_DEVICE(0x0b05, 0x190e), .driver_info = BTUSB_REALTEK |
|
||||
BTUSB_WIDEBAND_SPEECH },
|
||||
|
||||
/* Additional Realtek 8821AE Bluetooth devices */
|
||||
{ USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
|
||||
{ USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
|
||||
@@ -1749,6 +1760,13 @@ static void btusb_work(struct work_struct *work)
|
||||
* which work with WBS at all.
|
||||
*/
|
||||
new_alts = btusb_find_altsetting(data, 6) ? 6 : 1;
|
||||
/* Because mSBC frames do not need to be aligned to the
|
||||
* SCO packet boundary. If support the Alt 3, use the
|
||||
* Alt 3 for HCI payload >= 60 Bytes let air packet
|
||||
* data satisfy 60 bytes.
|
||||
*/
|
||||
if (new_alts == 1 && btusb_find_altsetting(data, 3))
|
||||
new_alts = 3;
|
||||
}
|
||||
|
||||
if (btusb_switch_alt_setting(hdev, new_alts) < 0)
|
||||
@@ -3312,11 +3330,6 @@ static int btusb_mtk_hci_wmt_sync(struct hci_dev *hdev,
|
||||
struct btmtk_wmt_hdr *hdr;
|
||||
int err;
|
||||
|
||||
/* Submit control IN URB on demand to process the WMT event */
|
||||
err = btusb_mtk_submit_wmt_recv_urb(hdev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Send the WMT command and wait until the WMT event returns */
|
||||
hlen = sizeof(*hdr) + wmt_params->dlen;
|
||||
if (hlen > 255)
|
||||
@@ -3342,6 +3355,11 @@ static int btusb_mtk_hci_wmt_sync(struct hci_dev *hdev,
|
||||
goto err_free_wc;
|
||||
}
|
||||
|
||||
/* Submit control IN URB on demand to process the WMT event */
|
||||
err = btusb_mtk_submit_wmt_recv_urb(hdev);
|
||||
if (err < 0)
|
||||
goto err_free_wc;
|
||||
|
||||
/* The vendor specific WMT commands are all answered by a vendor
|
||||
* specific event and will have the Command Status or Command
|
||||
* Complete as with usual HCI command flow control.
|
||||
@@ -4062,6 +4080,11 @@ static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
|
||||
sent += size;
|
||||
count -= size;
|
||||
|
||||
/* ep2 need time to switch from function acl to function dfu,
|
||||
* so we add 20ms delay here.
|
||||
*/
|
||||
msleep(20);
|
||||
|
||||
while (count) {
|
||||
size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
|
||||
|
||||
@@ -4154,9 +4177,15 @@ static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
|
||||
int err;
|
||||
|
||||
if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
|
||||
snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x_%04x.bin",
|
||||
le32_to_cpu(ver->rom_version),
|
||||
le16_to_cpu(ver->board_id));
|
||||
/* if boardid equal 0, use default nvm without surfix */
|
||||
if (le16_to_cpu(ver->board_id) == 0x0) {
|
||||
snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
|
||||
le32_to_cpu(ver->rom_version));
|
||||
} else {
|
||||
snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x_%04x.bin",
|
||||
le32_to_cpu(ver->rom_version),
|
||||
le16_to_cpu(ver->board_id));
|
||||
}
|
||||
} else {
|
||||
snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
|
||||
le32_to_cpu(ver->rom_version));
|
||||
|
||||
@@ -199,7 +199,6 @@ static int ag6xx_setup(struct hci_uart *hu)
|
||||
fwname, err);
|
||||
goto patch;
|
||||
}
|
||||
fw_ptr = fw->data;
|
||||
|
||||
bt_dev_info(hdev, "Applying bddata (%s)", fwname);
|
||||
|
||||
|
||||
@@ -906,10 +906,7 @@ static int h5_btrtl_setup(struct h5 *h5)
|
||||
/* Give the device some time before the hci-core sends it a reset */
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* Enable controller to do both LE scan and BR/EDR inquiry
|
||||
* simultaneously.
|
||||
*/
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &h5->hu->hdev->quirks);
|
||||
btrtl_set_quirks(h5->hu->hdev, btrtl_dev);
|
||||
|
||||
out_free:
|
||||
btrtl_free(btrtl_dev);
|
||||
|
||||
@@ -218,6 +218,7 @@ struct qca_power {
|
||||
struct qca_serdev {
|
||||
struct hci_uart serdev_hu;
|
||||
struct gpio_desc *bt_en;
|
||||
struct gpio_desc *sw_ctrl;
|
||||
struct clk *susclk;
|
||||
enum qca_btsoc_type btsoc_type;
|
||||
struct qca_power *bt_power;
|
||||
@@ -604,7 +605,8 @@ static int qca_open(struct hci_uart *hu)
|
||||
if (hu->serdev) {
|
||||
qcadev = serdev_device_get_drvdata(hu->serdev);
|
||||
|
||||
if (qca_is_wcn399x(qcadev->btsoc_type))
|
||||
if (qca_is_wcn399x(qcadev->btsoc_type) ||
|
||||
qca_is_wcn6750(qcadev->btsoc_type))
|
||||
hu->init_speed = qcadev->init_speed;
|
||||
|
||||
if (qcadev->oper_speed)
|
||||
@@ -1308,7 +1310,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
|
||||
msecs_to_jiffies(CMD_TRANS_TIMEOUT_MS));
|
||||
|
||||
/* Give the controller time to process the request */
|
||||
if (qca_is_wcn399x(qca_soc_type(hu)))
|
||||
if (qca_is_wcn399x(qca_soc_type(hu)) ||
|
||||
qca_is_wcn6750(qca_soc_type(hu)))
|
||||
usleep_range(1000, 10000);
|
||||
else
|
||||
msleep(300);
|
||||
@@ -1384,7 +1387,8 @@ static unsigned int qca_get_speed(struct hci_uart *hu,
|
||||
|
||||
static int qca_check_speeds(struct hci_uart *hu)
|
||||
{
|
||||
if (qca_is_wcn399x(qca_soc_type(hu))) {
|
||||
if (qca_is_wcn399x(qca_soc_type(hu)) ||
|
||||
qca_is_wcn6750(qca_soc_type(hu))) {
|
||||
if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
|
||||
!qca_get_speed(hu, QCA_OPER_SPEED))
|
||||
return -EINVAL;
|
||||
@@ -1417,7 +1421,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
|
||||
/* Disable flow control for wcn3990 to deassert RTS while
|
||||
* changing the baudrate of chip and host.
|
||||
*/
|
||||
if (qca_is_wcn399x(soc_type))
|
||||
if (qca_is_wcn399x(soc_type) ||
|
||||
qca_is_wcn6750(soc_type))
|
||||
hci_uart_set_flow_control(hu, true);
|
||||
|
||||
if (soc_type == QCA_WCN3990) {
|
||||
@@ -1434,7 +1439,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
|
||||
host_set_baudrate(hu, speed);
|
||||
|
||||
error:
|
||||
if (qca_is_wcn399x(soc_type))
|
||||
if (qca_is_wcn399x(soc_type) ||
|
||||
qca_is_wcn6750(soc_type))
|
||||
hci_uart_set_flow_control(hu, false);
|
||||
|
||||
if (soc_type == QCA_WCN3990) {
|
||||
@@ -1585,10 +1591,12 @@ static bool qca_prevent_wake(struct hci_dev *hdev)
|
||||
return !wakeup;
|
||||
}
|
||||
|
||||
static int qca_wcn3990_init(struct hci_uart *hu)
|
||||
static int qca_regulator_init(struct hci_uart *hu)
|
||||
{
|
||||
enum qca_btsoc_type soc_type = qca_soc_type(hu);
|
||||
struct qca_serdev *qcadev;
|
||||
int ret;
|
||||
bool sw_ctrl_state;
|
||||
|
||||
/* Check for vregs status, may be hci down has turned
|
||||
* off the voltage regulator.
|
||||
@@ -1607,16 +1615,33 @@ static int qca_wcn3990_init(struct hci_uart *hu)
|
||||
}
|
||||
}
|
||||
|
||||
/* Forcefully enable wcn3990 to enter in to boot mode. */
|
||||
host_set_baudrate(hu, 2400);
|
||||
ret = qca_send_power_pulse(hu, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (qca_is_wcn399x(soc_type)) {
|
||||
/* Forcefully enable wcn399x to enter in to boot mode. */
|
||||
host_set_baudrate(hu, 2400);
|
||||
ret = qca_send_power_pulse(hu, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* For wcn6750 need to enable gpio bt_en */
|
||||
if (qcadev->bt_en) {
|
||||
gpiod_set_value_cansleep(qcadev->bt_en, 0);
|
||||
msleep(50);
|
||||
gpiod_set_value_cansleep(qcadev->bt_en, 1);
|
||||
msleep(50);
|
||||
if (qcadev->sw_ctrl) {
|
||||
sw_ctrl_state = gpiod_get_value_cansleep(qcadev->sw_ctrl);
|
||||
bt_dev_dbg(hu->hdev, "SW_CTRL is %d", sw_ctrl_state);
|
||||
}
|
||||
}
|
||||
|
||||
qca_set_speed(hu, QCA_INIT_SPEED);
|
||||
ret = qca_send_power_pulse(hu, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (qca_is_wcn399x(soc_type)) {
|
||||
ret = qca_send_power_pulse(hu, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Now the device is in ready state to communicate with host.
|
||||
* To sync host with device we need to reopen port.
|
||||
@@ -1649,8 +1674,9 @@ static int qca_power_on(struct hci_dev *hdev)
|
||||
if (!hu->serdev)
|
||||
return 0;
|
||||
|
||||
if (qca_is_wcn399x(soc_type)) {
|
||||
ret = qca_wcn3990_init(hu);
|
||||
if (qca_is_wcn399x(soc_type) ||
|
||||
qca_is_wcn6750(soc_type)) {
|
||||
ret = qca_regulator_init(hu);
|
||||
} else {
|
||||
qcadev = serdev_device_get_drvdata(hu->serdev);
|
||||
if (qcadev->bt_en) {
|
||||
@@ -1689,7 +1715,8 @@ static int qca_setup(struct hci_uart *hu)
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
|
||||
bt_dev_info(hdev, "setting up %s",
|
||||
qca_is_wcn399x(soc_type) ? "wcn399x" : "ROME/QCA6390");
|
||||
qca_is_wcn399x(soc_type) ? "wcn399x" :
|
||||
(soc_type == QCA_WCN6750) ? "wcn6750" : "ROME/QCA6390");
|
||||
|
||||
qca->memdump_state = QCA_MEMDUMP_IDLE;
|
||||
|
||||
@@ -1700,7 +1727,8 @@ retry:
|
||||
|
||||
clear_bit(QCA_SSR_TRIGGERED, &qca->flags);
|
||||
|
||||
if (qca_is_wcn399x(soc_type)) {
|
||||
if (qca_is_wcn399x(soc_type) ||
|
||||
qca_is_wcn6750(soc_type)) {
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
|
||||
|
||||
ret = qca_read_soc_version(hdev, &ver, soc_type);
|
||||
@@ -1720,7 +1748,8 @@ retry:
|
||||
qca_baudrate = qca_get_baudrate_value(speed);
|
||||
}
|
||||
|
||||
if (!qca_is_wcn399x(soc_type)) {
|
||||
if (!(qca_is_wcn399x(soc_type) ||
|
||||
qca_is_wcn6750(soc_type))) {
|
||||
/* Get QCA version information */
|
||||
ret = qca_read_soc_version(hdev, &ver, soc_type);
|
||||
if (ret)
|
||||
@@ -1828,14 +1857,30 @@ static const struct qca_device_data qca_soc_data_qca6390 = {
|
||||
.num_vregs = 0,
|
||||
};
|
||||
|
||||
static const struct qca_device_data qca_soc_data_wcn6750 = {
|
||||
.soc_type = QCA_WCN6750,
|
||||
.vregs = (struct qca_vreg []) {
|
||||
{ "vddio", 5000 },
|
||||
{ "vddaon", 26000 },
|
||||
{ "vddbtcxmx", 126000 },
|
||||
{ "vddrfacmn", 12500 },
|
||||
{ "vddrfa0p8", 102000 },
|
||||
{ "vddrfa1p7", 302000 },
|
||||
{ "vddrfa1p2", 257000 },
|
||||
{ "vddrfa2p2", 1700000 },
|
||||
{ "vddasd", 200 },
|
||||
},
|
||||
.num_vregs = 9,
|
||||
.capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES,
|
||||
};
|
||||
|
||||
static void qca_power_shutdown(struct hci_uart *hu)
|
||||
{
|
||||
struct qca_serdev *qcadev;
|
||||
struct qca_data *qca = hu->priv;
|
||||
unsigned long flags;
|
||||
enum qca_btsoc_type soc_type = qca_soc_type(hu);
|
||||
|
||||
qcadev = serdev_device_get_drvdata(hu->serdev);
|
||||
bool sw_ctrl_state;
|
||||
|
||||
/* From this point we go into power off state. But serial port is
|
||||
* still open, stop queueing the IBS data and flush all the buffered
|
||||
@@ -1852,10 +1897,20 @@ static void qca_power_shutdown(struct hci_uart *hu)
|
||||
if (!hu->serdev)
|
||||
return;
|
||||
|
||||
qcadev = serdev_device_get_drvdata(hu->serdev);
|
||||
|
||||
if (qca_is_wcn399x(soc_type)) {
|
||||
host_set_baudrate(hu, 2400);
|
||||
qca_send_power_pulse(hu, false);
|
||||
qca_regulator_disable(qcadev);
|
||||
} else if (soc_type == QCA_WCN6750) {
|
||||
gpiod_set_value_cansleep(qcadev->bt_en, 0);
|
||||
msleep(100);
|
||||
qca_regulator_disable(qcadev);
|
||||
if (qcadev->sw_ctrl) {
|
||||
sw_ctrl_state = gpiod_get_value_cansleep(qcadev->sw_ctrl);
|
||||
bt_dev_dbg(hu->hdev, "SW_CTRL is %d", sw_ctrl_state);
|
||||
}
|
||||
} else if (qcadev->bt_en) {
|
||||
gpiod_set_value_cansleep(qcadev->bt_en, 0);
|
||||
}
|
||||
@@ -1978,7 +2033,9 @@ static int qca_serdev_probe(struct serdev_device *serdev)
|
||||
if (!qcadev->oper_speed)
|
||||
BT_DBG("UART will pick default operating speed");
|
||||
|
||||
if (data && qca_is_wcn399x(data->soc_type)) {
|
||||
if (data &&
|
||||
(qca_is_wcn399x(data->soc_type) ||
|
||||
qca_is_wcn6750(data->soc_type))) {
|
||||
qcadev->btsoc_type = data->soc_type;
|
||||
qcadev->bt_power = devm_kzalloc(&serdev->dev,
|
||||
sizeof(struct qca_power),
|
||||
@@ -1996,6 +2053,18 @@ static int qca_serdev_probe(struct serdev_device *serdev)
|
||||
|
||||
qcadev->bt_power->vregs_on = false;
|
||||
|
||||
qcadev->bt_en = devm_gpiod_get_optional(&serdev->dev, "enable",
|
||||
GPIOD_OUT_LOW);
|
||||
if (!qcadev->bt_en && data->soc_type == QCA_WCN6750) {
|
||||
dev_err(&serdev->dev, "failed to acquire BT_EN gpio\n");
|
||||
power_ctrl_enabled = false;
|
||||
}
|
||||
|
||||
qcadev->sw_ctrl = devm_gpiod_get_optional(&serdev->dev, "swctrl",
|
||||
GPIOD_IN);
|
||||
if (!qcadev->sw_ctrl && data->soc_type == QCA_WCN6750)
|
||||
dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n");
|
||||
|
||||
qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL);
|
||||
if (IS_ERR(qcadev->susclk)) {
|
||||
dev_err(&serdev->dev, "failed to acquire clk\n");
|
||||
@@ -2068,7 +2137,9 @@ static void qca_serdev_remove(struct serdev_device *serdev)
|
||||
struct qca_serdev *qcadev = serdev_device_get_drvdata(serdev);
|
||||
struct qca_power *power = qcadev->bt_power;
|
||||
|
||||
if (qca_is_wcn399x(qcadev->btsoc_type) && power->vregs_on)
|
||||
if ((qca_is_wcn399x(qcadev->btsoc_type) ||
|
||||
qca_is_wcn6750(qcadev->btsoc_type)) &&
|
||||
power->vregs_on)
|
||||
qca_power_shutdown(&qcadev->serdev_hu);
|
||||
else if (qcadev->susclk)
|
||||
clk_disable_unprepare(qcadev->susclk);
|
||||
@@ -2244,6 +2315,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = {
|
||||
{ .compatible = "qcom,wcn3990-bt", .data = &qca_soc_data_wcn3990},
|
||||
{ .compatible = "qcom,wcn3991-bt", .data = &qca_soc_data_wcn3991},
|
||||
{ .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998},
|
||||
{ .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match);
|
||||
|
||||
@@ -34,6 +34,9 @@ static int virtbt_add_inbuf(struct virtio_bluetooth *vbt)
|
||||
int err;
|
||||
|
||||
skb = alloc_skb(1000, GFP_KERNEL);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
sg_init_one(sg, skb->data, 1000);
|
||||
|
||||
err = virtqueue_add_inbuf(vq, sg, 1, skb, GFP_KERNEL);
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
#define HCI_MAX_AMP_ASSOC_SIZE 672
|
||||
|
||||
#define HCI_MAX_CSB_DATA_SIZE 252
|
||||
#define HCI_MAX_CPB_DATA_SIZE 252
|
||||
|
||||
/* HCI dev events */
|
||||
#define HCI_DEV_REG 1
|
||||
@@ -339,6 +339,7 @@ enum {
|
||||
#define HCI_PAIRING_TIMEOUT msecs_to_jiffies(60000) /* 60 seconds */
|
||||
#define HCI_INIT_TIMEOUT msecs_to_jiffies(10000) /* 10 seconds */
|
||||
#define HCI_CMD_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */
|
||||
#define HCI_NCMD_TIMEOUT msecs_to_jiffies(4000) /* 4 seconds */
|
||||
#define HCI_ACL_TX_TIMEOUT msecs_to_jiffies(45000) /* 45 seconds */
|
||||
#define HCI_AUTO_OFF_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */
|
||||
#define HCI_POWER_OFF_TIMEOUT msecs_to_jiffies(5000) /* 5 seconds */
|
||||
@@ -471,10 +472,10 @@ enum {
|
||||
#define LMP_EXTFEATURES 0x80
|
||||
|
||||
/* Extended LMP features */
|
||||
#define LMP_CSB_MASTER 0x01
|
||||
#define LMP_CSB_SLAVE 0x02
|
||||
#define LMP_SYNC_TRAIN 0x04
|
||||
#define LMP_SYNC_SCAN 0x08
|
||||
#define LMP_CPB_CENTRAL 0x01
|
||||
#define LMP_CPB_PERIPHERAL 0x02
|
||||
#define LMP_SYNC_TRAIN 0x04
|
||||
#define LMP_SYNC_SCAN 0x08
|
||||
|
||||
#define LMP_SC 0x01
|
||||
#define LMP_PING 0x02
|
||||
@@ -488,7 +489,7 @@ enum {
|
||||
/* LE features */
|
||||
#define HCI_LE_ENCRYPTION 0x01
|
||||
#define HCI_LE_CONN_PARAM_REQ_PROC 0x02
|
||||
#define HCI_LE_SLAVE_FEATURES 0x08
|
||||
#define HCI_LE_PERIPHERAL_FEATURES 0x08
|
||||
#define HCI_LE_PING 0x10
|
||||
#define HCI_LE_DATA_LEN_EXT 0x20
|
||||
#define HCI_LE_LL_PRIVACY 0x40
|
||||
@@ -497,8 +498,8 @@ enum {
|
||||
#define HCI_LE_PHY_CODED 0x08
|
||||
#define HCI_LE_EXT_ADV 0x10
|
||||
#define HCI_LE_CHAN_SEL_ALG2 0x40
|
||||
#define HCI_LE_CIS_MASTER 0x10
|
||||
#define HCI_LE_CIS_SLAVE 0x20
|
||||
#define HCI_LE_CIS_CENTRAL 0x10
|
||||
#define HCI_LE_CIS_PERIPHERAL 0x20
|
||||
|
||||
/* Connection modes */
|
||||
#define HCI_CM_ACTIVE 0x0000
|
||||
@@ -876,17 +877,17 @@ struct hci_rp_logical_link_cancel {
|
||||
__u8 flow_spec_id;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_SET_CSB 0x0441
|
||||
struct hci_cp_set_csb {
|
||||
#define HCI_OP_SET_CPB 0x0441
|
||||
struct hci_cp_set_cpb {
|
||||
__u8 enable;
|
||||
__u8 lt_addr;
|
||||
__u8 lpo_allowed;
|
||||
__le16 packet_type;
|
||||
__le16 interval_min;
|
||||
__le16 interval_max;
|
||||
__le16 csb_sv_tout;
|
||||
__le16 cpb_sv_tout;
|
||||
} __packed;
|
||||
struct hci_rp_set_csb {
|
||||
struct hci_rp_set_cpb {
|
||||
__u8 status;
|
||||
__u8 lt_addr;
|
||||
__le16 interval;
|
||||
@@ -1183,14 +1184,14 @@ struct hci_rp_delete_reserved_lt_addr {
|
||||
__u8 lt_addr;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_SET_CSB_DATA 0x0c76
|
||||
struct hci_cp_set_csb_data {
|
||||
#define HCI_OP_SET_CPB_DATA 0x0c76
|
||||
struct hci_cp_set_cpb_data {
|
||||
__u8 lt_addr;
|
||||
__u8 fragment;
|
||||
__u8 data_length;
|
||||
__u8 data[HCI_MAX_CSB_DATA_SIZE];
|
||||
__u8 data[HCI_MAX_CPB_DATA_SIZE];
|
||||
} __packed;
|
||||
struct hci_rp_set_csb_data {
|
||||
struct hci_rp_set_cpb_data {
|
||||
__u8 status;
|
||||
__u8 lt_addr;
|
||||
} __packed;
|
||||
@@ -1504,7 +1505,7 @@ struct hci_cp_le_set_scan_enable {
|
||||
} __packed;
|
||||
|
||||
#define HCI_LE_USE_PEER_ADDR 0x00
|
||||
#define HCI_LE_USE_WHITELIST 0x01
|
||||
#define HCI_LE_USE_ACCEPT_LIST 0x01
|
||||
|
||||
#define HCI_OP_LE_CREATE_CONN 0x200d
|
||||
struct hci_cp_le_create_conn {
|
||||
@@ -1524,22 +1525,22 @@ struct hci_cp_le_create_conn {
|
||||
|
||||
#define HCI_OP_LE_CREATE_CONN_CANCEL 0x200e
|
||||
|
||||
#define HCI_OP_LE_READ_WHITE_LIST_SIZE 0x200f
|
||||
struct hci_rp_le_read_white_list_size {
|
||||
#define HCI_OP_LE_READ_ACCEPT_LIST_SIZE 0x200f
|
||||
struct hci_rp_le_read_accept_list_size {
|
||||
__u8 status;
|
||||
__u8 size;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_LE_CLEAR_WHITE_LIST 0x2010
|
||||
#define HCI_OP_LE_CLEAR_ACCEPT_LIST 0x2010
|
||||
|
||||
#define HCI_OP_LE_ADD_TO_WHITE_LIST 0x2011
|
||||
struct hci_cp_le_add_to_white_list {
|
||||
#define HCI_OP_LE_ADD_TO_ACCEPT_LIST 0x2011
|
||||
struct hci_cp_le_add_to_accept_list {
|
||||
__u8 bdaddr_type;
|
||||
bdaddr_t bdaddr;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_LE_DEL_FROM_WHITE_LIST 0x2012
|
||||
struct hci_cp_le_del_from_white_list {
|
||||
#define HCI_OP_LE_DEL_FROM_ACCEPT_LIST 0x2012
|
||||
struct hci_cp_le_del_from_accept_list {
|
||||
__u8 bdaddr_type;
|
||||
bdaddr_t bdaddr;
|
||||
} __packed;
|
||||
@@ -1774,13 +1775,15 @@ struct hci_cp_ext_adv_set {
|
||||
__u8 max_events;
|
||||
} __packed;
|
||||
|
||||
#define HCI_MAX_EXT_AD_LENGTH 251
|
||||
|
||||
#define HCI_OP_LE_SET_EXT_ADV_DATA 0x2037
|
||||
struct hci_cp_le_set_ext_adv_data {
|
||||
__u8 handle;
|
||||
__u8 operation;
|
||||
__u8 frag_pref;
|
||||
__u8 length;
|
||||
__u8 data[HCI_MAX_AD_LENGTH];
|
||||
__u8 data[];
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_LE_SET_EXT_SCAN_RSP_DATA 0x2038
|
||||
@@ -1789,7 +1792,7 @@ struct hci_cp_le_set_ext_scan_rsp_data {
|
||||
__u8 operation;
|
||||
__u8 frag_pref;
|
||||
__u8 length;
|
||||
__u8 data[HCI_MAX_AD_LENGTH];
|
||||
__u8 data[];
|
||||
} __packed;
|
||||
|
||||
#define LE_SET_ADV_DATA_OP_COMPLETE 0x03
|
||||
@@ -1838,23 +1841,23 @@ struct hci_rp_le_read_iso_tx_sync {
|
||||
#define HCI_OP_LE_SET_CIG_PARAMS 0x2062
|
||||
struct hci_cis_params {
|
||||
__u8 cis_id;
|
||||
__le16 m_sdu;
|
||||
__le16 s_sdu;
|
||||
__u8 m_phy;
|
||||
__u8 s_phy;
|
||||
__u8 m_rtn;
|
||||
__u8 s_rtn;
|
||||
__le16 c_sdu;
|
||||
__le16 p_pdu;
|
||||
__u8 c_phy;
|
||||
__u8 p_phy;
|
||||
__u8 c_rtn;
|
||||
__u8 p_rtn;
|
||||
} __packed;
|
||||
|
||||
struct hci_cp_le_set_cig_params {
|
||||
__u8 cig_id;
|
||||
__u8 m_interval[3];
|
||||
__u8 s_interval[3];
|
||||
__u8 sca;
|
||||
__u8 c_interval[3];
|
||||
__u8 p_interval[3];
|
||||
__u8 wc_sca;
|
||||
__u8 packing;
|
||||
__u8 framing;
|
||||
__le16 m_latency;
|
||||
__le16 s_latency;
|
||||
__le16 c_latency;
|
||||
__le16 p_latency;
|
||||
__u8 num_cis;
|
||||
struct hci_cis_params cis[];
|
||||
} __packed;
|
||||
@@ -2259,7 +2262,7 @@ struct hci_ev_sync_train_complete {
|
||||
__u8 status;
|
||||
} __packed;
|
||||
|
||||
#define HCI_EV_SLAVE_PAGE_RESP_TIMEOUT 0x54
|
||||
#define HCI_EV_PERIPHERAL_PAGE_RESP_TIMEOUT 0x54
|
||||
|
||||
#define HCI_EV_LE_CONN_COMPLETE 0x01
|
||||
struct hci_ev_le_conn_complete {
|
||||
@@ -2417,17 +2420,17 @@ struct hci_evt_le_cis_established {
|
||||
__le16 handle;
|
||||
__u8 cig_sync_delay[3];
|
||||
__u8 cis_sync_delay[3];
|
||||
__u8 m_latency[3];
|
||||
__u8 s_latency[3];
|
||||
__u8 m_phy;
|
||||
__u8 s_phy;
|
||||
__u8 c_latency[3];
|
||||
__u8 p_latency[3];
|
||||
__u8 c_phy;
|
||||
__u8 p_phy;
|
||||
__u8 nse;
|
||||
__u8 m_bn;
|
||||
__u8 s_bn;
|
||||
__u8 m_ft;
|
||||
__u8 s_ft;
|
||||
__le16 m_mtu;
|
||||
__le16 s_mtu;
|
||||
__u8 c_bn;
|
||||
__u8 p_bn;
|
||||
__u8 c_ft;
|
||||
__u8 p_ft;
|
||||
__le16 c_mtu;
|
||||
__le16 p_mtu;
|
||||
__le16 interval;
|
||||
} __packed;
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ struct hci_conn_hash {
|
||||
unsigned int amp_num;
|
||||
unsigned int sco_num;
|
||||
unsigned int le_num;
|
||||
unsigned int le_num_slave;
|
||||
unsigned int le_num_peripheral;
|
||||
};
|
||||
|
||||
struct bdaddr_list {
|
||||
@@ -228,9 +228,9 @@ struct adv_info {
|
||||
__u16 remaining_time;
|
||||
__u16 duration;
|
||||
__u16 adv_data_len;
|
||||
__u8 adv_data[HCI_MAX_AD_LENGTH];
|
||||
__u8 adv_data[HCI_MAX_EXT_AD_LENGTH];
|
||||
__u16 scan_rsp_len;
|
||||
__u8 scan_rsp_data[HCI_MAX_AD_LENGTH];
|
||||
__u8 scan_rsp_data[HCI_MAX_EXT_AD_LENGTH];
|
||||
__s8 tx_power;
|
||||
__u32 min_interval;
|
||||
__u32 max_interval;
|
||||
@@ -327,7 +327,7 @@ struct hci_dev {
|
||||
__u8 max_page;
|
||||
__u8 features[HCI_MAX_PAGES][8];
|
||||
__u8 le_features[8];
|
||||
__u8 le_white_list_size;
|
||||
__u8 le_accept_list_size;
|
||||
__u8 le_resolv_list_size;
|
||||
__u8 le_num_of_adv_sets;
|
||||
__u8 le_states[8];
|
||||
@@ -470,6 +470,7 @@ struct hci_dev {
|
||||
struct delayed_work service_cache;
|
||||
|
||||
struct delayed_work cmd_timer;
|
||||
struct delayed_work ncmd_timer;
|
||||
|
||||
struct work_struct rx_work;
|
||||
struct work_struct cmd_work;
|
||||
@@ -521,14 +522,14 @@ struct hci_dev {
|
||||
struct hci_conn_hash conn_hash;
|
||||
|
||||
struct list_head mgmt_pending;
|
||||
struct list_head blacklist;
|
||||
struct list_head whitelist;
|
||||
struct list_head reject_list;
|
||||
struct list_head accept_list;
|
||||
struct list_head uuids;
|
||||
struct list_head link_keys;
|
||||
struct list_head long_term_keys;
|
||||
struct list_head identity_resolving_keys;
|
||||
struct list_head remote_oob_data;
|
||||
struct list_head le_white_list;
|
||||
struct list_head le_accept_list;
|
||||
struct list_head le_resolv_list;
|
||||
struct list_head le_conn_params;
|
||||
struct list_head pend_le_conns;
|
||||
@@ -550,9 +551,9 @@ struct hci_dev {
|
||||
DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS);
|
||||
|
||||
__s8 adv_tx_power;
|
||||
__u8 adv_data[HCI_MAX_AD_LENGTH];
|
||||
__u8 adv_data[HCI_MAX_EXT_AD_LENGTH];
|
||||
__u8 adv_data_len;
|
||||
__u8 scan_rsp_data[HCI_MAX_AD_LENGTH];
|
||||
__u8 scan_rsp_data[HCI_MAX_EXT_AD_LENGTH];
|
||||
__u8 scan_rsp_data_len;
|
||||
|
||||
struct list_head adv_instances;
|
||||
@@ -893,7 +894,7 @@ static inline void hci_conn_hash_add(struct hci_dev *hdev, struct hci_conn *c)
|
||||
case LE_LINK:
|
||||
h->le_num++;
|
||||
if (c->role == HCI_ROLE_SLAVE)
|
||||
h->le_num_slave++;
|
||||
h->le_num_peripheral++;
|
||||
break;
|
||||
case SCO_LINK:
|
||||
case ESCO_LINK:
|
||||
@@ -919,7 +920,7 @@ static inline void hci_conn_hash_del(struct hci_dev *hdev, struct hci_conn *c)
|
||||
case LE_LINK:
|
||||
h->le_num--;
|
||||
if (c->role == HCI_ROLE_SLAVE)
|
||||
h->le_num_slave--;
|
||||
h->le_num_peripheral--;
|
||||
break;
|
||||
case SCO_LINK:
|
||||
case ESCO_LINK:
|
||||
@@ -1393,8 +1394,8 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
|
||||
#define lmp_edr_5slot_capable(dev) ((dev)->features[0][5] & LMP_EDR_5SLOT)
|
||||
|
||||
/* ----- Extended LMP capabilities ----- */
|
||||
#define lmp_csb_master_capable(dev) ((dev)->features[2][0] & LMP_CSB_MASTER)
|
||||
#define lmp_csb_slave_capable(dev) ((dev)->features[2][0] & LMP_CSB_SLAVE)
|
||||
#define lmp_cpb_central_capable(dev) ((dev)->features[2][0] & LMP_CPB_CENTRAL)
|
||||
#define lmp_cpb_peripheral_capable(dev) ((dev)->features[2][0] & LMP_CPB_PERIPHERAL)
|
||||
#define lmp_sync_train_capable(dev) ((dev)->features[2][0] & LMP_SYNC_TRAIN)
|
||||
#define lmp_sync_scan_capable(dev) ((dev)->features[2][0] & LMP_SYNC_SCAN)
|
||||
#define lmp_sc_capable(dev) ((dev)->features[2][1] & LMP_SC)
|
||||
@@ -1768,7 +1769,7 @@ void __mgmt_power_off(struct hci_dev *hdev);
|
||||
void mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
|
||||
bool persistent);
|
||||
void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
|
||||
u32 flags, u8 *name, u8 name_len);
|
||||
u8 *name, u8 name_len);
|
||||
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||
u8 link_type, u8 addr_type, u8 reason,
|
||||
bool mgmt_connected);
|
||||
|
||||
@@ -202,7 +202,7 @@ struct mgmt_cp_load_link_keys {
|
||||
struct mgmt_ltk_info {
|
||||
struct mgmt_addr_info addr;
|
||||
__u8 type;
|
||||
__u8 master;
|
||||
__u8 initiator;
|
||||
__u8 enc_size;
|
||||
__le16 ediv;
|
||||
__le64 rand;
|
||||
@@ -939,6 +939,7 @@ struct mgmt_ev_auth_failed {
|
||||
#define MGMT_DEV_FOUND_CONFIRM_NAME 0x01
|
||||
#define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02
|
||||
#define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04
|
||||
#define MGMT_DEV_FOUND_INITIATED_CONN 0x08
|
||||
|
||||
#define MGMT_EV_DEVICE_FOUND 0x0012
|
||||
struct mgmt_ev_device_found {
|
||||
|
||||
@@ -103,34 +103,6 @@ static inline bool peer_del(struct lowpan_btle_dev *dev,
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline struct lowpan_peer *peer_lookup_ba(struct lowpan_btle_dev *dev,
|
||||
bdaddr_t *ba, __u8 type)
|
||||
{
|
||||
struct lowpan_peer *peer;
|
||||
|
||||
BT_DBG("peers %d addr %pMR type %d", atomic_read(&dev->peer_count),
|
||||
ba, type);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(peer, &dev->peers, list) {
|
||||
BT_DBG("dst addr %pMR dst type %d",
|
||||
&peer->chan->dst, peer->chan->dst_type);
|
||||
|
||||
if (bacmp(&peer->chan->dst, ba))
|
||||
continue;
|
||||
|
||||
if (type == peer->chan->dst_type) {
|
||||
rcu_read_unlock();
|
||||
return peer;
|
||||
}
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct lowpan_peer *
|
||||
__peer_lookup_chan(struct lowpan_btle_dev *dev, struct l2cap_chan *chan)
|
||||
{
|
||||
@@ -195,7 +167,7 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev,
|
||||
rcu_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(peer, &dev->peers, list) {
|
||||
BT_DBG("dst addr %pMR dst type %d ip %pI6c",
|
||||
BT_DBG("dst addr %pMR dst type %u ip %pI6c",
|
||||
&peer->chan->dst, peer->chan->dst_type,
|
||||
&peer->peer_addr);
|
||||
|
||||
@@ -506,7 +478,7 @@ static int send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
local_skb = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
BT_DBG("xmit %s to %pMR type %d IP %pI6c chan %p",
|
||||
BT_DBG("xmit %s to %pMR type %u IP %pI6c chan %p",
|
||||
netdev->name,
|
||||
&pentry->chan->dst, pentry->chan->dst_type,
|
||||
&pentry->peer_addr, pentry->chan);
|
||||
@@ -549,7 +521,7 @@ static netdev_tx_t bt_xmit(struct sk_buff *skb, struct net_device *netdev)
|
||||
|
||||
if (err) {
|
||||
if (lowpan_cb(skb)->chan) {
|
||||
BT_DBG("xmit %s to %pMR type %d IP %pI6c chan %p",
|
||||
BT_DBG("xmit %s to %pMR type %u IP %pI6c chan %p",
|
||||
netdev->name, &addr, addr_type,
|
||||
&lowpan_cb(skb)->addr, lowpan_cb(skb)->chan);
|
||||
err = send_pkt(lowpan_cb(skb)->chan, skb, netdev);
|
||||
@@ -691,7 +663,7 @@ static struct l2cap_chan *add_peer_chan(struct l2cap_chan *chan,
|
||||
static int setup_netdev(struct l2cap_chan *chan, struct lowpan_btle_dev **dev)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
netdev = alloc_netdev(LOWPAN_PRIV_SIZE(sizeof(struct lowpan_btle_dev)),
|
||||
IFACE_NAME_TEMPLATE, NET_NAME_UNKNOWN,
|
||||
@@ -818,7 +790,7 @@ static void chan_close_cb(struct l2cap_chan *chan)
|
||||
|
||||
BT_DBG("dev %p removing %speer %p", dev,
|
||||
last ? "last " : "1 ", peer);
|
||||
BT_DBG("chan %p orig refcnt %d", chan,
|
||||
BT_DBG("chan %p orig refcnt %u", chan,
|
||||
kref_read(&chan->kref));
|
||||
|
||||
l2cap_chan_put(chan);
|
||||
@@ -907,14 +879,6 @@ static const struct l2cap_ops bt_6lowpan_chan_ops = {
|
||||
.set_shutdown = l2cap_chan_no_set_shutdown,
|
||||
};
|
||||
|
||||
static inline __u8 bdaddr_type(__u8 type)
|
||||
{
|
||||
if (type == ADDR_LE_DEV_PUBLIC)
|
||||
return BDADDR_LE_PUBLIC;
|
||||
else
|
||||
return BDADDR_LE_RANDOM;
|
||||
}
|
||||
|
||||
static int bt_6lowpan_connect(bdaddr_t *addr, u8 dst_type)
|
||||
{
|
||||
struct l2cap_chan *chan;
|
||||
@@ -940,7 +904,7 @@ static int bt_6lowpan_disconnect(struct l2cap_conn *conn, u8 dst_type)
|
||||
{
|
||||
struct lowpan_peer *peer;
|
||||
|
||||
BT_DBG("conn %p dst type %d", conn, dst_type);
|
||||
BT_DBG("conn %p dst type %u", conn, dst_type);
|
||||
|
||||
peer = lookup_peer(conn);
|
||||
if (!peer)
|
||||
@@ -972,7 +936,7 @@ static struct l2cap_chan *bt_6lowpan_listen(void)
|
||||
|
||||
atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
|
||||
|
||||
BT_DBG("chan %p src type %d", chan, chan->src_type);
|
||||
BT_DBG("chan %p src type %u", chan, chan->src_type);
|
||||
|
||||
err = l2cap_add_psm(chan, addr, cpu_to_le16(L2CAP_PSM_IPSP));
|
||||
if (err) {
|
||||
@@ -1013,7 +977,7 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type,
|
||||
|
||||
*conn = (struct l2cap_conn *)hcon->l2cap_data;
|
||||
|
||||
BT_DBG("conn %p dst %pMR type %d", *conn, &hcon->dst, hcon->dst_type);
|
||||
BT_DBG("conn %p dst %pMR type %u", *conn, &hcon->dst, hcon->dst_type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1155,7 +1119,7 @@ static ssize_t lowpan_control_write(struct file *fp,
|
||||
return -EALREADY;
|
||||
}
|
||||
|
||||
BT_DBG("conn %p dst %pMR type %d user %d", conn,
|
||||
BT_DBG("conn %p dst %pMR type %d user %u", conn,
|
||||
&conn->hcon->dst, conn->hcon->dst_type,
|
||||
addr_type);
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ static int a2mp_command_rej(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*rej))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("ident %d reason %d", hdr->ident, le16_to_cpu(rej->reason));
|
||||
BT_DBG("ident %u reason %d", hdr->ident, le16_to_cpu(rej->reason));
|
||||
|
||||
skb_pull(skb, sizeof(*rej));
|
||||
|
||||
@@ -219,7 +219,7 @@ static int a2mp_discover_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
|
||||
cl = (void *) skb->data;
|
||||
while (len >= sizeof(*cl)) {
|
||||
BT_DBG("Remote AMP id %d type %d status %d", cl->id, cl->type,
|
||||
BT_DBG("Remote AMP id %u type %u status %u", cl->id, cl->type,
|
||||
cl->status);
|
||||
|
||||
if (cl->id != AMP_ID_BREDR && cl->type != AMP_TYPE_BREDR) {
|
||||
@@ -273,7 +273,7 @@ static int a2mp_change_notify(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
struct a2mp_cl *cl = (void *) skb->data;
|
||||
|
||||
while (skb->len >= sizeof(*cl)) {
|
||||
BT_DBG("Controller id %d type %d status %d", cl->id, cl->type,
|
||||
BT_DBG("Controller id %u type %u status %u", cl->id, cl->type,
|
||||
cl->status);
|
||||
cl = skb_pull(skb, sizeof(*cl));
|
||||
}
|
||||
@@ -302,7 +302,7 @@ static int a2mp_getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("id %d", req->id);
|
||||
BT_DBG("id %u", req->id);
|
||||
|
||||
hdev = hci_dev_get(req->id);
|
||||
if (!hdev || hdev->dev_type != HCI_AMP) {
|
||||
@@ -344,7 +344,7 @@ static int a2mp_getinfo_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*rsp))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("id %d status 0x%2.2x", rsp->id, rsp->status);
|
||||
BT_DBG("id %u status 0x%2.2x", rsp->id, rsp->status);
|
||||
|
||||
if (rsp->status)
|
||||
return -EINVAL;
|
||||
@@ -373,7 +373,7 @@ static int a2mp_getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("id %d", req->id);
|
||||
BT_DBG("id %u", req->id);
|
||||
|
||||
/* Make sure that other request is not processed */
|
||||
tmp = amp_mgr_lookup_by_state(READ_LOC_AMP_ASSOC);
|
||||
@@ -423,7 +423,7 @@ static int a2mp_getampassoc_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
|
||||
assoc_len = len - sizeof(*rsp);
|
||||
|
||||
BT_DBG("id %d status 0x%2.2x assoc len %zu", rsp->id, rsp->status,
|
||||
BT_DBG("id %u status 0x%2.2x assoc len %zu", rsp->id, rsp->status,
|
||||
assoc_len);
|
||||
|
||||
if (rsp->status)
|
||||
@@ -457,7 +457,7 @@ static int a2mp_getampassoc_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (!hcon)
|
||||
goto done;
|
||||
|
||||
BT_DBG("Created hcon %p: loc:%d -> rem:%d", hcon, hdev->id, rsp->id);
|
||||
BT_DBG("Created hcon %p: loc:%u -> rem:%u", hcon, hdev->id, rsp->id);
|
||||
|
||||
mgr->bredr_chan->remote_amp_id = rsp->id;
|
||||
|
||||
@@ -481,7 +481,7 @@ static int a2mp_createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("local_id %d, remote_id %d", req->local_id, req->remote_id);
|
||||
BT_DBG("local_id %u, remote_id %u", req->local_id, req->remote_id);
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
@@ -562,7 +562,7 @@ static int a2mp_discphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
if (le16_to_cpu(hdr->len) < sizeof(*req))
|
||||
return -EINVAL;
|
||||
|
||||
BT_DBG("local_id %d remote_id %d", req->local_id, req->remote_id);
|
||||
BT_DBG("local_id %u remote_id %u", req->local_id, req->remote_id);
|
||||
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
|
||||
@@ -599,7 +599,7 @@ send_rsp:
|
||||
static inline int a2mp_cmd_rsp(struct amp_mgr *mgr, struct sk_buff *skb,
|
||||
struct a2mp_cmd *hdr)
|
||||
{
|
||||
BT_DBG("ident %d code 0x%2.2x", hdr->ident, hdr->code);
|
||||
BT_DBG("ident %u code 0x%2.2x", hdr->ident, hdr->code);
|
||||
|
||||
skb_pull(skb, le16_to_cpu(hdr->len));
|
||||
return 0;
|
||||
@@ -620,7 +620,7 @@ static int a2mp_chan_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
|
||||
hdr = (void *) skb->data;
|
||||
len = le16_to_cpu(hdr->len);
|
||||
|
||||
BT_DBG("code 0x%2.2x id %d len %u", hdr->code, hdr->ident, len);
|
||||
BT_DBG("code 0x%2.2x id %u len %u", hdr->code, hdr->ident, len);
|
||||
|
||||
skb_pull(skb, sizeof(*hdr));
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ struct amp_ctrl *amp_ctrl_lookup(struct amp_mgr *mgr, u8 id)
|
||||
{
|
||||
struct amp_ctrl *ctrl;
|
||||
|
||||
BT_DBG("mgr %p id %d", mgr, id);
|
||||
BT_DBG("mgr %p id %u", mgr, id);
|
||||
|
||||
mutex_lock(&mgr->amp_ctrls_lock);
|
||||
list_for_each_entry(ctrl, &mgr->amp_ctrls, list) {
|
||||
@@ -179,7 +179,7 @@ int phylink_gen_key(struct hci_conn *conn, u8 *data, u8 *len, u8 *type)
|
||||
|
||||
/* Legacy key */
|
||||
if (conn->key_type < 3) {
|
||||
bt_dev_err(hdev, "legacy key type %d", conn->key_type);
|
||||
bt_dev_err(hdev, "legacy key type %u", conn->key_type);
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
@@ -257,7 +257,7 @@ void amp_read_loc_assoc_frag(struct hci_dev *hdev, u8 phy_handle)
|
||||
struct hci_request req;
|
||||
int err;
|
||||
|
||||
BT_DBG("%s handle %d", hdev->name, phy_handle);
|
||||
BT_DBG("%s handle %u", hdev->name, phy_handle);
|
||||
|
||||
cp.phy_handle = phy_handle;
|
||||
cp.max_len = cpu_to_le16(hdev->amp_assoc_size);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user