Hi Sherry > ...... > > > +static u8 *nxp_get_fw_name_from_chipid(struct hci_dev *hdev, u16 > > +chipid) { > > + u8 *fw_name = NULL; > > + > > + switch (chipid) { > > + case CHIP_ID_W9098: > > + fw_name = FIRMWARE_W9098; > > + break; > > + case CHIP_ID_IW416: > > + fw_name = FIRMWARE_IW416; > > + break; > > + case CHIP_ID_IW612: > > + fw_name = FIRMWARE_IW612; > > Suppose for each V3 BT chips, you not only need to update the fw_name, but > also fw_dnld_use_high_baudrate. Don't use the default value in drv_data for > all chips here. fw_dnld_use_high_baudrate is not used in the V3 download mechanism, neither do we need it as of now in V3. > > + > > + set_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); > > + init_waitqueue_head(&nxpdev->suspend_wait_q); > > + > > + if (!serdev_device_get_cts(nxpdev->serdev)) { > > + bt_dev_dbg(hdev, "CTS high. Need FW Download"); > > I don't think it's a good idea to use CTS status to determine the BT FW status, > because many uart drivers only support auto hardware flow control, and > cannot return the CTS line state. > Such as for LPUART, serdev_device_get_cts() will always return TIOCM_CTS, > so here FW may never be downloaded. I have reworked this part of code and we are now waiting for 1 second to see if we are receiving any bootloader signature from the chip, and downloading FW or moving ahead accordingly. Please check the v6 patch for the changes. Thanks, Neeraj