int qca_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
 {
+       bdaddr_t bdaddr_swapped;
        struct sk_buff *skb;
        int err;
 
-       skb = __hci_cmd_sync_ev(hdev, EDL_WRITE_BD_ADDR_OPCODE, 6, bdaddr,
-                               HCI_EV_VENDOR, HCI_INIT_TIMEOUT);
+       baswap(&bdaddr_swapped, bdaddr);
+
+       skb = __hci_cmd_sync_ev(hdev, EDL_WRITE_BD_ADDR_OPCODE, 6,
+                               &bdaddr_swapped, HCI_EV_VENDOR,
+                               HCI_INIT_TIMEOUT);
        if (IS_ERR(skb)) {
                err = PTR_ERR(skb);
                bt_dev_err(hdev, "QCA Change address cmd failed (%d)", err);
 
        struct qca_power *bt_power;
        u32 init_speed;
        u32 oper_speed;
+       bool bdaddr_property_broken;
        const char *firmware_name;
 };
 
        const char *firmware_name = qca_get_firmware_name(hu);
        int ret;
        struct qca_btsoc_version ver;
+       struct qca_serdev *qcadev;
        const char *soc_name;
 
        ret = qca_check_speeds(hu);
        case QCA_WCN6855:
        case QCA_WCN7850:
                set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
+
+               qcadev = serdev_device_get_drvdata(hu->serdev);
+               if (qcadev->bdaddr_property_broken)
+                       set_bit(HCI_QUIRK_BDADDR_PROPERTY_BROKEN, &hdev->quirks);
+
                hci_set_aosp_capable(hdev);
 
                ret = qca_read_soc_version(hdev, &ver, soc_type);
        if (!qcadev->oper_speed)
                BT_DBG("UART will pick default operating speed");
 
+       qcadev->bdaddr_property_broken = device_property_read_bool(&serdev->dev,
+                       "qcom,local-bd-address-broken");
+
        if (data)
                qcadev->btsoc_type = data->soc_type;
        else