Lines Matching refs:data

193 static int btintel_pcie_setup_dbgc(struct btintel_pcie_data *data)  in btintel_pcie_setup_dbgc()  argument
199 data->dbgc.count = BTINTEL_PCIE_DBGC_BUFFER_COUNT; in btintel_pcie_setup_dbgc()
200 data->dbgc.bufs = devm_kcalloc(&data->pdev->dev, data->dbgc.count, in btintel_pcie_setup_dbgc()
202 if (!data->dbgc.bufs) in btintel_pcie_setup_dbgc()
205 data->dbgc.buf_v_addr = dmam_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_dbgc()
206 data->dbgc.count * in btintel_pcie_setup_dbgc()
208 &data->dbgc.buf_p_addr, in btintel_pcie_setup_dbgc()
210 if (!data->dbgc.buf_v_addr) in btintel_pcie_setup_dbgc()
213 data->dbgc.frag_v_addr = dmam_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_dbgc()
215 &data->dbgc.frag_p_addr, in btintel_pcie_setup_dbgc()
217 if (!data->dbgc.frag_v_addr) in btintel_pcie_setup_dbgc()
220 data->dbgc.frag_size = sizeof(struct btintel_pcie_dbgc_ctxt); in btintel_pcie_setup_dbgc()
227 for (i = 0; i < data->dbgc.count; i++) { in btintel_pcie_setup_dbgc()
228 buf = &data->dbgc.bufs[i]; in btintel_pcie_setup_dbgc()
229 buf->data_p_addr = data->dbgc.buf_p_addr + i * BTINTEL_PCIE_DBGC_BUFFER_SIZE; in btintel_pcie_setup_dbgc()
230 buf->data = data->dbgc.buf_v_addr + i * BTINTEL_PCIE_DBGC_BUFFER_SIZE; in btintel_pcie_setup_dbgc()
236 memcpy(data->dbgc.frag_v_addr, &db_frag, sizeof(db_frag)); in btintel_pcie_setup_dbgc()
267 static void btintel_pcie_set_tx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_tx_db() argument
274 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_tx_db()
295 memcpy(buf->data, skb->data, tfd->size); in btintel_pcie_prepare_tx()
300 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_debug_registers() local
314 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_dump_debug_registers()
318 data->boot_stage_cache = reg; in btintel_pcie_dump_debug_registers()
323 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_STATUS_REG); in btintel_pcie_dump_debug_registers()
328 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_CONTROL_REG); in btintel_pcie_dump_debug_registers()
333 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG); in btintel_pcie_dump_debug_registers()
339 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MBOX_STATUS_REG); in btintel_pcie_dump_debug_registers()
343 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
351 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
359 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
367 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
374 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_dump_debug_registers()
375 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_dump_debug_registers()
380 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_dump_debug_registers()
381 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_dump_debug_registers()
391 static int btintel_pcie_send_sync(struct btintel_pcie_data *data, in btintel_pcie_send_sync() argument
398 struct hci_dev *hdev = data->hdev; in btintel_pcie_send_sync()
400 struct txq *txq = &data->txq; in btintel_pcie_send_sync()
402 tfd_index = data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_send_sync()
414 data->gp0_received = false; in btintel_pcie_send_sync()
415 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_send_sync()
416 data->alive_intr_ctxt = in btintel_pcie_send_sync()
419 bt_dev_dbg(data->hdev, "sending cmd: 0x%4.4x alive context changed: %s -> %s", in btintel_pcie_send_sync()
421 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_sync()
433 data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM] = tfd_index; in btintel_pcie_send_sync()
436 data->tx_wait_done = false; in btintel_pcie_send_sync()
439 btintel_pcie_set_tx_db(data, tfd_index); in btintel_pcie_send_sync()
442 ret = wait_event_timeout(data->tx_wait_q, data->tx_wait_done, in btintel_pcie_send_sync()
445 bt_dev_err(data->hdev, "Timeout (%u ms) on tx completion", in btintel_pcie_send_sync()
447 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_send_sync()
452 ret = wait_event_timeout(data->gp0_wait_q, in btintel_pcie_send_sync()
453 data->gp0_received, in btintel_pcie_send_sync()
459 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_sync()
469 static void btintel_pcie_set_rx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_rx_db() argument
476 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_rx_db()
498 static int btintel_pcie_submit_rx(struct btintel_pcie_data *data) in btintel_pcie_submit_rx() argument
501 struct rxq *rxq = &data->rxq; in btintel_pcie_submit_rx()
503 frbd_index = data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_submit_rx()
514 data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM] = frbd_index; in btintel_pcie_submit_rx()
515 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_submit_rx()
518 btintel_pcie_set_rx_db(data, frbd_index); in btintel_pcie_submit_rx()
523 static int btintel_pcie_start_rx(struct btintel_pcie_data *data) in btintel_pcie_start_rx() argument
526 struct rxq *rxq = &data->rxq; in btintel_pcie_start_rx()
533 ret = btintel_pcie_submit_rx(data); in btintel_pcie_start_rx()
541 static void btintel_pcie_reset_ia(struct btintel_pcie_data *data) in btintel_pcie_reset_ia() argument
543 memset(data->ia.tr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
544 memset(data->ia.tr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
545 memset(data->ia.cr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
546 memset(data->ia.cr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
549 static int btintel_pcie_reset_bt(struct btintel_pcie_data *data) in btintel_pcie_reset_bt() argument
554 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
561 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
564 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
572 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
578 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
581 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
582 bt_dev_dbg(data->hdev, "csr register after reset: 0x%8.8x", reg); in btintel_pcie_reset_bt()
584 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_reset_bt()
592 static void btintel_pcie_mac_init(struct btintel_pcie_data *data) in btintel_pcie_mac_init() argument
597 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_mac_init()
603 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_mac_init()
606 static int btintel_pcie_get_mac_access(struct btintel_pcie_data *data) in btintel_pcie_get_mac_access() argument
611 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_get_mac_access()
615 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_get_mac_access()
619 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_get_mac_access()
630 static void btintel_pcie_release_mac_access(struct btintel_pcie_data *data) in btintel_pcie_release_mac_access() argument
634 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_release_mac_access()
638 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_release_mac_access()
643 void *data, size_t size) in btintel_pcie_copy_tlv() argument
650 memcpy(tlv->val, data, tlv->len); in btintel_pcie_copy_tlv()
654 static int btintel_pcie_read_dram_buffers(struct btintel_pcie_data *data) in btintel_pcie_read_dram_buffers() argument
658 struct btintel_pcie_dbgc *dbgc = &data->dbgc; in btintel_pcie_read_dram_buffers()
659 struct hci_dev *hdev = data->hdev; in btintel_pcie_read_dram_buffers()
673 hw_variant = INTEL_HW_VARIANT(data->cnvi); in btintel_pcie_read_dram_buffers()
692 wr_ptr_status = btintel_pcie_rd_dev_mem(data, status_reg); in btintel_pcie_read_dram_buffers()
693 data->dmp_hdr.wrap_ctr = btintel_pcie_rd_dev_mem(data, wrap_reg); in btintel_pcie_read_dram_buffers()
705 data->dmp_hdr.write_ptr = prev_size + offset; in btintel_pcie_read_dram_buffers()
711 data->dmp_hdr.driver_name); in btintel_pcie_read_dram_buffers()
721 2000 + (data->dmp_hdr.fw_timestamp >> 8), in btintel_pcie_read_dram_buffers()
722 data->dmp_hdr.fw_timestamp & 0xff, data->dmp_hdr.fw_build_type, in btintel_pcie_read_dram_buffers()
723 data->dmp_hdr.fw_build_num); in btintel_pcie_read_dram_buffers()
725 data_len = sizeof(*tlv) + sizeof(data->dmp_hdr.cnvi_bt) + in btintel_pcie_read_dram_buffers()
726 sizeof(*tlv) + sizeof(data->dmp_hdr.write_ptr) + in btintel_pcie_read_dram_buffers()
727 sizeof(*tlv) + sizeof(data->dmp_hdr.wrap_ctr) + in btintel_pcie_read_dram_buffers()
728 sizeof(*tlv) + sizeof(data->dmp_hdr.trigger_reason) + in btintel_pcie_read_dram_buffers()
729 sizeof(*tlv) + sizeof(data->dmp_hdr.fw_git_sha1) + in btintel_pcie_read_dram_buffers()
730 sizeof(*tlv) + sizeof(data->dmp_hdr.cnvr_top) + in btintel_pcie_read_dram_buffers()
731 sizeof(*tlv) + sizeof(data->dmp_hdr.cnvi_top) + in btintel_pcie_read_dram_buffers()
737 if (data->dmp_hdr.event_type && data->dmp_hdr.event_id) { in btintel_pcie_read_dram_buffers()
738 data_len += sizeof(*tlv) + sizeof(data->dmp_hdr.event_type); in btintel_pcie_read_dram_buffers()
739 data_len += sizeof(*tlv) + sizeof(data->dmp_hdr.event_id); in btintel_pcie_read_dram_buffers()
770 p = btintel_pcie_copy_tlv(p, BTINTEL_CNVI_BT, &data->dmp_hdr.cnvi_bt, in btintel_pcie_read_dram_buffers()
771 sizeof(data->dmp_hdr.cnvi_bt)); in btintel_pcie_read_dram_buffers()
772 p = btintel_pcie_copy_tlv(p, BTINTEL_WRITE_PTR, &data->dmp_hdr.write_ptr, in btintel_pcie_read_dram_buffers()
773 sizeof(data->dmp_hdr.write_ptr)); in btintel_pcie_read_dram_buffers()
774 p = btintel_pcie_copy_tlv(p, BTINTEL_WRAP_CTR, &data->dmp_hdr.wrap_ctr, in btintel_pcie_read_dram_buffers()
775 sizeof(data->dmp_hdr.wrap_ctr)); in btintel_pcie_read_dram_buffers()
776 p = btintel_pcie_copy_tlv(p, BTINTEL_TRIGGER_REASON, &data->dmp_hdr.trigger_reason, in btintel_pcie_read_dram_buffers()
777 sizeof(data->dmp_hdr.trigger_reason)); in btintel_pcie_read_dram_buffers()
778 p = btintel_pcie_copy_tlv(p, BTINTEL_FW_SHA, &data->dmp_hdr.fw_git_sha1, in btintel_pcie_read_dram_buffers()
779 sizeof(data->dmp_hdr.fw_git_sha1)); in btintel_pcie_read_dram_buffers()
780 p = btintel_pcie_copy_tlv(p, BTINTEL_CNVR_TOP, &data->dmp_hdr.cnvr_top, in btintel_pcie_read_dram_buffers()
781 sizeof(data->dmp_hdr.cnvr_top)); in btintel_pcie_read_dram_buffers()
782 p = btintel_pcie_copy_tlv(p, BTINTEL_CNVI_TOP, &data->dmp_hdr.cnvi_top, in btintel_pcie_read_dram_buffers()
783 sizeof(data->dmp_hdr.cnvi_top)); in btintel_pcie_read_dram_buffers()
785 if (data->dmp_hdr.event_type && data->dmp_hdr.event_id) { in btintel_pcie_read_dram_buffers()
787 &data->dmp_hdr.event_type, in btintel_pcie_read_dram_buffers()
788 sizeof(data->dmp_hdr.event_type)); in btintel_pcie_read_dram_buffers()
790 &data->dmp_hdr.event_id, in btintel_pcie_read_dram_buffers()
791 sizeof(data->dmp_hdr.event_id)); in btintel_pcie_read_dram_buffers()
792 data->dmp_hdr.event_type = 0; in btintel_pcie_read_dram_buffers()
793 data->dmp_hdr.event_id = 0; in btintel_pcie_read_dram_buffers()
796 memcpy(p, dbgc->bufs[0].data, dbgc->count * BTINTEL_PCIE_DBGC_BUFFER_SIZE); in btintel_pcie_read_dram_buffers()
803 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_traces() local
806 ret = btintel_pcie_get_mac_access(data); in btintel_pcie_dump_traces()
812 ret = btintel_pcie_read_dram_buffers(data); in btintel_pcie_dump_traces()
814 btintel_pcie_release_mac_access(data); in btintel_pcie_dump_traces()
831 static int btintel_pcie_enable_bt(struct btintel_pcie_data *data) in btintel_pcie_enable_bt() argument
836 data->gp0_received = false; in btintel_pcie_enable_bt()
839 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_LSB_REG, in btintel_pcie_enable_bt()
840 data->ci_p_addr & 0xffffffff); in btintel_pcie_enable_bt()
841 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG, in btintel_pcie_enable_bt()
842 (u64)data->ci_p_addr >> 32); in btintel_pcie_enable_bt()
849 if (btintel_pcie_is_blazariw(data->pdev)) in btintel_pcie_enable_bt()
855 data->boot_stage_cache = 0x0; in btintel_pcie_enable_bt()
858 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
865 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_enable_bt()
868 btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, in btintel_pcie_enable_bt()
871 btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
876 data->alive_intr_ctxt = BTINTEL_PCIE_ROM; in btintel_pcie_enable_bt()
877 err = wait_event_timeout(data->gp0_wait_q, data->gp0_received, in btintel_pcie_enable_bt()
883 if (~data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ROM) in btintel_pcie_enable_bt()
889 static inline bool btintel_pcie_in_op(struct btintel_pcie_data *data) in btintel_pcie_in_op() argument
891 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW; in btintel_pcie_in_op()
894 static inline bool btintel_pcie_in_iml(struct btintel_pcie_data *data) in btintel_pcie_in_iml() argument
896 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML && in btintel_pcie_in_iml()
897 !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW); in btintel_pcie_in_iml()
900 static inline bool btintel_pcie_in_d3(struct btintel_pcie_data *data) in btintel_pcie_in_d3() argument
902 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY; in btintel_pcie_in_d3()
905 static inline bool btintel_pcie_in_d0(struct btintel_pcie_data *data) in btintel_pcie_in_d0() argument
907 return !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY); in btintel_pcie_in_d0()
910 static inline bool btintel_pcie_in_device_halt(struct btintel_pcie_data *data) in btintel_pcie_in_device_halt() argument
912 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_DEVICE_HALTED; in btintel_pcie_in_device_halt()
915 static void btintel_pcie_wr_sleep_cntrl(struct btintel_pcie_data *data, in btintel_pcie_wr_sleep_cntrl() argument
918 bt_dev_dbg(data->hdev, "writing sleep_ctl_reg: 0x%8.8x", dxstate); in btintel_pcie_wr_sleep_cntrl()
919 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG, dxstate); in btintel_pcie_wr_sleep_cntrl()
922 static int btintel_pcie_read_device_mem(struct btintel_pcie_data *data, in btintel_pcie_read_device_mem() argument
929 err = btintel_pcie_get_mac_access(data); in btintel_pcie_read_device_mem()
931 bt_dev_err(data->hdev, "Failed to get mac access %d", err); in btintel_pcie_read_device_mem()
936 *val = btintel_pcie_rd_dev_mem(data, dev_addr); in btintel_pcie_read_device_mem()
938 btintel_pcie_release_mac_access(data); in btintel_pcie_read_device_mem()
943 static inline bool btintel_pcie_in_lockdown(struct btintel_pcie_data *data) in btintel_pcie_in_lockdown() argument
945 return (data->boot_stage_cache & in btintel_pcie_in_lockdown()
947 (data->boot_stage_cache & in btintel_pcie_in_lockdown()
951 static inline bool btintel_pcie_in_error(struct btintel_pcie_data *data) in btintel_pcie_in_error() argument
953 if (data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_DEVICE_WARNING) in btintel_pcie_in_error()
954 bt_dev_warn(data->hdev, "Controller device warning (boot_stage: 0x%8.8x)", in btintel_pcie_in_error()
955 data->boot_stage_cache); in btintel_pcie_in_error()
957 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ABORT_HANDLER; in btintel_pcie_in_error()
960 static void btintel_pcie_msix_gp1_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp1_handler() argument
962 bt_dev_err(data->hdev, "Received gp1 mailbox interrupt"); in btintel_pcie_msix_gp1_handler()
963 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp1_handler()
969 static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp0_handler() argument
978 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_msix_gp0_handler()
979 if (reg != data->boot_stage_cache) in btintel_pcie_msix_gp0_handler()
980 data->boot_stage_cache = reg; in btintel_pcie_msix_gp0_handler()
982 bt_dev_dbg(data->hdev, "Alive context: %s old_boot_stage: 0x%8.8x new_boot_stage: 0x%8.8x", in btintel_pcie_msix_gp0_handler()
983 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt), in btintel_pcie_msix_gp0_handler()
984 data->boot_stage_cache, reg); in btintel_pcie_msix_gp0_handler()
985 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IMG_RESPONSE_REG); in btintel_pcie_msix_gp0_handler()
986 if (reg != data->img_resp_cache) in btintel_pcie_msix_gp0_handler()
987 data->img_resp_cache = reg; in btintel_pcie_msix_gp0_handler()
989 if (btintel_pcie_in_error(data)) { in btintel_pcie_msix_gp0_handler()
990 bt_dev_err(data->hdev, "Controller in error state (boot_stage: 0x%8.8x)", in btintel_pcie_msix_gp0_handler()
991 data->boot_stage_cache); in btintel_pcie_msix_gp0_handler()
992 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp0_handler()
996 if (btintel_pcie_in_lockdown(data)) { in btintel_pcie_msix_gp0_handler()
997 bt_dev_err(data->hdev, "Controller in lockdown state"); in btintel_pcie_msix_gp0_handler()
998 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp0_handler()
1002 data->gp0_received = true; in btintel_pcie_msix_gp0_handler()
1004 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_msix_gp0_handler()
1008 switch (data->alive_intr_ctxt) { in btintel_pcie_msix_gp0_handler()
1010 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
1019 if (btintel_pcie_in_op(data)) { in btintel_pcie_msix_gp0_handler()
1025 if (btintel_pcie_in_iml(data)) { in btintel_pcie_msix_gp0_handler()
1028 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
1033 if (btintel_test_and_clear_flag(data->hdev, INTEL_WAIT_FOR_D0)) { in btintel_pcie_msix_gp0_handler()
1034 btintel_wake_up_flag(data->hdev, INTEL_WAIT_FOR_D0); in btintel_pcie_msix_gp0_handler()
1035 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
1039 if (btintel_pcie_in_d3(data)) { in btintel_pcie_msix_gp0_handler()
1040 data->alive_intr_ctxt = BTINTEL_PCIE_D3; in btintel_pcie_msix_gp0_handler()
1046 if (btintel_pcie_in_d0(data)) { in btintel_pcie_msix_gp0_handler()
1047 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
1054 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
1059 bt_dev_err(data->hdev, "Unknown state: 0x%2.2x", in btintel_pcie_msix_gp0_handler()
1060 data->alive_intr_ctxt); in btintel_pcie_msix_gp0_handler()
1065 btintel_pcie_reset_ia(data); in btintel_pcie_msix_gp0_handler()
1066 btintel_pcie_start_rx(data); in btintel_pcie_msix_gp0_handler()
1070 bt_dev_dbg(data->hdev, "wake up gp0 wait_q"); in btintel_pcie_msix_gp0_handler()
1071 wake_up(&data->gp0_wait_q); in btintel_pcie_msix_gp0_handler()
1074 if (old_ctxt != data->alive_intr_ctxt) in btintel_pcie_msix_gp0_handler()
1075 bt_dev_dbg(data->hdev, "alive context changed: %s -> %s", in btintel_pcie_msix_gp0_handler()
1077 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_msix_gp0_handler()
1082 static void btintel_pcie_msix_tx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_tx_handle() argument
1088 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
1089 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
1094 txq = &data->txq; in btintel_pcie_msix_tx_handle()
1097 data->tx_wait_done = true; in btintel_pcie_msix_tx_handle()
1098 wake_up(&data->tx_wait_q); in btintel_pcie_msix_tx_handle()
1106 data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] = cr_tia; in btintel_pcie_msix_tx_handle()
1107 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_TXQ_NUM); in btintel_pcie_msix_tx_handle()
1113 struct hci_event_hdr *hdr = (void *)skb->data; in btintel_pcie_recv_event()
1114 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_recv_event() local
1118 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btintel_pcie_recv_event()
1122 switch (skb->data[2]) { in btintel_pcie_recv_event()
1134 if (btintel_pcie_in_op(data)) { in btintel_pcie_recv_event()
1135 btintel_pcie_wr_sleep_cntrl(data, BTINTEL_PCIE_STATE_D0); in btintel_pcie_recv_event()
1136 data->alive_intr_ctxt = BTINTEL_PCIE_INTEL_HCI_RESET2; in btintel_pcie_recv_event()
1141 if (btintel_pcie_in_iml(data)) { in btintel_pcie_recv_event()
1150 if (btintel_test_and_clear_flag(data->hdev, in btintel_pcie_recv_event()
1152 btintel_wake_up_flag(data->hdev, in btintel_pcie_recv_event()
1172 if (skb->data[2] == 0x97) { in btintel_pcie_recv_event()
1184 static int btintel_pcie_recv_frame(struct btintel_pcie_data *data, in btintel_pcie_recv_frame() argument
1192 struct hci_dev *hdev = data->hdev; in btintel_pcie_recv_frame()
1194 spin_lock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
1283 spin_unlock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
1288 static void btintel_pcie_read_hwexp(struct btintel_pcie_data *data) in btintel_pcie_read_hwexp() argument
1304 switch (data->dmp_hdr.cnvi_top & 0xfff) { in btintel_pcie_read_hwexp()
1308 if (INTEL_CNVX_TOP_STEP(data->dmp_hdr.cnvi_top) != 0x01) in btintel_pcie_read_hwexp()
1323 bt_dev_err(data->hdev, "Unsupported cnvi 0x%8.8x", data->dmp_hdr.cnvi_top); in btintel_pcie_read_hwexp()
1331 btintel_pcie_mac_init(data); in btintel_pcie_read_hwexp()
1333 err = btintel_pcie_read_device_mem(data, buf, addr, len); in btintel_pcie_read_hwexp()
1339 bt_dev_err(data->hdev, "Invalid exception dump signature: 0x%8.8x", in btintel_pcie_read_hwexp()
1344 snprintf(prefix, sizeof(prefix), "Bluetooth: %s: ", bt_dev_name(data->hdev)); in btintel_pcie_read_hwexp()
1355 bt_dev_dbg(data->hdev, "Invalid TLV type 0"); in btintel_pcie_read_hwexp()
1372 bt_dev_dbg(data->hdev, "TLV packet length: %u", pkt_len); in btintel_pcie_read_hwexp()
1389 btintel_pcie_recv_frame(data, skb); in btintel_pcie_read_hwexp()
1396 static int btintel_pcie_dump_fwtrigger_event(struct btintel_pcie_data *data) in btintel_pcie_dump_fwtrigger_event() argument
1404 if (!data->debug_evt_size || !data->debug_evt_addr) in btintel_pcie_dump_fwtrigger_event()
1407 len = data->debug_evt_size; in btintel_pcie_dump_fwtrigger_event()
1412 bt_dev_err(data->hdev, "Invalid FW trigger data size (%u bytes)", len); in btintel_pcie_dump_fwtrigger_event()
1420 btintel_pcie_mac_init(data); in btintel_pcie_dump_fwtrigger_event()
1422 err = btintel_pcie_read_device_mem(data, buf, data->debug_evt_addr, in btintel_pcie_dump_fwtrigger_event()
1428 data->dmp_hdr.event_type = evt->event_type; in btintel_pcie_dump_fwtrigger_event()
1429 data->dmp_hdr.event_id = le16_to_cpu(evt->event_id); in btintel_pcie_dump_fwtrigger_event()
1431 bt_dev_dbg(data->hdev, "event type: 0x%2.2x event id: 0x%4.4x len: %u", in btintel_pcie_dump_fwtrigger_event()
1432 data->dmp_hdr.event_type, data->dmp_hdr.event_id, len); in btintel_pcie_dump_fwtrigger_event()
1441 hci_recv_diag(data->hdev, skb); in btintel_pcie_dump_fwtrigger_event()
1461 static bool btintel_pcie_queue_coredump(struct btintel_pcie_data *data, in btintel_pcie_queue_coredump() argument
1464 if (test_and_set_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) in btintel_pcie_queue_coredump()
1467 data->dmp_hdr.trigger_reason = trigger_reason; in btintel_pcie_queue_coredump()
1469 if (queue_work(data->dump_workqueue, &data->coredump_work)) in btintel_pcie_queue_coredump()
1475 clear_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags); in btintel_pcie_queue_coredump()
1479 static void btintel_pcie_msix_fw_trigger_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_fw_trigger_handler() argument
1481 bt_dev_dbg(data->hdev, "Received firmware smart trigger cause"); in btintel_pcie_msix_fw_trigger_handler()
1487 &data->flags)) in btintel_pcie_msix_fw_trigger_handler()
1490 if (!queue_work(data->dump_workqueue, &data->fwtrigger_work)) { in btintel_pcie_msix_fw_trigger_handler()
1491 clear_bit(BTINTEL_PCIE_FWTRIGGER_DUMP_INPROGRESS, &data->flags); in btintel_pcie_msix_fw_trigger_handler()
1498 btintel_pcie_queue_coredump(data, BTINTEL_PCIE_TRIGGER_REASON_FW_ASSERT); in btintel_pcie_msix_fw_trigger_handler()
1501 static void btintel_pcie_msix_hw_exp_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_hw_exp_handler() argument
1503 bt_dev_err(data->hdev, "Received hw exception interrupt"); in btintel_pcie_msix_hw_exp_handler()
1510 if (test_and_set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1517 btintel_pcie_queue_coredump(data, BTINTEL_PCIE_TRIGGER_REASON_FW_ASSERT); in btintel_pcie_msix_hw_exp_handler()
1519 queue_work(data->dump_workqueue, &data->hwexp_work); in btintel_pcie_msix_hw_exp_handler()
1524 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_coredump_worker() local
1530 if (!data->hdev) in btintel_pcie_coredump_worker()
1533 btintel_pcie_dump_traces(data->hdev); in btintel_pcie_coredump_worker()
1538 clear_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags); in btintel_pcie_coredump_worker()
1543 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_hwexp_worker() local
1546 if (!data->hdev) in btintel_pcie_hwexp_worker()
1559 btintel_pcie_read_hwexp(data); in btintel_pcie_hwexp_worker()
1564 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_fwtrigger_worker() local
1568 if (!data->hdev) in btintel_pcie_fwtrigger_worker()
1571 err = btintel_pcie_dump_fwtrigger_event(data); in btintel_pcie_fwtrigger_worker()
1573 bt_dev_warn(data->hdev, "failed to log fwtrigger event"); in btintel_pcie_fwtrigger_worker()
1576 clear_bit(BTINTEL_PCIE_FWTRIGGER_DUMP_INPROGRESS, &data->flags); in btintel_pcie_fwtrigger_worker()
1581 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_rx_work() local
1586 while ((skb = skb_dequeue(&data->rx_skb_q))) { in btintel_pcie_rx_work()
1587 btintel_pcie_recv_frame(data, skb); in btintel_pcie_rx_work()
1592 static int btintel_pcie_submit_rx_work(struct btintel_pcie_data *data, u8 status, in btintel_pcie_submit_rx_work() argument
1615 skb_queue_tail(&data->rx_skb_q, skb); in btintel_pcie_submit_rx_work()
1616 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_submit_rx_work()
1619 ret = btintel_pcie_submit_rx(data); in btintel_pcie_submit_rx_work()
1625 static void btintel_pcie_msix_rx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_rx_handle() argument
1632 struct hci_dev *hdev = data->hdev; in btintel_pcie_msix_rx_handle()
1634 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
1635 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
1643 rxq = &data->rxq; in btintel_pcie_msix_rx_handle()
1650 ipc_print_urbd1(data->hdev, urbd1, cr_tia); in btintel_pcie_msix_rx_handle()
1659 ret = btintel_pcie_submit_rx_work(data, urbd1->status, in btintel_pcie_msix_rx_handle()
1660 buf->data); in btintel_pcie_msix_rx_handle()
1667 data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM] = cr_tia; in btintel_pcie_msix_rx_handle()
1668 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_msix_rx_handle()
1672 static inline bool btintel_pcie_is_rxq_empty(struct btintel_pcie_data *data) in btintel_pcie_is_rxq_empty() argument
1674 return data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM] == data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_is_rxq_empty()
1677 static inline bool btintel_pcie_is_txackq_empty(struct btintel_pcie_data *data) in btintel_pcie_is_txackq_empty() argument
1679 return data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] == data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_is_txackq_empty()
1685 struct btintel_pcie_data *data = btintel_pcie_get_data(entry); in btintel_pcie_irq_msix_handler() local
1688 spin_lock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
1689 intr_fh = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES); in btintel_pcie_irq_msix_handler()
1690 intr_hw = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES); in btintel_pcie_irq_msix_handler()
1693 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES, intr_fh); in btintel_pcie_irq_msix_handler()
1694 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES, intr_hw); in btintel_pcie_irq_msix_handler()
1695 spin_unlock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
1704 btintel_pcie_msix_hw_exp_handler(data); in btintel_pcie_irq_msix_handler()
1707 btintel_pcie_msix_gp1_handler(data); in btintel_pcie_irq_msix_handler()
1712 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
1713 if (!btintel_pcie_is_rxq_empty(data)) in btintel_pcie_irq_msix_handler()
1714 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
1719 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
1720 if (!btintel_pcie_is_txackq_empty(data)) in btintel_pcie_irq_msix_handler()
1721 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
1725 btintel_pcie_msix_fw_trigger_handler(data); in btintel_pcie_irq_msix_handler()
1731 btintel_pcie_msix_gp0_handler(data); in btintel_pcie_irq_msix_handler()
1741 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_AUTOMASK_ST, in btintel_pcie_irq_msix_handler()
1750 static int btintel_pcie_setup_irq(struct btintel_pcie_data *data) in btintel_pcie_setup_irq() argument
1756 data->msix_entries[i].entry = i; in btintel_pcie_setup_irq()
1758 num_irqs = pci_alloc_irq_vectors(data->pdev, BTINTEL_PCIE_MSIX_VEC_MIN, in btintel_pcie_setup_irq()
1763 data->alloc_vecs = num_irqs; in btintel_pcie_setup_irq()
1764 data->msix_enabled = 1; in btintel_pcie_setup_irq()
1765 data->def_irq = 0; in btintel_pcie_setup_irq()
1768 for (i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_setup_irq()
1771 msix_entry = &data->msix_entries[i]; in btintel_pcie_setup_irq()
1772 msix_entry->vector = pci_irq_vector(data->pdev, i); in btintel_pcie_setup_irq()
1774 err = devm_request_threaded_irq(&data->pdev->dev, in btintel_pcie_setup_irq()
1782 pci_free_irq_vectors(data->pdev); in btintel_pcie_setup_irq()
1783 data->alloc_vecs = 0; in btintel_pcie_setup_irq()
1811 static void btintel_pcie_config_msix(struct btintel_pcie_data *data) in btintel_pcie_config_msix() argument
1814 int val = data->def_irq | BTINTEL_PCIE_MSIX_NON_AUTO_CLEAR_CAUSE; in btintel_pcie_config_msix()
1818 btintel_pcie_wr_reg8(data, in btintel_pcie_config_msix()
1821 btintel_pcie_clr_reg_bits(data, in btintel_pcie_config_msix()
1827 data->fh_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK); in btintel_pcie_config_msix()
1828 data->hw_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK); in btintel_pcie_config_msix()
1832 struct btintel_pcie_data *data) in btintel_pcie_config_pcie() argument
1849 data->base_addr = pcim_iomap_region(pdev, 0, KBUILD_MODNAME); in btintel_pcie_config_pcie()
1850 if (IS_ERR(data->base_addr)) in btintel_pcie_config_pcie()
1851 return PTR_ERR(data->base_addr); in btintel_pcie_config_pcie()
1853 err = btintel_pcie_setup_irq(data); in btintel_pcie_config_pcie()
1858 btintel_pcie_config_msix(data); in btintel_pcie_config_pcie()
1863 static void btintel_pcie_init_ci(struct btintel_pcie_data *data, in btintel_pcie_init_ci() argument
1869 ci->addr_cr_hia = data->ia.cr_hia_p_addr; in btintel_pcie_init_ci()
1870 ci->addr_tr_tia = data->ia.tr_tia_p_addr; in btintel_pcie_init_ci()
1871 ci->addr_cr_tia = data->ia.cr_tia_p_addr; in btintel_pcie_init_ci()
1872 ci->addr_tr_hia = data->ia.tr_hia_p_addr; in btintel_pcie_init_ci()
1875 ci->addr_urbdq0 = data->txq.urbd0s_p_addr; in btintel_pcie_init_ci()
1876 ci->addr_tfdq = data->txq.tfds_p_addr; in btintel_pcie_init_ci()
1877 ci->num_tfdq = data->txq.count; in btintel_pcie_init_ci()
1878 ci->num_urbdq0 = data->txq.count; in btintel_pcie_init_ci()
1882 ci->addr_frbdq = data->rxq.frbds_p_addr; in btintel_pcie_init_ci()
1883 ci->num_frbdq = data->rxq.count; in btintel_pcie_init_ci()
1885 ci->addr_urbdq1 = data->rxq.urbd1s_p_addr; in btintel_pcie_init_ci()
1886 ci->num_urbdq1 = data->rxq.count; in btintel_pcie_init_ci()
1890 ci->dbgc_addr = data->dbgc.frag_p_addr; in btintel_pcie_init_ci()
1891 ci->dbgc_size = data->dbgc.frag_size; in btintel_pcie_init_ci()
1895 static void btintel_pcie_free_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_txq_bufs() argument
1899 dma_free_coherent(&data->pdev->dev, txq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_txq_bufs()
1904 static int btintel_pcie_setup_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_txq_bufs() argument
1918 txq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_txq_bufs()
1933 buf->data = txq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_txq_bufs()
1939 static void btintel_pcie_free_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_rxq_bufs() argument
1943 dma_free_coherent(&data->pdev->dev, rxq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_rxq_bufs()
1948 static int btintel_pcie_setup_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_rxq_bufs() argument
1962 rxq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_rxq_bufs()
1977 buf->data = rxq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_rxq_bufs()
1983 static void btintel_pcie_free(struct btintel_pcie_data *data) in btintel_pcie_free() argument
1985 btintel_pcie_free_rxq_bufs(data, &data->rxq); in btintel_pcie_free()
1986 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_free()
1988 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_free()
1989 dma_pool_destroy(data->dma_pool); in btintel_pcie_free()
1994 static int btintel_pcie_alloc(struct btintel_pcie_data *data) in btintel_pcie_alloc() argument
2034 data->dma_pool = dma_pool_create(KBUILD_MODNAME, &data->pdev->dev, in btintel_pcie_alloc()
2036 if (!data->dma_pool) { in btintel_pcie_alloc()
2041 v_addr = dma_pool_zalloc(data->dma_pool, GFP_KERNEL | __GFP_NOWARN, in btintel_pcie_alloc()
2044 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
2049 data->dma_p_addr = p_addr; in btintel_pcie_alloc()
2050 data->dma_v_addr = v_addr; in btintel_pcie_alloc()
2053 data->txq.count = BTINTEL_PCIE_TX_DESCS_COUNT; in btintel_pcie_alloc()
2054 data->rxq.count = BTINTEL_PCIE_RX_DESCS_COUNT; in btintel_pcie_alloc()
2057 data->txq.tfds_p_addr = p_addr; in btintel_pcie_alloc()
2058 data->txq.tfds = v_addr; in btintel_pcie_alloc()
2064 data->txq.urbd0s_p_addr = p_addr; in btintel_pcie_alloc()
2065 data->txq.urbd0s = v_addr; in btintel_pcie_alloc()
2071 data->rxq.frbds_p_addr = p_addr; in btintel_pcie_alloc()
2072 data->rxq.frbds = v_addr; in btintel_pcie_alloc()
2078 data->rxq.urbd1s_p_addr = p_addr; in btintel_pcie_alloc()
2079 data->rxq.urbd1s = v_addr; in btintel_pcie_alloc()
2085 err = btintel_pcie_setup_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
2090 err = btintel_pcie_setup_rxq_bufs(data, &data->rxq); in btintel_pcie_alloc()
2095 data->ia.tr_hia_p_addr = p_addr; in btintel_pcie_alloc()
2096 data->ia.tr_hia = v_addr; in btintel_pcie_alloc()
2101 data->ia.tr_tia_p_addr = p_addr; in btintel_pcie_alloc()
2102 data->ia.tr_tia = v_addr; in btintel_pcie_alloc()
2107 data->ia.cr_hia_p_addr = p_addr; in btintel_pcie_alloc()
2108 data->ia.cr_hia = v_addr; in btintel_pcie_alloc()
2113 data->ia.cr_tia_p_addr = p_addr; in btintel_pcie_alloc()
2114 data->ia.cr_tia = v_addr; in btintel_pcie_alloc()
2119 err = btintel_pcie_setup_dbgc(data); in btintel_pcie_alloc()
2124 data->ci = v_addr; in btintel_pcie_alloc()
2125 data->ci_p_addr = p_addr; in btintel_pcie_alloc()
2128 btintel_pcie_init_ci(data, data->ci); in btintel_pcie_alloc()
2133 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
2135 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_alloc()
2136 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
2183 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_send_frame() local
2189 if (test_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags)) in btintel_pcie_send_frame()
2192 if (test_bit(BTINTEL_PCIE_RECOVERY_IN_PROGRESS, &data->flags)) in btintel_pcie_send_frame()
2212 cmd = (void *)skb->data; in btintel_pcie_send_frame()
2215 struct hci_command_hdr *cmd = (void *)skb->data; in btintel_pcie_send_frame()
2245 ret = btintel_pcie_send_sync(data, skb, type, opcode); in btintel_pcie_send_frame()
2259 static void btintel_pcie_release_hdev(struct btintel_pcie_data *data) in btintel_pcie_release_hdev() argument
2261 struct hci_dev *hdev = data->hdev; in btintel_pcie_release_hdev()
2268 data->hdev = NULL; in btintel_pcie_release_hdev()
2271 static void btintel_pcie_disable_interrupts(struct btintel_pcie_data *data) in btintel_pcie_disable_interrupts() argument
2273 spin_lock(&data->irq_lock); in btintel_pcie_disable_interrupts()
2274 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, data->fh_init_mask); in btintel_pcie_disable_interrupts()
2275 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, data->hw_init_mask); in btintel_pcie_disable_interrupts()
2276 spin_unlock(&data->irq_lock); in btintel_pcie_disable_interrupts()
2279 static void btintel_pcie_enable_interrupts(struct btintel_pcie_data *data) in btintel_pcie_enable_interrupts() argument
2281 spin_lock(&data->irq_lock); in btintel_pcie_enable_interrupts()
2282 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, ~data->fh_init_mask); in btintel_pcie_enable_interrupts()
2283 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, ~data->hw_init_mask); in btintel_pcie_enable_interrupts()
2284 spin_unlock(&data->irq_lock); in btintel_pcie_enable_interrupts()
2287 static void btintel_pcie_synchronize_irqs(struct btintel_pcie_data *data) in btintel_pcie_synchronize_irqs() argument
2289 for (int i = 0; i < data->alloc_vecs; i++) in btintel_pcie_synchronize_irqs()
2290 synchronize_irq(data->msix_entries[i].vector); in btintel_pcie_synchronize_irqs()
2295 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_get_debug_info_addr() local
2319 if (skb->data[0]) { in btintel_pcie_get_debug_info_addr()
2321 skb->data[0]); in btintel_pcie_get_debug_info_addr()
2329 evt = (void *)skb->data; in btintel_pcie_get_debug_info_addr()
2331 data->debug_evt_addr = le32_to_cpu(evt->addr); in btintel_pcie_get_debug_info_addr()
2332 data->debug_evt_size = le32_to_cpu(evt->size); in btintel_pcie_get_debug_info_addr()
2335 evt->type, evt->len, data->debug_evt_addr, in btintel_pcie_get_debug_info_addr()
2336 data->debug_evt_size); in btintel_pcie_get_debug_info_addr()
2344 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup_internal() local
2360 if (skb->data[0]) { in btintel_pcie_setup_internal()
2362 skb->data[0]); in btintel_pcie_setup_internal()
2430 data->dmp_hdr.cnvi_top = ver_tlv.cnvi_top; in btintel_pcie_setup_internal()
2431 data->dmp_hdr.cnvr_top = ver_tlv.cnvr_top; in btintel_pcie_setup_internal()
2432 data->dmp_hdr.fw_timestamp = ver_tlv.timestamp; in btintel_pcie_setup_internal()
2433 data->dmp_hdr.fw_build_type = ver_tlv.build_type; in btintel_pcie_setup_internal()
2434 data->dmp_hdr.fw_build_num = ver_tlv.build_num; in btintel_pcie_setup_internal()
2435 data->dmp_hdr.cnvi_bt = ver_tlv.cnvi_bt; in btintel_pcie_setup_internal()
2438 data->dmp_hdr.fw_git_sha1 = ver_tlv.git_sha1; in btintel_pcie_setup_internal()
2454 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup() local
2460 btintel_pcie_disable_interrupts(data); in btintel_pcie_setup()
2461 btintel_pcie_synchronize_irqs(data); in btintel_pcie_setup()
2462 err = btintel_pcie_reset_bt(data); in btintel_pcie_setup()
2468 btintel_pcie_reset_ia(data); in btintel_pcie_setup()
2469 btintel_pcie_enable_interrupts(data); in btintel_pcie_setup()
2470 btintel_pcie_config_msix(data); in btintel_pcie_setup()
2471 err = btintel_pcie_enable_bt(data); in btintel_pcie_setup()
2476 btintel_pcie_start_rx(data); in btintel_pcie_setup()
2480 set_bit(BTINTEL_PCIE_SETUP_DONE, &data->flags); in btintel_pcie_setup()
2487 struct btintel_pcie_dev_recovery *tmp, *data = NULL; in btintel_pcie_get_recovery() local
2496 data = tmp; in btintel_pcie_get_recovery()
2501 if (data) { in btintel_pcie_get_recovery()
2502 bt_dev_dbg(hdev, "Found restart data for BDF: %s", data->name); in btintel_pcie_get_recovery()
2503 return data; in btintel_pcie_get_recovery()
2506 data = kzalloc_flex(*data, name, name_len, GFP_ATOMIC); in btintel_pcie_get_recovery()
2507 if (!data) in btintel_pcie_get_recovery()
2510 strscpy(data->name, name, name_len); in btintel_pcie_get_recovery()
2512 list_add_tail(&data->list, &btintel_pcie_recovery_list); in btintel_pcie_get_recovery()
2515 return data; in btintel_pcie_get_recovery()
2532 struct btintel_pcie_dev_recovery *data; in btintel_pcie_inc_recovery_count() local
2535 data = btintel_pcie_get_recovery(pdev, dev); in btintel_pcie_inc_recovery_count()
2536 if (!data) in btintel_pcie_inc_recovery_count()
2539 retry_window = ktime_get_boottime_seconds() - data->last_error; in btintel_pcie_inc_recovery_count()
2540 if (data->count == 0) { in btintel_pcie_inc_recovery_count()
2541 data->last_error = ktime_get_boottime_seconds(); in btintel_pcie_inc_recovery_count()
2542 data->count++; in btintel_pcie_inc_recovery_count()
2544 data->count <= BTINTEL_PCIE_FLR_MAX_RETRY) { in btintel_pcie_inc_recovery_count()
2545 data->count++; in btintel_pcie_inc_recovery_count()
2547 data->last_error = 0; in btintel_pcie_inc_recovery_count()
2548 data->count = 0; in btintel_pcie_inc_recovery_count()
2552 static int btintel_pcie_acpi_reset_method(struct btintel_pcie_data *data) in btintel_pcie_acpi_reset_method() argument
2570 struct hci_dev *hdev = data->hdev; in btintel_pcie_acpi_reset_method()
2572 handle = ACPI_HANDLE(GET_HCIDEV_DEV(data->hdev)); in btintel_pcie_acpi_reset_method()
2574 bt_dev_err(data->hdev, "No support for bluetooth device in ACPI firmware"); in btintel_pcie_acpi_reset_method()
2579 bt_dev_err(data->hdev, "No support for _PRR ACPI method, cold boot"); in btintel_pcie_acpi_reset_method()
2590 bt_dev_err(data->hdev, "Failed to call dsm to set reset method"); in btintel_pcie_acpi_reset_method()
2595 pci_dev_lock(data->pdev); in btintel_pcie_acpi_reset_method()
2596 pci_save_state(data->pdev); in btintel_pcie_acpi_reset_method()
2599 bt_dev_err(data->hdev, "ACPI _PRR reset failed (%d), PLDR incomplete", in btintel_pcie_acpi_reset_method()
2601 pci_restore_state(data->pdev); in btintel_pcie_acpi_reset_method()
2602 pci_dev_unlock(data->pdev); in btintel_pcie_acpi_reset_method()
2606 static void btintel_pcie_perform_pldr(struct btintel_pcie_data *data) in btintel_pcie_perform_pldr() argument
2608 struct pci_dev *pdev = data->pdev; in btintel_pcie_perform_pldr()
2646 ret = btintel_pcie_acpi_reset_method(data); in btintel_pcie_perform_pldr()
2667 static int btintel_pcie_perform_flr(struct btintel_pcie_data *data) in btintel_pcie_perform_flr() argument
2669 struct pci_dev *pdev = data->pdev; in btintel_pcie_perform_flr()
2696 struct btintel_pcie_data *data = in btintel_pcie_reset_work() local
2698 struct pci_dev *pdev = data->pdev; in btintel_pcie_reset_work()
2705 if (!data) in btintel_pcie_reset_work()
2708 btintel_pcie_disable_interrupts(data); in btintel_pcie_reset_work()
2709 btintel_pcie_synchronize_irqs(data); in btintel_pcie_reset_work()
2711 flush_work(&data->rx_work); in btintel_pcie_reset_work()
2715 disable_work_sync(&data->coredump_work); in btintel_pcie_reset_work()
2716 disable_work_sync(&data->hwexp_work); in btintel_pcie_reset_work()
2717 disable_work_sync(&data->fwtrigger_work); in btintel_pcie_reset_work()
2719 bt_dev_dbg(data->hdev, "Release bluetooth interface"); in btintel_pcie_reset_work()
2733 if (data->reset_type == BTINTEL_PCIE_IOSF_PRR_PLDR) { in btintel_pcie_reset_work()
2734 btintel_pcie_perform_pldr(data); in btintel_pcie_reset_work()
2738 if (btintel_pcie_perform_flr(data)) { in btintel_pcie_reset_work()
2739 enable_work(&data->coredump_work); in btintel_pcie_reset_work()
2740 enable_work(&data->hwexp_work); in btintel_pcie_reset_work()
2741 enable_work(&data->fwtrigger_work); in btintel_pcie_reset_work()
2771 static void btintel_pcie_request_reset(struct btintel_pcie_data *data, in btintel_pcie_request_reset() argument
2774 if (!test_bit(BTINTEL_PCIE_SETUP_DONE, &data->flags)) in btintel_pcie_request_reset()
2777 if (test_and_set_bit(BTINTEL_PCIE_RECOVERY_IN_PROGRESS, &data->flags)) in btintel_pcie_request_reset()
2780 data->reset_type = type; in btintel_pcie_request_reset()
2782 pci_dev_get(data->pdev); in btintel_pcie_request_reset()
2783 schedule_work(&data->reset_work); in btintel_pcie_request_reset()
2788 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_hci_reset() local
2790 btintel_pcie_request_reset(data, BTINTEL_PCIE_IOSF_PRR_FLR); in btintel_pcie_hci_reset()
2799 struct btintel_pcie_data *data = pci_get_drvdata(pdev); in vendor_reset_store() local
2801 if (!data || !data->hdev) in vendor_reset_store()
2805 bt_dev_warn(data->hdev, "PLDR rejected: invalid input"); in vendor_reset_store()
2809 bt_dev_info(data->hdev, "PLDR triggered via sysfs"); in vendor_reset_store()
2810 btintel_pcie_request_reset(data, BTINTEL_PCIE_IOSF_PRR_PLDR); in vendor_reset_store()
2870 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_wakeup() local
2872 return device_may_wakeup(&data->pdev->dev); in btintel_pcie_wakeup()
2883 static int btintel_pcie_hci_drv_read_info(struct hci_dev *hdev, void *data, in btintel_pcie_hci_drv_read_info() argument
2932 static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data) in btintel_pcie_setup_hdev() argument
2942 hci_set_drvdata(hdev, data); in btintel_pcie_setup_hdev()
2944 SET_HCIDEV_DEV(hdev, &data->pdev->dev); in btintel_pcie_setup_hdev()
2970 data->hdev = hdev; in btintel_pcie_setup_hdev()
2971 data->dmp_hdr.driver_name = KBUILD_MODNAME; in btintel_pcie_setup_hdev()
2979 struct btintel_pcie_data *data; in btintel_pcie_probe() local
2984 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in btintel_pcie_probe()
2985 if (!data) in btintel_pcie_probe()
2988 data->pdev = pdev; in btintel_pcie_probe()
2990 spin_lock_init(&data->irq_lock); in btintel_pcie_probe()
2991 spin_lock_init(&data->hci_rx_lock); in btintel_pcie_probe()
2993 init_waitqueue_head(&data->gp0_wait_q); in btintel_pcie_probe()
2994 data->gp0_received = false; in btintel_pcie_probe()
2996 init_waitqueue_head(&data->tx_wait_q); in btintel_pcie_probe()
2997 data->tx_wait_done = false; in btintel_pcie_probe()
2999 data->workqueue = alloc_ordered_workqueue(KBUILD_MODNAME, WQ_HIGHPRI); in btintel_pcie_probe()
3000 if (!data->workqueue) in btintel_pcie_probe()
3003 data->dump_workqueue = alloc_ordered_workqueue(KBUILD_MODNAME "_cd", 0); in btintel_pcie_probe()
3004 if (!data->dump_workqueue) { in btintel_pcie_probe()
3005 destroy_workqueue(data->workqueue); in btintel_pcie_probe()
3009 skb_queue_head_init(&data->rx_skb_q); in btintel_pcie_probe()
3010 INIT_WORK(&data->rx_work, btintel_pcie_rx_work); in btintel_pcie_probe()
3011 INIT_WORK(&data->reset_work, btintel_pcie_reset_work); in btintel_pcie_probe()
3012 INIT_WORK(&data->coredump_work, btintel_pcie_coredump_worker); in btintel_pcie_probe()
3013 INIT_WORK(&data->hwexp_work, btintel_pcie_hwexp_worker); in btintel_pcie_probe()
3014 INIT_WORK(&data->fwtrigger_work, btintel_pcie_fwtrigger_worker); in btintel_pcie_probe()
3016 data->boot_stage_cache = 0x00; in btintel_pcie_probe()
3017 data->img_resp_cache = 0x00; in btintel_pcie_probe()
3021 data->reset_type = BTINTEL_PCIE_IOSF_PRR_FLR; in btintel_pcie_probe()
3022 err = btintel_pcie_config_pcie(pdev, data); in btintel_pcie_probe()
3026 pci_set_drvdata(pdev, data); in btintel_pcie_probe()
3028 err = btintel_pcie_alloc(data); in btintel_pcie_probe()
3032 err = btintel_pcie_enable_bt(data); in btintel_pcie_probe()
3037 data->cnvi = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_HW_REV_REG); in btintel_pcie_probe()
3039 data->cnvr = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_RF_ID_REG); in btintel_pcie_probe()
3041 err = btintel_pcie_start_rx(data); in btintel_pcie_probe()
3045 err = btintel_pcie_setup_hdev(data); in btintel_pcie_probe()
3049 bt_dev_dbg(data->hdev, "cnvi: 0x%8.8x cnvr: 0x%8.8x", data->cnvi, in btintel_pcie_probe()
3050 data->cnvr); in btintel_pcie_probe()
3055 btintel_pcie_reset_bt(data); in btintel_pcie_probe()
3057 destroy_workqueue(data->dump_workqueue); in btintel_pcie_probe()
3068 struct btintel_pcie_data *data; in btintel_pcie_remove() local
3070 data = pci_get_drvdata(pdev); in btintel_pcie_remove()
3071 if (!data) { in btintel_pcie_remove()
3081 disable_work_sync(&data->coredump_work); in btintel_pcie_remove()
3082 disable_work_sync(&data->hwexp_work); in btintel_pcie_remove()
3083 disable_work_sync(&data->fwtrigger_work); in btintel_pcie_remove()
3090 if (current_work() != &data->reset_work) in btintel_pcie_remove()
3091 disable_work_sync(&data->reset_work); in btintel_pcie_remove()
3093 btintel_pcie_disable_interrupts(data); in btintel_pcie_remove()
3095 btintel_pcie_synchronize_irqs(data); in btintel_pcie_remove()
3097 flush_work(&data->rx_work); in btintel_pcie_remove()
3099 btintel_pcie_reset_bt(data); in btintel_pcie_remove()
3100 for (int i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_remove()
3103 msix_entry = &data->msix_entries[i]; in btintel_pcie_remove()
3109 btintel_pcie_release_hdev(data); in btintel_pcie_remove()
3111 destroy_workqueue(data->dump_workqueue); in btintel_pcie_remove()
3112 destroy_workqueue(data->workqueue); in btintel_pcie_remove()
3114 btintel_pcie_free(data); in btintel_pcie_remove()
3125 struct btintel_pcie_data *data = pci_get_drvdata(pdev); in btintel_pcie_coredump() local
3127 if (!data) in btintel_pcie_coredump()
3130 btintel_pcie_queue_coredump(data, in btintel_pcie_coredump()
3135 static int btintel_pcie_set_dxstate(struct btintel_pcie_data *data, u32 dxstate) in btintel_pcie_set_dxstate() argument
3141 data->gp0_received = false; in btintel_pcie_set_dxstate()
3143 btintel_pcie_wr_sleep_cntrl(data, dxstate); in btintel_pcie_set_dxstate()
3145 status = wait_event_timeout(data->gp0_wait_q, data->gp0_received, in btintel_pcie_set_dxstate()
3151 bt_dev_warn(data->hdev, in btintel_pcie_set_dxstate()
3156 btintel_pcie_clr_reg_bits(data, in btintel_pcie_set_dxstate()
3165 if (btintel_pcie_in_d0(data)) in btintel_pcie_set_dxstate()
3168 if (btintel_pcie_in_d3(data)) in btintel_pcie_set_dxstate()
3180 struct btintel_pcie_data *data; in btintel_pcie_suspend_late() local
3185 data = pci_get_drvdata(pdev); in btintel_pcie_suspend_late()
3190 data->pm_sx_event = mesg.event; in btintel_pcie_suspend_late()
3195 err = btintel_pcie_set_dxstate(data, dxstate); in btintel_pcie_suspend_late()
3200 bt_dev_dbg(data->hdev, in btintel_pcie_suspend_late()
3224 struct btintel_pcie_data *data; in btintel_pcie_resume() local
3228 data = pci_get_drvdata(pdev); in btintel_pcie_resume()
3229 data->gp0_received = false; in btintel_pcie_resume()
3240 if (data->pm_sx_event == PM_EVENT_FREEZE || in btintel_pcie_resume()
3241 data->pm_sx_event == PM_EVENT_HIBERNATE) { in btintel_pcie_resume()
3242 set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags); in btintel_pcie_resume()
3243 btintel_pcie_request_reset(data, BTINTEL_PCIE_IOSF_PRR_FLR); in btintel_pcie_resume()
3248 err = btintel_pcie_set_dxstate(data, BTINTEL_PCIE_STATE_D0); in btintel_pcie_resume()
3251 bt_dev_dbg(data->hdev, in btintel_pcie_resume()
3262 data->boot_stage_cache = btintel_pcie_rd_reg32(data, in btintel_pcie_resume()
3264 if (btintel_pcie_in_error(data) || in btintel_pcie_resume()
3265 btintel_pcie_in_device_halt(data)) { in btintel_pcie_resume()
3266 bt_dev_err(data->hdev, "Controller in error state for D0 entry"); in btintel_pcie_resume()
3267 btintel_pcie_queue_coredump(data, in btintel_pcie_resume()
3269 set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags); in btintel_pcie_resume()
3270 btintel_pcie_request_reset(data, BTINTEL_PCIE_IOSF_PRR_FLR); in btintel_pcie_resume()