Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2780889 authored by Harish Bandi's avatar Harish Bandi Committed by Marcel Holtmann
Browse files

Bluetooth: hci_qca: Send VS pre shutdown command.



WCN399x chips are coex chips, it needs a VS pre shutdown
command while turning off the BT. So that chip can inform
BT is OFF to other active clients.

Signed-off-by: default avatarHarish Bandi <c-hbandi@codeaurora.org>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 2fde6afb
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -99,6 +99,27 @@ static int qca_send_reset(struct hci_dev *hdev)
	return 0;
}

int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
{
	struct sk_buff *skb;
	int err;

	bt_dev_dbg(hdev, "QCA pre shutdown cmd");

	skb = __hci_cmd_sync(hdev, QCA_PRE_SHUTDOWN_CMD, 0,
				NULL, HCI_INIT_TIMEOUT);
	if (IS_ERR(skb)) {
		err = PTR_ERR(skb);
		bt_dev_err(hdev, "QCA preshutdown_cmd failed (%d)", err);
		return err;
	}

	kfree_skb(skb);

	return 0;
}
EXPORT_SYMBOL_GPL(qca_send_pre_shutdown_cmd);

static void qca_tlv_check_data(struct rome_config *config,
				const struct firmware *fw)
{
+7 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#define EDL_PATCH_TLV_REQ_CMD		(0x1E)
#define EDL_NVM_ACCESS_SET_REQ_CMD	(0x01)
#define MAX_SIZE_PER_TLV_SEGMENT	(243)
#define QCA_PRE_SHUTDOWN_CMD		(0xFC08)

#define EDL_CMD_REQ_RES_EVT		(0x00)
#define EDL_PATCH_VER_RES_EVT		(0x19)
@@ -135,6 +136,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
		   const char *firmware_name);
int qca_read_soc_version(struct hci_dev *hdev, u32 *soc_version);
int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr);
int qca_send_pre_shutdown_cmd(struct hci_dev *hdev);
static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
{
	return soc_type == QCA_WCN3990 || soc_type == QCA_WCN3998;
@@ -167,4 +169,9 @@ static inline bool qca_is_wcn399x(enum qca_btsoc_type soc_type)
{
	return false;
}

static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
{
	return -EOPNOTSUPP;
}
#endif
+3 −0
Original line number Diff line number Diff line
@@ -1386,6 +1386,9 @@ static int qca_power_off(struct hci_dev *hdev)
{
	struct hci_uart *hu = hci_get_drvdata(hdev);

	/* Perform pre shutdown command */
	qca_send_pre_shutdown_cmd(hdev);

	qca_power_shutdown(hu);
	return 0;
}