@@ -153,6 +153,7 @@ enum qca_btsoc_type {
QCA_WCN6750,
QCA_WCN6855,
QCA_WCN7850,
+ QCA_MAX,
};
#if IS_ENABLED(CONFIG_BT_QCA)
@@ -238,12 +238,17 @@ static void qca_dmp_hdr(struct hci_dev *hdev, struct sk_buff *skb);
static enum qca_btsoc_type qca_soc_type(struct hci_uart *hu)
{
+ /* For Non-serdev device, hu->proto_data records soc type
+ * set by ioctl HCIUARTSETPROTODATA.
+ */
+ int proto_data = (int)hu->proto_data;
enum qca_btsoc_type soc_type;
if (hu->serdev) {
struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
-
soc_type = qsd->btsoc_type;
+ } else if ((proto_data > 0) && (proto_data < QCA_MAX)) {
+ soc_type = (enum qca_btsoc_type)proto_data;
} else {
soc_type = QCA_ROME;
}
@@ -2281,6 +2286,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
return -ENOMEM;
qcadev->serdev_hu.serdev = serdev;
+ qcadev->serdev_hu.proto_data = 0;
data = device_get_match_data(&serdev->dev);
serdev_device_set_drvdata(serdev, qcadev);
device_property_read_string(&serdev->dev, "firmware-name",
qca_soc_type() returns wrong soc type QCA_ROME when use tool btattach for any other soc type such as QCA_QCA2066, and wrong soc type will cause later initialization failure, fixed by using user specified soc type for hci_uart derived from tool btattach. Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> --- drivers/bluetooth/btqca.h | 1 + drivers/bluetooth/hci_qca.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-)