• Home
  • Raw
  • Download

Lines Matching +full:fw +full:- +full:init +full:- +full:baudrate

1 // SPDX-License-Identifier: GPL-2.0-or-later
91 /* Bluetooth vendor command : Set operational baudrate */
157 const struct firmware *fw; member
251 #define INIT 0x00000001 macro
291 struct ps_data *psdata = &nxpdev->psdata; in nxp_drv_send_cmd()
297 psdata->driver_sent_cmd = true; in nxp_drv_send_cmd()
299 psdata->driver_sent_cmd = false; in nxp_drv_send_cmd()
306 if (schedule_work(&nxpdev->tx_work)) in btnxpuart_tx_wakeup()
307 set_bit(BTNXPUART_TX_STATE_ACTIVE, &nxpdev->tx_state); in btnxpuart_tx_wakeup()
313 struct ps_data *psdata = &nxpdev->psdata; in ps_start_timer()
318 if (psdata->cur_psmode == PS_MODE_ENABLE) in ps_start_timer()
319 mod_timer(&psdata->ps_timer, jiffies + msecs_to_jiffies(psdata->h2c_ps_interval)); in ps_start_timer()
324 struct ps_data *psdata = &nxpdev->psdata; in ps_cancel_timer()
326 flush_work(&psdata->work); in ps_cancel_timer()
327 del_timer_sync(&psdata->ps_timer); in ps_cancel_timer()
333 struct ps_data *psdata = &nxpdev->psdata; in ps_control()
336 if (psdata->ps_state == ps_state || in ps_control()
337 !test_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state)) in ps_control()
340 switch (psdata->cur_h2c_wakeupmode) { in ps_control()
343 status = serdev_device_set_tiocm(nxpdev->serdev, TIOCM_DTR, 0); in ps_control()
345 status = serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_DTR); in ps_control()
350 status = serdev_device_break_ctl(nxpdev->serdev, 0); in ps_control()
352 status = serdev_device_break_ctl(nxpdev->serdev, -1); in ps_control()
358 psdata->ps_state = ps_state; in ps_control()
367 if (data->ps_cmd == PS_CMD_ENTER_PS && data->cur_psmode == PS_MODE_ENABLE) in ps_work_func()
368 ps_control(data->hdev, PS_STATE_SLEEP); in ps_work_func()
369 else if (data->ps_cmd == PS_CMD_EXIT_PS) in ps_work_func()
370 ps_control(data->hdev, PS_STATE_AWAKE); in ps_work_func()
376 struct hci_dev *hdev = data->hdev; in ps_timeout_func()
379 if (test_bit(BTNXPUART_TX_STATE_ACTIVE, &nxpdev->tx_state)) { in ps_timeout_func()
382 data->ps_cmd = PS_CMD_ENTER_PS; in ps_timeout_func()
383 schedule_work(&data->work); in ps_timeout_func()
390 struct ps_data *psdata = &nxpdev->psdata; in ps_setup()
392 psdata->hdev = hdev; in ps_setup()
393 INIT_WORK(&psdata->work, ps_work_func); in ps_setup()
394 timer_setup(&psdata->ps_timer, ps_timeout_func, 0); in ps_setup()
399 struct ps_data *psdata = &nxpdev->psdata; in ps_wakeup()
401 if (psdata->ps_state != PS_STATE_AWAKE) { in ps_wakeup()
402 psdata->ps_cmd = PS_CMD_EXIT_PS; in ps_wakeup()
403 schedule_work(&psdata->work); in ps_wakeup()
410 struct ps_data *psdata = &nxpdev->psdata; in send_ps_cmd()
415 if (psdata->target_ps_mode == PS_MODE_ENABLE) in send_ps_cmd()
419 pcmd.c2h_ps_interval = __cpu_to_le16(psdata->c2h_ps_interval); in send_ps_cmd()
430 psdata->cur_psmode = psdata->target_ps_mode; in send_ps_cmd()
432 psdata->target_ps_mode = psdata->cur_psmode; in send_ps_cmd()
433 if (psdata->cur_psmode == PS_MODE_ENABLE) in send_ps_cmd()
438 *status, psdata->cur_psmode); in send_ps_cmd()
448 struct ps_data *psdata = &nxpdev->psdata; in send_wakeup_method_cmd()
453 pcmd.c2h_wakeupmode = psdata->c2h_wakeupmode; in send_wakeup_method_cmd()
454 pcmd.c2h_wakeup_gpio = psdata->c2h_wakeup_gpio; in send_wakeup_method_cmd()
455 switch (psdata->h2c_wakeupmode) { in send_wakeup_method_cmd()
468 bt_dev_err(hdev, "Setting wake-up method failed (%ld)", PTR_ERR(skb)); in send_wakeup_method_cmd()
475 psdata->cur_h2c_wakeupmode = psdata->h2c_wakeupmode; in send_wakeup_method_cmd()
477 psdata->h2c_wakeupmode = psdata->cur_h2c_wakeupmode; in send_wakeup_method_cmd()
479 *status, psdata->cur_h2c_wakeupmode); in send_wakeup_method_cmd()
489 struct ps_data *psdata = &nxpdev->psdata; in ps_init()
491 serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_RTS); in ps_init()
493 serdev_device_set_tiocm(nxpdev->serdev, TIOCM_RTS, 0); in ps_init()
496 psdata->ps_state = PS_STATE_AWAKE; in ps_init()
497 psdata->c2h_wakeupmode = BT_HOST_WAKEUP_METHOD_NONE; in ps_init()
498 psdata->c2h_wakeup_gpio = 0xff; in ps_init()
500 psdata->cur_h2c_wakeupmode = WAKEUP_METHOD_INVALID; in ps_init()
501 psdata->h2c_ps_interval = PS_DEFAULT_TIMEOUT_PERIOD_MS; in ps_init()
504 psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR; in ps_init()
505 serdev_device_set_tiocm(nxpdev->serdev, 0, TIOCM_DTR); in ps_init()
506 serdev_device_set_tiocm(nxpdev->serdev, TIOCM_DTR, 0); in ps_init()
510 psdata->h2c_wakeupmode = WAKEUP_METHOD_BREAK; in ps_init()
511 serdev_device_break_ctl(nxpdev->serdev, -1); in ps_init()
513 serdev_device_break_ctl(nxpdev->serdev, 0); in ps_init()
518 psdata->cur_psmode = PS_MODE_DISABLE; in ps_init()
519 psdata->target_ps_mode = DEFAULT_PS_MODE; in ps_init()
521 if (psdata->cur_h2c_wakeupmode != psdata->h2c_wakeupmode) in ps_init()
523 if (psdata->cur_psmode != psdata->target_ps_mode) in ps_init()
533 nxpdev->fw_dnld_v1_offset = 0; in nxp_download_firmware()
534 nxpdev->fw_v1_sent_bytes = 0; in nxp_download_firmware()
535 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_download_firmware()
536 nxpdev->boot_reg_offset = 0; in nxp_download_firmware()
537 nxpdev->fw_v3_offset_correction = 0; in nxp_download_firmware()
538 nxpdev->baudrate_changed = false; in nxp_download_firmware()
539 nxpdev->timeout_changed = false; in nxp_download_firmware()
540 nxpdev->helper_downloaded = false; in nxp_download_firmware()
542 serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_PRI_BAUDRATE); in nxp_download_firmware()
543 serdev_device_set_flow_control(nxpdev->serdev, false); in nxp_download_firmware()
544 nxpdev->current_baudrate = HCI_NXP_PRI_BAUDRATE; in nxp_download_firmware()
546 /* Wait till FW is downloaded */ in nxp_download_firmware()
547 err = wait_event_interruptible_timeout(nxpdev->fw_dnld_done_wait_q, in nxp_download_firmware()
549 &nxpdev->tx_state), in nxp_download_firmware()
552 bt_dev_err(hdev, "FW Download Timeout."); in nxp_download_firmware()
553 return -ETIMEDOUT; in nxp_download_firmware()
556 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_download_firmware()
557 release_firmware(nxpdev->fw); in nxp_download_firmware()
558 memset(nxpdev->fw_name, 0, sizeof(nxpdev->fw_name)); in nxp_download_firmware()
560 /* Allow the downloaded FW to initialize */ in nxp_download_firmware()
577 serdev_device_write_buf(nxpdev->serdev, ack_nak, len); in nxp_send_ack()
585 u32 clkdivaddr = CLKDIVADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
586 u32 uartdivaddr = UARTDIVADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
587 u32 uartmcraddr = UARTMCRADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
588 u32 uartreinitaddr = UARTREINITADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
589 u32 uarticraddr = UARTICRADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
590 u32 uartfcraddr = UARTFCRADDR - nxpdev->boot_reg_offset; in nxp_fw_change_baudrate()
596 /* FW expects swapped CRC bytes */ in nxp_fw_change_baudrate()
598 sizeof(nxp_cmd5) - 4)); in nxp_fw_change_baudrate()
600 serdev_device_write_buf(nxpdev->serdev, (u8 *)&nxp_cmd5, sizeof(nxp_cmd5)); in nxp_fw_change_baudrate()
601 nxpdev->fw_v3_offset_correction += req_len; in nxp_fw_change_baudrate()
610 uart_config.re_init.value = __cpu_to_le32(INIT); in nxp_fw_change_baudrate()
615 /* FW expects swapped CRC bytes */ in nxp_fw_change_baudrate()
617 sizeof(uart_config) - 4)); in nxp_fw_change_baudrate()
619 serdev_device_write_buf(nxpdev->serdev, (u8 *)&uart_config, sizeof(uart_config)); in nxp_fw_change_baudrate()
620 serdev_device_wait_until_sent(nxpdev->serdev, 0); in nxp_fw_change_baudrate()
621 nxpdev->fw_v3_offset_correction += req_len; in nxp_fw_change_baudrate()
638 /* FW expects swapped CRC bytes */ in nxp_fw_change_timeout()
640 sizeof(nxp_cmd7) - 4)); in nxp_fw_change_timeout()
641 serdev_device_write_buf(nxpdev->serdev, (u8 *)&nxp_cmd7, sizeof(nxp_cmd7)); in nxp_fw_change_timeout()
642 serdev_device_wait_until_sent(nxpdev->serdev, 0); in nxp_fw_change_timeout()
643 nxpdev->fw_v3_offset_correction += req_len; in nxp_fw_change_timeout()
651 return __le32_to_cpu(hdr->payload_len); in nxp_get_data_len()
656 return test_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in is_fw_downloading()
661 if (test_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state)) { in process_boot_signature()
662 clear_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state); in process_boot_signature()
663 wake_up_interruptible(&nxpdev->check_boot_sign_wait_q); in process_boot_signature()
675 return -ENOENT; in nxp_request_firmware()
677 if (!strlen(nxpdev->fw_name)) { in nxp_request_firmware()
678 snprintf(nxpdev->fw_name, MAX_FW_FILE_NAME_LEN, "%s", fw_name); in nxp_request_firmware()
680 bt_dev_dbg(hdev, "Request Firmware: %s", nxpdev->fw_name); in nxp_request_firmware()
681 err = request_firmware(&nxpdev->fw, nxpdev->fw_name, &hdev->dev); in nxp_request_firmware()
683 bt_dev_err(hdev, "Firmware file %s not found", nxpdev->fw_name); in nxp_request_firmware()
684 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_request_firmware()
701 chip_id = le16_to_cpu(req->chip_id ^ req->chip_id_comp); in nxp_recv_chip_ver_v1()
702 if (chip_id == 0xffff && nxpdev->fw_dnld_v1_offset) { in nxp_recv_chip_ver_v1()
703 nxpdev->fw_dnld_v1_offset = 0; in nxp_recv_chip_ver_v1()
704 nxpdev->fw_v1_sent_bytes = 0; in nxp_recv_chip_ver_v1()
705 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_recv_chip_ver_v1()
706 release_firmware(nxpdev->fw); in nxp_recv_chip_ver_v1()
707 memset(nxpdev->fw_name, 0, sizeof(nxpdev->fw_name)); in nxp_recv_chip_ver_v1()
719 struct btnxpuart_data *nxp_data = nxpdev->nxp_data; in nxp_recv_fw_req_v1()
730 len = __le16_to_cpu(req->len ^ req->len_comp); in nxp_recv_fw_req_v1()
738 len = __le16_to_cpu(req->len); in nxp_recv_fw_req_v1()
740 if (!nxp_data->helper_fw_name) { in nxp_recv_fw_req_v1()
741 if (!nxpdev->timeout_changed) { in nxp_recv_fw_req_v1()
742 nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, in nxp_recv_fw_req_v1()
746 if (!nxpdev->baudrate_changed) { in nxp_recv_fw_req_v1()
747 nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, in nxp_recv_fw_req_v1()
749 if (nxpdev->baudrate_changed) { in nxp_recv_fw_req_v1()
750 serdev_device_set_baudrate(nxpdev->serdev, in nxp_recv_fw_req_v1()
752 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_recv_fw_req_v1()
753 nxpdev->current_baudrate = HCI_NXP_SEC_BAUDRATE; in nxp_recv_fw_req_v1()
759 if (!nxp_data->helper_fw_name || nxpdev->helper_downloaded) { in nxp_recv_fw_req_v1()
760 if (nxp_request_firmware(hdev, nxp_data->fw_name)) in nxp_recv_fw_req_v1()
762 } else if (nxp_data->helper_fw_name && !nxpdev->helper_downloaded) { in nxp_recv_fw_req_v1()
763 if (nxp_request_firmware(hdev, nxp_data->helper_fw_name)) in nxp_recv_fw_req_v1()
768 bt_dev_dbg(hdev, "FW Downloaded Successfully: %zu bytes", in nxp_recv_fw_req_v1()
769 nxpdev->fw->size); in nxp_recv_fw_req_v1()
770 if (nxp_data->helper_fw_name && !nxpdev->helper_downloaded) { in nxp_recv_fw_req_v1()
771 nxpdev->helper_downloaded = true; in nxp_recv_fw_req_v1()
772 serdev_device_wait_until_sent(nxpdev->serdev, 0); in nxp_recv_fw_req_v1()
773 serdev_device_set_baudrate(nxpdev->serdev, in nxp_recv_fw_req_v1()
775 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_recv_fw_req_v1()
777 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_recv_fw_req_v1()
778 wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q); in nxp_recv_fw_req_v1()
786 len = nxpdev->fw_v1_sent_bytes; in nxp_recv_fw_req_v1()
787 bt_dev_dbg(hdev, "CRC error. Resend %d bytes of FW.", len); in nxp_recv_fw_req_v1()
789 nxpdev->fw_dnld_v1_offset += nxpdev->fw_v1_sent_bytes; in nxp_recv_fw_req_v1()
791 /* The FW bin file is made up of many blocks of in nxp_recv_fw_req_v1()
793 * FW has requested a header, read the payload length in nxp_recv_fw_req_v1()
795 * In the next iteration, the FW should request the in nxp_recv_fw_req_v1()
798 * mismatch, clearly the driver and FW are out of sync, in nxp_recv_fw_req_v1()
799 * and we need to re-send the previous header again. in nxp_recv_fw_req_v1()
801 if (len == nxpdev->fw_v1_expected_len) { in nxp_recv_fw_req_v1()
803 nxpdev->fw_v1_expected_len = nxp_get_data_len(nxpdev->fw->data + in nxp_recv_fw_req_v1()
804 nxpdev->fw_dnld_v1_offset); in nxp_recv_fw_req_v1()
806 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_recv_fw_req_v1()
808 /* FW download out of sync. Send previous chunk again */ in nxp_recv_fw_req_v1()
809 nxpdev->fw_dnld_v1_offset -= nxpdev->fw_v1_sent_bytes; in nxp_recv_fw_req_v1()
810 nxpdev->fw_v1_expected_len = HDR_LEN; in nxp_recv_fw_req_v1()
814 if (nxpdev->fw_dnld_v1_offset + len <= nxpdev->fw->size) in nxp_recv_fw_req_v1()
815 serdev_device_write_buf(nxpdev->serdev, nxpdev->fw->data + in nxp_recv_fw_req_v1()
816 nxpdev->fw_dnld_v1_offset, len); in nxp_recv_fw_req_v1()
817 nxpdev->fw_v1_sent_bytes = len; in nxp_recv_fw_req_v1()
842 nxpdev->boot_reg_offset = 1; in nxp_get_fw_name_from_chipid()
875 chip_id = le16_to_cpu(req->chip_id); in nxp_recv_chip_ver_v3()
876 loader_ver = req->loader_ver; in nxp_recv_chip_ver_v3()
897 if (!req || !nxpdev->fw) in nxp_recv_fw_req_v3()
902 len = __le16_to_cpu(req->len); in nxp_recv_fw_req_v3()
904 if (!nxpdev->timeout_changed) { in nxp_recv_fw_req_v3()
905 nxpdev->timeout_changed = nxp_fw_change_timeout(hdev, len); in nxp_recv_fw_req_v3()
909 if (!nxpdev->baudrate_changed) { in nxp_recv_fw_req_v3()
910 nxpdev->baudrate_changed = nxp_fw_change_baudrate(hdev, len); in nxp_recv_fw_req_v3()
911 if (nxpdev->baudrate_changed) { in nxp_recv_fw_req_v3()
912 serdev_device_set_baudrate(nxpdev->serdev, in nxp_recv_fw_req_v3()
914 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_recv_fw_req_v3()
915 nxpdev->current_baudrate = HCI_NXP_SEC_BAUDRATE; in nxp_recv_fw_req_v3()
920 if (req->len == 0) { in nxp_recv_fw_req_v3()
921 bt_dev_dbg(hdev, "FW Downloaded Successfully: %zu bytes", in nxp_recv_fw_req_v3()
922 nxpdev->fw->size); in nxp_recv_fw_req_v3()
923 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_recv_fw_req_v3()
924 wake_up_interruptible(&nxpdev->fw_dnld_done_wait_q); in nxp_recv_fw_req_v3()
927 if (req->error) in nxp_recv_fw_req_v3()
928 bt_dev_dbg(hdev, "FW Download received err 0x%02x from chip", in nxp_recv_fw_req_v3()
929 req->error); in nxp_recv_fw_req_v3()
931 offset = __le32_to_cpu(req->offset); in nxp_recv_fw_req_v3()
932 if (offset < nxpdev->fw_v3_offset_correction) { in nxp_recv_fw_req_v3()
934 * FW is out of sync and needs a power cycle. in nxp_recv_fw_req_v3()
936 bt_dev_err(hdev, "Something went wrong during FW download"); in nxp_recv_fw_req_v3()
941 serdev_device_write_buf(nxpdev->serdev, nxpdev->fw->data + offset - in nxp_recv_fw_req_v3()
942 nxpdev->fw_v3_offset_correction, len); in nxp_recv_fw_req_v3()
952 __le32 new_baudrate = __cpu_to_le32(nxpdev->new_baudrate); in nxp_set_baudrate_cmd()
953 struct ps_data *psdata = &nxpdev->psdata; in nxp_set_baudrate_cmd()
962 bt_dev_err(hdev, "Setting baudrate failed (%ld)", PTR_ERR(skb)); in nxp_set_baudrate_cmd()
969 serdev_device_set_baudrate(nxpdev->serdev, nxpdev->new_baudrate); in nxp_set_baudrate_cmd()
970 nxpdev->current_baudrate = nxpdev->new_baudrate; in nxp_set_baudrate_cmd()
972 bt_dev_dbg(hdev, "Set baudrate response: status=%d, baudrate=%d", in nxp_set_baudrate_cmd()
973 *status, nxpdev->new_baudrate); in nxp_set_baudrate_cmd()
982 serdev_device_set_baudrate(nxpdev->serdev, HCI_NXP_PRI_BAUDRATE); in nxp_check_boot_sign()
983 if (test_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state)) in nxp_check_boot_sign()
984 serdev_device_set_flow_control(nxpdev->serdev, false); in nxp_check_boot_sign()
986 serdev_device_set_flow_control(nxpdev->serdev, true); in nxp_check_boot_sign()
987 set_bit(BTNXPUART_CHECK_BOOT_SIGNATURE, &nxpdev->tx_state); in nxp_check_boot_sign()
989 return wait_event_interruptible_timeout(nxpdev->check_boot_sign_wait_q, in nxp_check_boot_sign()
991 &nxpdev->tx_state), in nxp_check_boot_sign()
1003 return -ENOMEM; in nxp_set_ind_reset()
1019 bt_dev_dbg(hdev, "Need FW Download."); in nxp_setup()
1024 bt_dev_dbg(hdev, "FW already running."); in nxp_setup()
1025 clear_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_setup()
1028 serdev_device_set_baudrate(nxpdev->serdev, nxpdev->fw_init_baudrate); in nxp_setup()
1029 nxpdev->current_baudrate = nxpdev->fw_init_baudrate; in nxp_setup()
1031 if (nxpdev->current_baudrate != HCI_NXP_SEC_BAUDRATE) { in nxp_setup()
1032 nxpdev->new_baudrate = HCI_NXP_SEC_BAUDRATE; in nxp_setup()
1038 if (test_and_clear_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state)) in nxp_setup()
1050 set_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state); in nxp_hw_err()
1065 if (test_bit(BTNXPUART_IR_IN_PROGRESS, &nxpdev->tx_state)) { in nxp_shutdown()
1072 serdev_device_set_flow_control(nxpdev->serdev, false); in nxp_shutdown()
1073 set_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_shutdown()
1087 skb_queue_tail(&nxpdev->txq, skb); in btnxpuart_queue_skb()
1095 struct ps_data *psdata = &nxpdev->psdata; in nxp_enqueue()
1102 * driver flags accordingly and ask driver to re-send the command to FW. in nxp_enqueue()
1107 if (bt_cb(skb)->pkt_type == HCI_COMMAND_PKT && !psdata->driver_sent_cmd) { in nxp_enqueue()
1108 hdr = (struct hci_command_hdr *)skb->data; in nxp_enqueue()
1109 if (hdr->plen != (skb->len - HCI_COMMAND_HDR_SIZE)) in nxp_enqueue()
1112 switch (__le16_to_cpu(hdr->opcode)) { in nxp_enqueue()
1114 if (hdr->plen == sizeof(ps_parm)) { in nxp_enqueue()
1115 memcpy(&ps_parm, skb->data + HCI_COMMAND_HDR_SIZE, hdr->plen); in nxp_enqueue()
1117 psdata->target_ps_mode = PS_MODE_ENABLE; in nxp_enqueue()
1119 psdata->target_ps_mode = PS_MODE_DISABLE; in nxp_enqueue()
1120 psdata->c2h_ps_interval = __le16_to_cpu(ps_parm.c2h_ps_interval); in nxp_enqueue()
1126 if (hdr->plen == sizeof(wakeup_parm)) { in nxp_enqueue()
1127 memcpy(&wakeup_parm, skb->data + HCI_COMMAND_HDR_SIZE, hdr->plen); in nxp_enqueue()
1128 psdata->c2h_wakeupmode = wakeup_parm.c2h_wakeupmode; in nxp_enqueue()
1129 psdata->c2h_wakeup_gpio = wakeup_parm.c2h_wakeup_gpio; in nxp_enqueue()
1130 psdata->h2c_wakeup_gpio = wakeup_parm.h2c_wakeup_gpio; in nxp_enqueue()
1133 psdata->h2c_wakeupmode = WAKEUP_METHOD_DTR; in nxp_enqueue()
1137 psdata->h2c_wakeupmode = WAKEUP_METHOD_BREAK; in nxp_enqueue()
1145 if (hdr->plen == sizeof(baudrate_parm)) { in nxp_enqueue()
1146 memcpy(&baudrate_parm, skb->data + HCI_COMMAND_HDR_SIZE, hdr->plen); in nxp_enqueue()
1147 nxpdev->new_baudrate = __le32_to_cpu(baudrate_parm); in nxp_enqueue()
1153 if (hdr->plen == 1) { in nxp_enqueue()
1176 return skb_dequeue(&nxpdev->txq); in nxp_dequeue()
1184 struct serdev_device *serdev = nxpdev->serdev; in btnxpuart_tx_work()
1185 struct hci_dev *hdev = nxpdev->hdev; in btnxpuart_tx_work()
1190 len = serdev_device_write_buf(serdev, skb->data, skb->len); in btnxpuart_tx_work()
1191 hdev->stat.byte_tx += len; in btnxpuart_tx_work()
1194 if (skb->len > 0) { in btnxpuart_tx_work()
1195 skb_queue_head(&nxpdev->txq, skb); in btnxpuart_tx_work()
1201 hdev->stat.cmd_tx++; in btnxpuart_tx_work()
1204 hdev->stat.acl_tx++; in btnxpuart_tx_work()
1207 hdev->stat.sco_tx++; in btnxpuart_tx_work()
1213 clear_bit(BTNXPUART_TX_STATE_ACTIVE, &nxpdev->tx_state); in btnxpuart_tx_work()
1221 err = serdev_device_open(nxpdev->serdev); in btnxpuart_open()
1224 dev_name(&nxpdev->serdev->dev)); in btnxpuart_open()
1226 set_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state); in btnxpuart_open()
1236 serdev_device_close(nxpdev->serdev); in btnxpuart_close()
1237 clear_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state); in btnxpuart_close()
1246 serdev_device_write_flush(nxpdev->serdev); in btnxpuart_flush()
1247 skb_queue_purge(&nxpdev->txq); in btnxpuart_flush()
1249 cancel_work_sync(&nxpdev->tx_work); in btnxpuart_flush()
1251 kfree_skb(nxpdev->rx_skb); in btnxpuart_flush()
1252 nxpdev->rx_skb = NULL; in btnxpuart_flush()
1274 nxpdev->rx_skb = h4_recv_buf(nxpdev->hdev, nxpdev->rx_skb, data, count, in btnxpuart_receive_buf()
1276 if (IS_ERR(nxpdev->rx_skb)) { in btnxpuart_receive_buf()
1277 int err = PTR_ERR(nxpdev->rx_skb); in btnxpuart_receive_buf()
1278 /* Safe to ignore out-of-sync bootloader signatures */ in btnxpuart_receive_buf()
1280 bt_dev_err(nxpdev->hdev, "Frame reassembly failed (%d)", err); in btnxpuart_receive_buf()
1281 nxpdev->rx_skb = NULL; in btnxpuart_receive_buf()
1285 nxpdev->hdev->stat.byte_rx += count; in btnxpuart_receive_buf()
1304 nxpdev = devm_kzalloc(&serdev->dev, sizeof(*nxpdev), GFP_KERNEL); in nxp_serdev_probe()
1306 return -ENOMEM; in nxp_serdev_probe()
1308 nxpdev->nxp_data = (struct btnxpuart_data *)device_get_match_data(&serdev->dev); in nxp_serdev_probe()
1310 nxpdev->serdev = serdev; in nxp_serdev_probe()
1315 INIT_WORK(&nxpdev->tx_work, btnxpuart_tx_work); in nxp_serdev_probe()
1316 skb_queue_head_init(&nxpdev->txq); in nxp_serdev_probe()
1318 init_waitqueue_head(&nxpdev->fw_dnld_done_wait_q); in nxp_serdev_probe()
1319 init_waitqueue_head(&nxpdev->check_boot_sign_wait_q); in nxp_serdev_probe()
1321 device_property_read_u32(&nxpdev->serdev->dev, "fw-init-baudrate", in nxp_serdev_probe()
1322 &nxpdev->fw_init_baudrate); in nxp_serdev_probe()
1323 if (!nxpdev->fw_init_baudrate) in nxp_serdev_probe()
1324 nxpdev->fw_init_baudrate = FW_INIT_BAUDRATE; in nxp_serdev_probe()
1326 set_bit(BTNXPUART_FW_DOWNLOADING, &nxpdev->tx_state); in nxp_serdev_probe()
1333 dev_err(&serdev->dev, "Can't allocate HCI device\n"); in nxp_serdev_probe()
1334 return -ENOMEM; in nxp_serdev_probe()
1337 nxpdev->hdev = hdev; in nxp_serdev_probe()
1339 hdev->bus = HCI_UART; in nxp_serdev_probe()
1342 hdev->manufacturer = MANUFACTURER_NXP; in nxp_serdev_probe()
1343 hdev->open = btnxpuart_open; in nxp_serdev_probe()
1344 hdev->close = btnxpuart_close; in nxp_serdev_probe()
1345 hdev->flush = btnxpuart_flush; in nxp_serdev_probe()
1346 hdev->setup = nxp_setup; in nxp_serdev_probe()
1347 hdev->send = nxp_enqueue; in nxp_serdev_probe()
1348 hdev->hw_error = nxp_hw_err; in nxp_serdev_probe()
1349 hdev->shutdown = nxp_shutdown; in nxp_serdev_probe()
1350 SET_HCIDEV_DEV(hdev, &serdev->dev); in nxp_serdev_probe()
1353 dev_err(&serdev->dev, "Can't register HCI device\n"); in nxp_serdev_probe()
1355 return -ENODEV; in nxp_serdev_probe()
1366 struct hci_dev *hdev = nxpdev->hdev; in nxp_serdev_remove()
1368 /* Restore FW baudrate to fw_init_baudrate if changed. in nxp_serdev_remove()
1369 * This will ensure FW baudrate is in sync with in nxp_serdev_remove()
1370 * driver baudrate in case this driver is re-inserted. in nxp_serdev_remove()
1372 if (nxpdev->current_baudrate != nxpdev->fw_init_baudrate) { in nxp_serdev_remove()
1373 nxpdev->new_baudrate = nxpdev->fw_init_baudrate; in nxp_serdev_remove()
1393 { .compatible = "nxp,88w8987-bt", .data = &w8987_data },
1394 { .compatible = "nxp,88w8997-bt", .data = &w8997_data },