forked from mirrors/linux
		
	Bluetooth: btqca: Add support to read FW build version for WCN3991 BTSoC
Add support to read FW build version from debugfs node. This info can be read from /sys/kernel/debug/bluetooth/hci0/firmware_info Signed-off-by: Venkata Lakshmi Narayana Gubba <gubbaven@codeaurora.org> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
		
							parent
							
								
									517b693351
								
							
						
					
					
						commit
						c0187b0bd3
					
				
					 2 changed files with 55 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -94,6 +94,53 @@ int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
 | 
			
		|||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(qca_read_soc_version);
 | 
			
		||||
 | 
			
		||||
static int qca_read_fw_build_info(struct hci_dev *hdev)
 | 
			
		||||
{
 | 
			
		||||
	struct sk_buff *skb;
 | 
			
		||||
	struct edl_event_hdr *edl;
 | 
			
		||||
	char cmd, build_label[QCA_FW_BUILD_VER_LEN];
 | 
			
		||||
	int build_lbl_len, err = 0;
 | 
			
		||||
 | 
			
		||||
	bt_dev_dbg(hdev, "QCA read fw build info");
 | 
			
		||||
 | 
			
		||||
	cmd = EDL_GET_BUILD_INFO_CMD;
 | 
			
		||||
	skb = __hci_cmd_sync_ev(hdev, EDL_PATCH_CMD_OPCODE, EDL_PATCH_CMD_LEN,
 | 
			
		||||
				&cmd, 0, HCI_INIT_TIMEOUT);
 | 
			
		||||
	if (IS_ERR(skb)) {
 | 
			
		||||
		err = PTR_ERR(skb);
 | 
			
		||||
		bt_dev_err(hdev, "Reading QCA fw build info failed (%d)",
 | 
			
		||||
			   err);
 | 
			
		||||
		return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	edl = (struct edl_event_hdr *)(skb->data);
 | 
			
		||||
	if (!edl) {
 | 
			
		||||
		bt_dev_err(hdev, "QCA read fw build info with no header");
 | 
			
		||||
		err = -EILSEQ;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (edl->cresp != EDL_CMD_REQ_RES_EVT ||
 | 
			
		||||
	    edl->rtype != EDL_GET_BUILD_INFO_CMD) {
 | 
			
		||||
		bt_dev_err(hdev, "QCA Wrong packet received %d %d", edl->cresp,
 | 
			
		||||
			   edl->rtype);
 | 
			
		||||
		err = -EIO;
 | 
			
		||||
		goto out;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	build_lbl_len = edl->data[0];
 | 
			
		||||
	if (build_lbl_len <= QCA_FW_BUILD_VER_LEN - 1) {
 | 
			
		||||
		memcpy(build_label, edl->data + 1, build_lbl_len);
 | 
			
		||||
		*(build_label + build_lbl_len) = '\0';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	hci_set_fw_info(hdev, "%s", build_label);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
	kfree_skb(skb);
 | 
			
		||||
	return err;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int qca_send_reset(struct hci_dev *hdev)
 | 
			
		||||
{
 | 
			
		||||
	struct sk_buff *skb;
 | 
			
		||||
| 
						 | 
				
			
			@ -524,6 +571,13 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
 | 
			
		|||
		return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (soc_type == QCA_WCN3991) {
 | 
			
		||||
		/* get fw build info */
 | 
			
		||||
		err = qca_read_fw_build_info(hdev);
 | 
			
		||||
		if (err < 0)
 | 
			
		||||
			return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bt_dev_info(hdev, "QCA setup on UART is completed");
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,6 +11,7 @@
 | 
			
		|||
#define EDL_PATCH_CMD_LEN		(1)
 | 
			
		||||
#define EDL_PATCH_VER_REQ_CMD		(0x19)
 | 
			
		||||
#define EDL_PATCH_TLV_REQ_CMD		(0x1E)
 | 
			
		||||
#define EDL_GET_BUILD_INFO_CMD		(0x20)
 | 
			
		||||
#define EDL_NVM_ACCESS_SET_REQ_CMD	(0x01)
 | 
			
		||||
#define MAX_SIZE_PER_TLV_SEGMENT	(243)
 | 
			
		||||
#define QCA_PRE_SHUTDOWN_CMD		(0xFC08)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue