Lines Matching refs:data

147 static int btintel_pcie_setup_dbgc(struct btintel_pcie_data *data)  in btintel_pcie_setup_dbgc()  argument
153 data->dbgc.count = BTINTEL_PCIE_DBGC_BUFFER_COUNT; in btintel_pcie_setup_dbgc()
154 data->dbgc.bufs = devm_kcalloc(&data->pdev->dev, data->dbgc.count, in btintel_pcie_setup_dbgc()
156 if (!data->dbgc.bufs) in btintel_pcie_setup_dbgc()
159 data->dbgc.buf_v_addr = dmam_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_dbgc()
160 data->dbgc.count * in btintel_pcie_setup_dbgc()
162 &data->dbgc.buf_p_addr, in btintel_pcie_setup_dbgc()
164 if (!data->dbgc.buf_v_addr) in btintel_pcie_setup_dbgc()
167 data->dbgc.frag_v_addr = dmam_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_dbgc()
169 &data->dbgc.frag_p_addr, in btintel_pcie_setup_dbgc()
171 if (!data->dbgc.frag_v_addr) in btintel_pcie_setup_dbgc()
174 data->dbgc.frag_size = sizeof(struct btintel_pcie_dbgc_ctxt); in btintel_pcie_setup_dbgc()
181 for (i = 0; i < data->dbgc.count; i++) { in btintel_pcie_setup_dbgc()
182 buf = &data->dbgc.bufs[i]; in btintel_pcie_setup_dbgc()
183 buf->data_p_addr = data->dbgc.buf_p_addr + i * BTINTEL_PCIE_DBGC_BUFFER_SIZE; in btintel_pcie_setup_dbgc()
184 buf->data = data->dbgc.buf_v_addr + i * BTINTEL_PCIE_DBGC_BUFFER_SIZE; in btintel_pcie_setup_dbgc()
190 memcpy(data->dbgc.frag_v_addr, &db_frag, sizeof(db_frag)); in btintel_pcie_setup_dbgc()
221 static void btintel_pcie_set_tx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_tx_db() argument
228 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_tx_db()
249 memcpy(buf->data, skb->data, tfd->size); in btintel_pcie_prepare_tx()
254 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_debug_registers() local
268 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_dump_debug_registers()
272 data->boot_stage_cache = reg; in btintel_pcie_dump_debug_registers()
274 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_STATUS_REG); in btintel_pcie_dump_debug_registers()
279 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_CONTROL_REG); in btintel_pcie_dump_debug_registers()
284 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG); in btintel_pcie_dump_debug_registers()
290 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MBOX_STATUS_REG); in btintel_pcie_dump_debug_registers()
294 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
302 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
310 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
318 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
325 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_dump_debug_registers()
326 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_dump_debug_registers()
331 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_dump_debug_registers()
332 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_dump_debug_registers()
342 static int btintel_pcie_send_sync(struct btintel_pcie_data *data, in btintel_pcie_send_sync() argument
349 struct hci_dev *hdev = data->hdev; in btintel_pcie_send_sync()
351 struct txq *txq = &data->txq; in btintel_pcie_send_sync()
353 tfd_index = data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_send_sync()
365 data->gp0_received = false; in btintel_pcie_send_sync()
366 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_send_sync()
367 data->alive_intr_ctxt = in btintel_pcie_send_sync()
370 bt_dev_dbg(data->hdev, "sending cmd: 0x%4.4x alive context changed: %s -> %s", in btintel_pcie_send_sync()
372 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_sync()
384 data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM] = tfd_index; in btintel_pcie_send_sync()
387 data->tx_wait_done = false; in btintel_pcie_send_sync()
390 btintel_pcie_set_tx_db(data, tfd_index); in btintel_pcie_send_sync()
393 ret = wait_event_timeout(data->tx_wait_q, data->tx_wait_done, in btintel_pcie_send_sync()
396 bt_dev_err(data->hdev, "Timeout (%u ms) on tx completion", in btintel_pcie_send_sync()
398 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_send_sync()
403 ret = wait_event_timeout(data->gp0_wait_q, in btintel_pcie_send_sync()
404 data->gp0_received, in btintel_pcie_send_sync()
410 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_sync()
420 static void btintel_pcie_set_rx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_rx_db() argument
427 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_rx_db()
449 static int btintel_pcie_submit_rx(struct btintel_pcie_data *data) in btintel_pcie_submit_rx() argument
452 struct rxq *rxq = &data->rxq; in btintel_pcie_submit_rx()
454 frbd_index = data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_submit_rx()
465 data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM] = frbd_index; in btintel_pcie_submit_rx()
466 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_submit_rx()
469 btintel_pcie_set_rx_db(data, frbd_index); in btintel_pcie_submit_rx()
474 static int btintel_pcie_start_rx(struct btintel_pcie_data *data) in btintel_pcie_start_rx() argument
477 struct rxq *rxq = &data->rxq; in btintel_pcie_start_rx()
484 ret = btintel_pcie_submit_rx(data); in btintel_pcie_start_rx()
492 static void btintel_pcie_reset_ia(struct btintel_pcie_data *data) in btintel_pcie_reset_ia() argument
494 memset(data->ia.tr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
495 memset(data->ia.tr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
496 memset(data->ia.cr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
497 memset(data->ia.cr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
500 static int btintel_pcie_reset_bt(struct btintel_pcie_data *data) in btintel_pcie_reset_bt() argument
505 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
512 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
515 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
523 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
529 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
532 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
533 bt_dev_dbg(data->hdev, "csr register after reset: 0x%8.8x", reg); in btintel_pcie_reset_bt()
535 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_reset_bt()
543 static void btintel_pcie_mac_init(struct btintel_pcie_data *data) in btintel_pcie_mac_init() argument
548 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_mac_init()
554 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_mac_init()
557 static int btintel_pcie_add_dmp_data(struct hci_dev *hdev, const void *data, int size) in btintel_pcie_add_dmp_data() argument
566 skb_put_data(skb, data, size); in btintel_pcie_add_dmp_data()
576 static int btintel_pcie_get_mac_access(struct btintel_pcie_data *data) in btintel_pcie_get_mac_access() argument
581 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_get_mac_access()
588 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_get_mac_access()
591 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_get_mac_access()
602 static void btintel_pcie_release_mac_access(struct btintel_pcie_data *data) in btintel_pcie_release_mac_access() argument
606 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_release_mac_access()
617 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_release_mac_access()
621 void *data, int size) in btintel_pcie_copy_tlv() argument
628 memcpy(tlv->val, data, tlv->len); in btintel_pcie_copy_tlv()
631 static int btintel_pcie_read_dram_buffers(struct btintel_pcie_data *data) in btintel_pcie_read_dram_buffers() argument
634 struct btintel_pcie_dbgc *dbgc = &data->dbgc; in btintel_pcie_read_dram_buffers()
636 struct hci_dev *hdev = data->hdev; in btintel_pcie_read_dram_buffers()
645 wr_ptr_status = btintel_pcie_rd_dev_mem(data, BTINTEL_PCIE_DBGC_CUR_DBGBUFF_STATUS); in btintel_pcie_read_dram_buffers()
656 data->dmp_hdr.write_ptr = prev_size + offset; in btintel_pcie_read_dram_buffers()
668 2000 + (data->dmp_hdr.fw_timestamp >> 8), in btintel_pcie_read_dram_buffers()
669 data->dmp_hdr.fw_timestamp & 0xff, data->dmp_hdr.fw_build_type, in btintel_pcie_read_dram_buffers()
670 data->dmp_hdr.fw_build_num); in btintel_pcie_read_dram_buffers()
672 hdr_len = sizeof(*tlv) + sizeof(data->dmp_hdr.cnvi_bt) + in btintel_pcie_read_dram_buffers()
673 sizeof(*tlv) + sizeof(data->dmp_hdr.write_ptr) + in btintel_pcie_read_dram_buffers()
674 sizeof(*tlv) + sizeof(data->dmp_hdr.wrap_ctr) + in btintel_pcie_read_dram_buffers()
675 sizeof(*tlv) + sizeof(data->dmp_hdr.trigger_reason) + in btintel_pcie_read_dram_buffers()
676 sizeof(*tlv) + sizeof(data->dmp_hdr.fw_git_sha1) + in btintel_pcie_read_dram_buffers()
677 sizeof(*tlv) + sizeof(data->dmp_hdr.cnvr_top) + in btintel_pcie_read_dram_buffers()
678 sizeof(*tlv) + sizeof(data->dmp_hdr.cnvi_top) + in btintel_pcie_read_dram_buffers()
700 btintel_pcie_copy_tlv(skb, BTINTEL_CNVI_BT, &data->dmp_hdr.cnvi_bt, in btintel_pcie_read_dram_buffers()
701 sizeof(data->dmp_hdr.cnvi_bt)); in btintel_pcie_read_dram_buffers()
703 btintel_pcie_copy_tlv(skb, BTINTEL_WRITE_PTR, &data->dmp_hdr.write_ptr, in btintel_pcie_read_dram_buffers()
704 sizeof(data->dmp_hdr.write_ptr)); in btintel_pcie_read_dram_buffers()
706 data->dmp_hdr.wrap_ctr = btintel_pcie_rd_dev_mem(data, in btintel_pcie_read_dram_buffers()
709 btintel_pcie_copy_tlv(skb, BTINTEL_WRAP_CTR, &data->dmp_hdr.wrap_ctr, in btintel_pcie_read_dram_buffers()
710 sizeof(data->dmp_hdr.wrap_ctr)); in btintel_pcie_read_dram_buffers()
712 btintel_pcie_copy_tlv(skb, BTINTEL_TRIGGER_REASON, &data->dmp_hdr.trigger_reason, in btintel_pcie_read_dram_buffers()
713 sizeof(data->dmp_hdr.trigger_reason)); in btintel_pcie_read_dram_buffers()
715 btintel_pcie_copy_tlv(skb, BTINTEL_FW_SHA, &data->dmp_hdr.fw_git_sha1, in btintel_pcie_read_dram_buffers()
716 sizeof(data->dmp_hdr.fw_git_sha1)); in btintel_pcie_read_dram_buffers()
718 btintel_pcie_copy_tlv(skb, BTINTEL_CNVR_TOP, &data->dmp_hdr.cnvr_top, in btintel_pcie_read_dram_buffers()
719 sizeof(data->dmp_hdr.cnvr_top)); in btintel_pcie_read_dram_buffers()
721 btintel_pcie_copy_tlv(skb, BTINTEL_CNVI_TOP, &data->dmp_hdr.cnvi_top, in btintel_pcie_read_dram_buffers()
722 sizeof(data->dmp_hdr.cnvi_top)); in btintel_pcie_read_dram_buffers()
733 ret = btintel_pcie_add_dmp_data(hdev, dbgc->bufs[i].data, in btintel_pcie_read_dram_buffers()
746 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_traces() local
749 ret = btintel_pcie_get_mac_access(data); in btintel_pcie_dump_traces()
755 ret = btintel_pcie_read_dram_buffers(data); in btintel_pcie_dump_traces()
757 btintel_pcie_release_mac_access(data); in btintel_pcie_dump_traces()
765 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_hdr() local
773 INTEL_HW_VARIANT(data->dmp_hdr.cnvi_bt)); in btintel_pcie_dump_hdr()
777 data->dmp_hdr.fw_build_num); in btintel_pcie_dump_hdr()
780 snprintf(buf, sizeof(buf), "Driver: %s\n", data->dmp_hdr.driver_name); in btintel_pcie_dump_hdr()
791 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_notify() local
795 data->dmp_hdr.state = HCI_DEVCOREDUMP_IDLE; in btintel_pcie_dump_notify()
798 data->dmp_hdr.state = HCI_DEVCOREDUMP_ACTIVE; in btintel_pcie_dump_notify()
803 data->dmp_hdr.state = HCI_DEVCOREDUMP_IDLE; in btintel_pcie_dump_notify()
814 static int btintel_pcie_enable_bt(struct btintel_pcie_data *data) in btintel_pcie_enable_bt() argument
819 data->gp0_received = false; in btintel_pcie_enable_bt()
822 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_LSB_REG, in btintel_pcie_enable_bt()
823 data->ci_p_addr & 0xffffffff); in btintel_pcie_enable_bt()
824 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG, in btintel_pcie_enable_bt()
825 (u64)data->ci_p_addr >> 32); in btintel_pcie_enable_bt()
830 data->boot_stage_cache = 0x0; in btintel_pcie_enable_bt()
833 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
840 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_enable_bt()
843 btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, in btintel_pcie_enable_bt()
846 btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
851 data->alive_intr_ctxt = BTINTEL_PCIE_ROM; in btintel_pcie_enable_bt()
852 err = wait_event_timeout(data->gp0_wait_q, data->gp0_received, in btintel_pcie_enable_bt()
858 if (~data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ROM) in btintel_pcie_enable_bt()
864 static inline bool btintel_pcie_in_op(struct btintel_pcie_data *data) in btintel_pcie_in_op() argument
866 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW; in btintel_pcie_in_op()
869 static inline bool btintel_pcie_in_iml(struct btintel_pcie_data *data) in btintel_pcie_in_iml() argument
871 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML && in btintel_pcie_in_iml()
872 !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW); in btintel_pcie_in_iml()
875 static inline bool btintel_pcie_in_d3(struct btintel_pcie_data *data) in btintel_pcie_in_d3() argument
877 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY; in btintel_pcie_in_d3()
880 static inline bool btintel_pcie_in_d0(struct btintel_pcie_data *data) in btintel_pcie_in_d0() argument
882 return !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY); in btintel_pcie_in_d0()
885 static void btintel_pcie_wr_sleep_cntrl(struct btintel_pcie_data *data, in btintel_pcie_wr_sleep_cntrl() argument
888 bt_dev_dbg(data->hdev, "writing sleep_ctl_reg: 0x%8.8x", dxstate); in btintel_pcie_wr_sleep_cntrl()
889 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG, dxstate); in btintel_pcie_wr_sleep_cntrl()
892 static int btintel_pcie_read_device_mem(struct btintel_pcie_data *data, in btintel_pcie_read_device_mem() argument
899 err = btintel_pcie_get_mac_access(data); in btintel_pcie_read_device_mem()
901 bt_dev_err(data->hdev, "Failed to get mac access %d", err); in btintel_pcie_read_device_mem()
906 *val = btintel_pcie_rd_dev_mem(data, dev_addr); in btintel_pcie_read_device_mem()
908 btintel_pcie_release_mac_access(data); in btintel_pcie_read_device_mem()
913 static inline bool btintel_pcie_in_lockdown(struct btintel_pcie_data *data) in btintel_pcie_in_lockdown() argument
915 return (data->boot_stage_cache & in btintel_pcie_in_lockdown()
917 (data->boot_stage_cache & in btintel_pcie_in_lockdown()
921 static inline bool btintel_pcie_in_error(struct btintel_pcie_data *data) in btintel_pcie_in_error() argument
923 return (data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_DEVICE_ERR) || in btintel_pcie_in_error()
924 (data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ABORT_HANDLER); in btintel_pcie_in_error()
927 static void btintel_pcie_msix_gp1_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp1_handler() argument
929 bt_dev_err(data->hdev, "Received gp1 mailbox interrupt"); in btintel_pcie_msix_gp1_handler()
930 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp1_handler()
936 static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp0_handler() argument
945 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_msix_gp0_handler()
946 if (reg != data->boot_stage_cache) in btintel_pcie_msix_gp0_handler()
947 data->boot_stage_cache = reg; in btintel_pcie_msix_gp0_handler()
949 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()
950 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt), in btintel_pcie_msix_gp0_handler()
951 data->boot_stage_cache, reg); in btintel_pcie_msix_gp0_handler()
952 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IMG_RESPONSE_REG); in btintel_pcie_msix_gp0_handler()
953 if (reg != data->img_resp_cache) in btintel_pcie_msix_gp0_handler()
954 data->img_resp_cache = reg; in btintel_pcie_msix_gp0_handler()
956 if (btintel_pcie_in_error(data)) { in btintel_pcie_msix_gp0_handler()
957 bt_dev_err(data->hdev, "Controller in error state"); in btintel_pcie_msix_gp0_handler()
958 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp0_handler()
962 if (btintel_pcie_in_lockdown(data)) { in btintel_pcie_msix_gp0_handler()
963 bt_dev_err(data->hdev, "Controller in lockdown state"); in btintel_pcie_msix_gp0_handler()
964 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp0_handler()
968 data->gp0_received = true; in btintel_pcie_msix_gp0_handler()
970 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_msix_gp0_handler()
974 switch (data->alive_intr_ctxt) { in btintel_pcie_msix_gp0_handler()
976 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
985 if (btintel_pcie_in_op(data)) { in btintel_pcie_msix_gp0_handler()
991 if (btintel_pcie_in_iml(data)) { in btintel_pcie_msix_gp0_handler()
994 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
999 if (btintel_test_and_clear_flag(data->hdev, INTEL_WAIT_FOR_D0)) { in btintel_pcie_msix_gp0_handler()
1000 btintel_wake_up_flag(data->hdev, INTEL_WAIT_FOR_D0); in btintel_pcie_msix_gp0_handler()
1001 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
1005 if (btintel_pcie_in_d3(data)) { in btintel_pcie_msix_gp0_handler()
1006 data->alive_intr_ctxt = BTINTEL_PCIE_D3; in btintel_pcie_msix_gp0_handler()
1012 if (btintel_pcie_in_d0(data)) { in btintel_pcie_msix_gp0_handler()
1013 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
1020 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
1025 bt_dev_err(data->hdev, "Unknown state: 0x%2.2x", in btintel_pcie_msix_gp0_handler()
1026 data->alive_intr_ctxt); in btintel_pcie_msix_gp0_handler()
1031 btintel_pcie_reset_ia(data); in btintel_pcie_msix_gp0_handler()
1032 btintel_pcie_start_rx(data); in btintel_pcie_msix_gp0_handler()
1036 bt_dev_dbg(data->hdev, "wake up gp0 wait_q"); in btintel_pcie_msix_gp0_handler()
1037 wake_up(&data->gp0_wait_q); in btintel_pcie_msix_gp0_handler()
1040 if (old_ctxt != data->alive_intr_ctxt) in btintel_pcie_msix_gp0_handler()
1041 bt_dev_dbg(data->hdev, "alive context changed: %s -> %s", in btintel_pcie_msix_gp0_handler()
1043 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_msix_gp0_handler()
1048 static void btintel_pcie_msix_tx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_tx_handle() argument
1054 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
1055 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
1060 txq = &data->txq; in btintel_pcie_msix_tx_handle()
1063 data->tx_wait_done = true; in btintel_pcie_msix_tx_handle()
1064 wake_up(&data->tx_wait_q); in btintel_pcie_msix_tx_handle()
1072 data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] = cr_tia; in btintel_pcie_msix_tx_handle()
1073 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_TXQ_NUM); in btintel_pcie_msix_tx_handle()
1079 struct hci_event_hdr *hdr = (void *)skb->data; in btintel_pcie_recv_event()
1080 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_recv_event() local
1084 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btintel_pcie_recv_event()
1088 switch (skb->data[2]) { in btintel_pcie_recv_event()
1100 if (btintel_pcie_in_op(data)) { in btintel_pcie_recv_event()
1101 btintel_pcie_wr_sleep_cntrl(data, BTINTEL_PCIE_STATE_D0); in btintel_pcie_recv_event()
1102 data->alive_intr_ctxt = BTINTEL_PCIE_INTEL_HCI_RESET2; in btintel_pcie_recv_event()
1107 if (btintel_pcie_in_iml(data)) { in btintel_pcie_recv_event()
1116 if (btintel_test_and_clear_flag(data->hdev, in btintel_pcie_recv_event()
1118 btintel_wake_up_flag(data->hdev, in btintel_pcie_recv_event()
1138 if (skb->data[2] == 0x97) { in btintel_pcie_recv_event()
1150 static int btintel_pcie_recv_frame(struct btintel_pcie_data *data, in btintel_pcie_recv_frame() argument
1158 struct hci_dev *hdev = data->hdev; in btintel_pcie_recv_frame()
1160 spin_lock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
1250 spin_unlock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
1255 static void btintel_pcie_read_hwexp(struct btintel_pcie_data *data) in btintel_pcie_read_hwexp() argument
1271 switch (data->dmp_hdr.cnvi_top & 0xfff) { in btintel_pcie_read_hwexp()
1275 if (INTEL_CNVX_TOP_STEP(data->dmp_hdr.cnvi_top) != 0x01) in btintel_pcie_read_hwexp()
1285 bt_dev_err(data->hdev, "Unsupported cnvi 0x%8.8x", data->dmp_hdr.cnvi_top); in btintel_pcie_read_hwexp()
1293 btintel_pcie_mac_init(data); in btintel_pcie_read_hwexp()
1295 err = btintel_pcie_read_device_mem(data, buf, addr, len); in btintel_pcie_read_hwexp()
1301 bt_dev_err(data->hdev, "Invalid exception dump signature: 0x%8.8x", in btintel_pcie_read_hwexp()
1306 snprintf(prefix, sizeof(prefix), "Bluetooth: %s: ", bt_dev_name(data->hdev)); in btintel_pcie_read_hwexp()
1317 bt_dev_dbg(data->hdev, "Invalid TLV type 0"); in btintel_pcie_read_hwexp()
1334 bt_dev_dbg(data->hdev, "TLV packet length: %u", pkt_len); in btintel_pcie_read_hwexp()
1351 btintel_pcie_recv_frame(data, skb); in btintel_pcie_read_hwexp()
1358 static void btintel_pcie_msix_hw_exp_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_hw_exp_handler() argument
1360 bt_dev_err(data->hdev, "Received hw exception interrupt"); in btintel_pcie_msix_hw_exp_handler()
1362 if (test_and_set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1365 if (test_and_set_bit(BTINTEL_PCIE_HWEXP_INPROGRESS, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1369 if (!test_and_set_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1370 data->dmp_hdr.trigger_reason = BTINTEL_PCIE_TRIGGER_REASON_FW_ASSERT; in btintel_pcie_msix_hw_exp_handler()
1372 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_msix_hw_exp_handler()
1377 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_rx_work() local
1381 if (test_bit(BTINTEL_PCIE_HWEXP_INPROGRESS, &data->flags)) { in btintel_pcie_rx_work()
1389 btintel_pcie_read_hwexp(data); in btintel_pcie_rx_work()
1390 clear_bit(BTINTEL_PCIE_HWEXP_INPROGRESS, &data->flags); in btintel_pcie_rx_work()
1393 if (test_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) { in btintel_pcie_rx_work()
1394 btintel_pcie_dump_traces(data->hdev); in btintel_pcie_rx_work()
1395 clear_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags); in btintel_pcie_rx_work()
1399 while ((skb = skb_dequeue(&data->rx_skb_q))) { in btintel_pcie_rx_work()
1400 btintel_pcie_recv_frame(data, skb); in btintel_pcie_rx_work()
1405 static int btintel_pcie_submit_rx_work(struct btintel_pcie_data *data, u8 status, in btintel_pcie_submit_rx_work() argument
1428 skb_queue_tail(&data->rx_skb_q, skb); in btintel_pcie_submit_rx_work()
1429 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_submit_rx_work()
1432 ret = btintel_pcie_submit_rx(data); in btintel_pcie_submit_rx_work()
1438 static void btintel_pcie_msix_rx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_rx_handle() argument
1445 struct hci_dev *hdev = data->hdev; in btintel_pcie_msix_rx_handle()
1447 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
1448 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
1456 rxq = &data->rxq; in btintel_pcie_msix_rx_handle()
1463 ipc_print_urbd1(data->hdev, urbd1, cr_tia); in btintel_pcie_msix_rx_handle()
1472 ret = btintel_pcie_submit_rx_work(data, urbd1->status, in btintel_pcie_msix_rx_handle()
1473 buf->data); in btintel_pcie_msix_rx_handle()
1480 data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM] = cr_tia; in btintel_pcie_msix_rx_handle()
1481 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_msix_rx_handle()
1485 static irqreturn_t btintel_pcie_msix_isr(int irq, void *data) in btintel_pcie_msix_isr() argument
1490 static inline bool btintel_pcie_is_rxq_empty(struct btintel_pcie_data *data) in btintel_pcie_is_rxq_empty() argument
1492 return data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM] == data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_is_rxq_empty()
1495 static inline bool btintel_pcie_is_txackq_empty(struct btintel_pcie_data *data) in btintel_pcie_is_txackq_empty() argument
1497 return data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] == data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_is_txackq_empty()
1503 struct btintel_pcie_data *data = btintel_pcie_get_data(entry); in btintel_pcie_irq_msix_handler() local
1506 spin_lock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
1507 intr_fh = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES); in btintel_pcie_irq_msix_handler()
1508 intr_hw = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES); in btintel_pcie_irq_msix_handler()
1511 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES, intr_fh); in btintel_pcie_irq_msix_handler()
1512 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES, intr_hw); in btintel_pcie_irq_msix_handler()
1513 spin_unlock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
1522 btintel_pcie_msix_hw_exp_handler(data); in btintel_pcie_irq_msix_handler()
1525 btintel_pcie_msix_gp1_handler(data); in btintel_pcie_irq_msix_handler()
1531 btintel_pcie_msix_gp0_handler(data); in btintel_pcie_irq_msix_handler()
1535 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
1536 if (!btintel_pcie_is_rxq_empty(data)) in btintel_pcie_irq_msix_handler()
1537 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
1542 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
1543 if (!btintel_pcie_is_txackq_empty(data)) in btintel_pcie_irq_msix_handler()
1544 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
1555 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_AUTOMASK_ST, in btintel_pcie_irq_msix_handler()
1564 static int btintel_pcie_setup_irq(struct btintel_pcie_data *data) in btintel_pcie_setup_irq() argument
1570 data->msix_entries[i].entry = i; in btintel_pcie_setup_irq()
1572 num_irqs = pci_alloc_irq_vectors(data->pdev, BTINTEL_PCIE_MSIX_VEC_MIN, in btintel_pcie_setup_irq()
1577 data->alloc_vecs = num_irqs; in btintel_pcie_setup_irq()
1578 data->msix_enabled = 1; in btintel_pcie_setup_irq()
1579 data->def_irq = 0; in btintel_pcie_setup_irq()
1582 for (i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_setup_irq()
1585 msix_entry = &data->msix_entries[i]; in btintel_pcie_setup_irq()
1586 msix_entry->vector = pci_irq_vector(data->pdev, i); in btintel_pcie_setup_irq()
1588 err = devm_request_threaded_irq(&data->pdev->dev, in btintel_pcie_setup_irq()
1596 pci_free_irq_vectors(data->pdev); in btintel_pcie_setup_irq()
1597 data->alloc_vecs = 0; in btintel_pcie_setup_irq()
1624 static void btintel_pcie_config_msix(struct btintel_pcie_data *data) in btintel_pcie_config_msix() argument
1627 int val = data->def_irq | BTINTEL_PCIE_MSIX_NON_AUTO_CLEAR_CAUSE; in btintel_pcie_config_msix()
1631 btintel_pcie_wr_reg8(data, in btintel_pcie_config_msix()
1634 btintel_pcie_clr_reg_bits(data, in btintel_pcie_config_msix()
1640 data->fh_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK); in btintel_pcie_config_msix()
1641 data->hw_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK); in btintel_pcie_config_msix()
1645 struct btintel_pcie_data *data) in btintel_pcie_config_pcie() argument
1662 data->base_addr = pcim_iomap_region(pdev, 0, KBUILD_MODNAME); in btintel_pcie_config_pcie()
1663 if (IS_ERR(data->base_addr)) in btintel_pcie_config_pcie()
1664 return PTR_ERR(data->base_addr); in btintel_pcie_config_pcie()
1666 err = btintel_pcie_setup_irq(data); in btintel_pcie_config_pcie()
1671 btintel_pcie_config_msix(data); in btintel_pcie_config_pcie()
1676 static void btintel_pcie_init_ci(struct btintel_pcie_data *data, in btintel_pcie_init_ci() argument
1682 ci->addr_cr_hia = data->ia.cr_hia_p_addr; in btintel_pcie_init_ci()
1683 ci->addr_tr_tia = data->ia.tr_tia_p_addr; in btintel_pcie_init_ci()
1684 ci->addr_cr_tia = data->ia.cr_tia_p_addr; in btintel_pcie_init_ci()
1685 ci->addr_tr_hia = data->ia.tr_hia_p_addr; in btintel_pcie_init_ci()
1688 ci->addr_urbdq0 = data->txq.urbd0s_p_addr; in btintel_pcie_init_ci()
1689 ci->addr_tfdq = data->txq.tfds_p_addr; in btintel_pcie_init_ci()
1690 ci->num_tfdq = data->txq.count; in btintel_pcie_init_ci()
1691 ci->num_urbdq0 = data->txq.count; in btintel_pcie_init_ci()
1695 ci->addr_frbdq = data->rxq.frbds_p_addr; in btintel_pcie_init_ci()
1696 ci->num_frbdq = data->rxq.count; in btintel_pcie_init_ci()
1698 ci->addr_urbdq1 = data->rxq.urbd1s_p_addr; in btintel_pcie_init_ci()
1699 ci->num_urbdq1 = data->rxq.count; in btintel_pcie_init_ci()
1703 ci->dbgc_addr = data->dbgc.frag_p_addr; in btintel_pcie_init_ci()
1704 ci->dbgc_size = data->dbgc.frag_size; in btintel_pcie_init_ci()
1708 static void btintel_pcie_free_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_txq_bufs() argument
1712 dma_free_coherent(&data->pdev->dev, txq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_txq_bufs()
1717 static int btintel_pcie_setup_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_txq_bufs() argument
1731 txq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_txq_bufs()
1746 buf->data = txq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_txq_bufs()
1752 static void btintel_pcie_free_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_rxq_bufs() argument
1756 dma_free_coherent(&data->pdev->dev, rxq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_rxq_bufs()
1761 static int btintel_pcie_setup_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_rxq_bufs() argument
1775 rxq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_rxq_bufs()
1790 buf->data = rxq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_rxq_bufs()
1796 static void btintel_pcie_setup_ia(struct btintel_pcie_data *data, in btintel_pcie_setup_ia() argument
1817 static void btintel_pcie_free(struct btintel_pcie_data *data) in btintel_pcie_free() argument
1819 btintel_pcie_free_rxq_bufs(data, &data->rxq); in btintel_pcie_free()
1820 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_free()
1822 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_free()
1823 dma_pool_destroy(data->dma_pool); in btintel_pcie_free()
1828 static int btintel_pcie_alloc(struct btintel_pcie_data *data) in btintel_pcie_alloc() argument
1855 data->dma_pool = dma_pool_create(KBUILD_MODNAME, &data->pdev->dev, in btintel_pcie_alloc()
1857 if (!data->dma_pool) { in btintel_pcie_alloc()
1862 v_addr = dma_pool_zalloc(data->dma_pool, GFP_KERNEL | __GFP_NOWARN, in btintel_pcie_alloc()
1865 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
1870 data->dma_p_addr = p_addr; in btintel_pcie_alloc()
1871 data->dma_v_addr = v_addr; in btintel_pcie_alloc()
1874 data->txq.count = BTINTEL_PCIE_TX_DESCS_COUNT; in btintel_pcie_alloc()
1875 data->rxq.count = BTINTEL_PCIE_RX_DESCS_COUNT; in btintel_pcie_alloc()
1878 data->txq.tfds_p_addr = p_addr; in btintel_pcie_alloc()
1879 data->txq.tfds = v_addr; in btintel_pcie_alloc()
1885 data->txq.urbd0s_p_addr = p_addr; in btintel_pcie_alloc()
1886 data->txq.urbd0s = v_addr; in btintel_pcie_alloc()
1892 data->rxq.frbds_p_addr = p_addr; in btintel_pcie_alloc()
1893 data->rxq.frbds = v_addr; in btintel_pcie_alloc()
1899 data->rxq.urbd1s_p_addr = p_addr; in btintel_pcie_alloc()
1900 data->rxq.urbd1s = v_addr; in btintel_pcie_alloc()
1906 err = btintel_pcie_setup_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
1911 err = btintel_pcie_setup_rxq_bufs(data, &data->rxq); in btintel_pcie_alloc()
1916 btintel_pcie_setup_ia(data, p_addr, v_addr, &data->ia); in btintel_pcie_alloc()
1919 err = btintel_pcie_setup_dbgc(data); in btintel_pcie_alloc()
1927 data->ci = v_addr; in btintel_pcie_alloc()
1928 data->ci_p_addr = p_addr; in btintel_pcie_alloc()
1931 btintel_pcie_init_ci(data, data->ci); in btintel_pcie_alloc()
1936 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
1938 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_alloc()
1939 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
1986 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_send_frame() local
1992 if (test_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags)) in btintel_pcie_send_frame()
2012 cmd = (void *)skb->data; in btintel_pcie_send_frame()
2015 struct hci_command_hdr *cmd = (void *)skb->data; in btintel_pcie_send_frame()
2045 ret = btintel_pcie_send_sync(data, skb, type, opcode); in btintel_pcie_send_frame()
2059 static void btintel_pcie_release_hdev(struct btintel_pcie_data *data) in btintel_pcie_release_hdev() argument
2063 hdev = data->hdev; in btintel_pcie_release_hdev()
2066 data->hdev = NULL; in btintel_pcie_release_hdev()
2069 static void btintel_pcie_disable_interrupts(struct btintel_pcie_data *data) in btintel_pcie_disable_interrupts() argument
2071 spin_lock(&data->irq_lock); in btintel_pcie_disable_interrupts()
2072 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, data->fh_init_mask); in btintel_pcie_disable_interrupts()
2073 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, data->hw_init_mask); in btintel_pcie_disable_interrupts()
2074 spin_unlock(&data->irq_lock); in btintel_pcie_disable_interrupts()
2077 static void btintel_pcie_enable_interrupts(struct btintel_pcie_data *data) in btintel_pcie_enable_interrupts() argument
2079 spin_lock(&data->irq_lock); in btintel_pcie_enable_interrupts()
2080 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, ~data->fh_init_mask); in btintel_pcie_enable_interrupts()
2081 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, ~data->hw_init_mask); in btintel_pcie_enable_interrupts()
2082 spin_unlock(&data->irq_lock); in btintel_pcie_enable_interrupts()
2085 static void btintel_pcie_synchronize_irqs(struct btintel_pcie_data *data) in btintel_pcie_synchronize_irqs() argument
2087 for (int i = 0; i < data->alloc_vecs; i++) in btintel_pcie_synchronize_irqs()
2088 synchronize_irq(data->msix_entries[i].vector); in btintel_pcie_synchronize_irqs()
2093 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup_internal() local
2109 if (skb->data[0]) { in btintel_pcie_setup_internal()
2111 skb->data[0]); in btintel_pcie_setup_internal()
2177 data->dmp_hdr.cnvi_top = ver_tlv.cnvi_top; in btintel_pcie_setup_internal()
2178 data->dmp_hdr.cnvr_top = ver_tlv.cnvr_top; in btintel_pcie_setup_internal()
2179 data->dmp_hdr.fw_timestamp = ver_tlv.timestamp; in btintel_pcie_setup_internal()
2180 data->dmp_hdr.fw_build_type = ver_tlv.build_type; in btintel_pcie_setup_internal()
2181 data->dmp_hdr.fw_build_num = ver_tlv.build_num; in btintel_pcie_setup_internal()
2182 data->dmp_hdr.cnvi_bt = ver_tlv.cnvi_bt; in btintel_pcie_setup_internal()
2185 data->dmp_hdr.fw_git_sha1 = ver_tlv.git_sha1; in btintel_pcie_setup_internal()
2204 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup() local
2210 btintel_pcie_disable_interrupts(data); in btintel_pcie_setup()
2211 btintel_pcie_synchronize_irqs(data); in btintel_pcie_setup()
2212 err = btintel_pcie_reset_bt(data); in btintel_pcie_setup()
2218 btintel_pcie_reset_ia(data); in btintel_pcie_setup()
2219 btintel_pcie_enable_interrupts(data); in btintel_pcie_setup()
2220 btintel_pcie_config_msix(data); in btintel_pcie_setup()
2221 err = btintel_pcie_enable_bt(data); in btintel_pcie_setup()
2226 btintel_pcie_start_rx(data); in btintel_pcie_setup()
2230 set_bit(BTINTEL_PCIE_SETUP_DONE, &data->flags); in btintel_pcie_setup()
2237 struct btintel_pcie_dev_recovery *tmp, *data = NULL; in btintel_pcie_get_recovery() local
2245 data = tmp; in btintel_pcie_get_recovery()
2250 if (data) { in btintel_pcie_get_recovery()
2251 bt_dev_dbg(hdev, "Found restart data for BDF: %s", data->name); in btintel_pcie_get_recovery()
2252 return data; in btintel_pcie_get_recovery()
2255 data = kzalloc(struct_size(data, name, strlen(name) + 1), GFP_ATOMIC); in btintel_pcie_get_recovery()
2256 if (!data) in btintel_pcie_get_recovery()
2259 strscpy_pad(data->name, name, strlen(name) + 1); in btintel_pcie_get_recovery()
2261 list_add_tail(&data->list, &btintel_pcie_recovery_list); in btintel_pcie_get_recovery()
2264 return data; in btintel_pcie_get_recovery()
2281 struct btintel_pcie_dev_recovery *data; in btintel_pcie_inc_recovery_count() local
2284 data = btintel_pcie_get_recovery(pdev, dev); in btintel_pcie_inc_recovery_count()
2285 if (!data) in btintel_pcie_inc_recovery_count()
2288 retry_window = ktime_get_boottime_seconds() - data->last_error; in btintel_pcie_inc_recovery_count()
2289 if (data->count == 0) { in btintel_pcie_inc_recovery_count()
2290 data->last_error = ktime_get_boottime_seconds(); in btintel_pcie_inc_recovery_count()
2291 data->count++; in btintel_pcie_inc_recovery_count()
2293 data->count <= BTINTEL_PCIE_FLR_MAX_RETRY) { in btintel_pcie_inc_recovery_count()
2294 data->count++; in btintel_pcie_inc_recovery_count()
2296 data->last_error = 0; in btintel_pcie_inc_recovery_count()
2297 data->count = 0; in btintel_pcie_inc_recovery_count()
2301 static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data);
2308 struct btintel_pcie_data *data; in btintel_pcie_removal_work() local
2316 data = pci_get_drvdata(pdev); in btintel_pcie_removal_work()
2318 btintel_pcie_disable_interrupts(data); in btintel_pcie_removal_work()
2319 btintel_pcie_synchronize_irqs(data); in btintel_pcie_removal_work()
2321 flush_work(&data->rx_work); in btintel_pcie_removal_work()
2322 flush_work(&data->hdev->dump.dump_rx); in btintel_pcie_removal_work()
2324 bt_dev_dbg(data->hdev, "Release bluetooth interface"); in btintel_pcie_removal_work()
2325 btintel_pcie_release_hdev(data); in btintel_pcie_removal_work()
2333 btintel_pcie_enable_interrupts(data); in btintel_pcie_removal_work()
2334 btintel_pcie_config_msix(data); in btintel_pcie_removal_work()
2336 err = btintel_pcie_enable_bt(data); in btintel_pcie_removal_work()
2343 btintel_pcie_reset_ia(data); in btintel_pcie_removal_work()
2344 btintel_pcie_start_rx(data); in btintel_pcie_removal_work()
2345 data->flags = 0; in btintel_pcie_removal_work()
2347 err = btintel_pcie_setup_hdev(data); in btintel_pcie_removal_work()
2361 struct btintel_pcie_data *data; in btintel_pcie_reset() local
2363 data = hci_get_drvdata(hdev); in btintel_pcie_reset()
2365 if (!test_bit(BTINTEL_PCIE_SETUP_DONE, &data->flags)) in btintel_pcie_reset()
2368 if (test_and_set_bit(BTINTEL_PCIE_RECOVERY_IN_PROGRESS, &data->flags)) in btintel_pcie_reset()
2375 removal->pdev = data->pdev; in btintel_pcie_reset()
2383 struct btintel_pcie_dev_recovery *data; in btintel_pcie_hw_error() local
2393 data = btintel_pcie_get_recovery(pdev, &hdev->dev); in btintel_pcie_hw_error()
2394 if (!data) in btintel_pcie_hw_error()
2397 retry_window = ktime_get_boottime_seconds() - data->last_error; in btintel_pcie_hw_error()
2400 data->count >= BTINTEL_PCIE_FLR_MAX_RETRY) { in btintel_pcie_hw_error()
2402 BTINTEL_PCIE_FLR_MAX_RETRY, data->count); in btintel_pcie_hw_error()
2406 data->last_error); in btintel_pcie_hw_error()
2413 static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data) in btintel_pcie_setup_hdev() argument
2423 hci_set_drvdata(hdev, data); in btintel_pcie_setup_hdev()
2425 data->hdev = hdev; in btintel_pcie_setup_hdev()
2426 SET_HCIDEV_DEV(hdev, &data->pdev->dev); in btintel_pcie_setup_hdev()
2445 data->dmp_hdr.driver_name = KBUILD_MODNAME; in btintel_pcie_setup_hdev()
2457 struct btintel_pcie_data *data; in btintel_pcie_probe() local
2462 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in btintel_pcie_probe()
2463 if (!data) in btintel_pcie_probe()
2466 data->pdev = pdev; in btintel_pcie_probe()
2468 spin_lock_init(&data->irq_lock); in btintel_pcie_probe()
2469 spin_lock_init(&data->hci_rx_lock); in btintel_pcie_probe()
2471 init_waitqueue_head(&data->gp0_wait_q); in btintel_pcie_probe()
2472 data->gp0_received = false; in btintel_pcie_probe()
2474 init_waitqueue_head(&data->tx_wait_q); in btintel_pcie_probe()
2475 data->tx_wait_done = false; in btintel_pcie_probe()
2477 data->workqueue = alloc_ordered_workqueue(KBUILD_MODNAME, WQ_HIGHPRI); in btintel_pcie_probe()
2478 if (!data->workqueue) in btintel_pcie_probe()
2481 skb_queue_head_init(&data->rx_skb_q); in btintel_pcie_probe()
2482 INIT_WORK(&data->rx_work, btintel_pcie_rx_work); in btintel_pcie_probe()
2484 data->boot_stage_cache = 0x00; in btintel_pcie_probe()
2485 data->img_resp_cache = 0x00; in btintel_pcie_probe()
2487 err = btintel_pcie_config_pcie(pdev, data); in btintel_pcie_probe()
2491 pci_set_drvdata(pdev, data); in btintel_pcie_probe()
2493 err = btintel_pcie_alloc(data); in btintel_pcie_probe()
2497 err = btintel_pcie_enable_bt(data); in btintel_pcie_probe()
2502 data->cnvi = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_HW_REV_REG); in btintel_pcie_probe()
2504 data->cnvr = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_RF_ID_REG); in btintel_pcie_probe()
2506 err = btintel_pcie_start_rx(data); in btintel_pcie_probe()
2510 err = btintel_pcie_setup_hdev(data); in btintel_pcie_probe()
2514 bt_dev_dbg(data->hdev, "cnvi: 0x%8.8x cnvr: 0x%8.8x", data->cnvi, in btintel_pcie_probe()
2515 data->cnvr); in btintel_pcie_probe()
2520 btintel_pcie_reset_bt(data); in btintel_pcie_probe()
2531 struct btintel_pcie_data *data; in btintel_pcie_remove() local
2533 data = pci_get_drvdata(pdev); in btintel_pcie_remove()
2535 btintel_pcie_disable_interrupts(data); in btintel_pcie_remove()
2537 btintel_pcie_synchronize_irqs(data); in btintel_pcie_remove()
2539 flush_work(&data->rx_work); in btintel_pcie_remove()
2541 btintel_pcie_reset_bt(data); in btintel_pcie_remove()
2542 for (int i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_remove()
2545 msix_entry = &data->msix_entries[i]; in btintel_pcie_remove()
2551 btintel_pcie_release_hdev(data); in btintel_pcie_remove()
2553 destroy_workqueue(data->workqueue); in btintel_pcie_remove()
2555 btintel_pcie_free(data); in btintel_pcie_remove()
2566 struct btintel_pcie_data *data = pci_get_drvdata(pdev); in btintel_pcie_coredump() local
2568 if (test_and_set_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) in btintel_pcie_coredump()
2571 data->dmp_hdr.trigger_reason = BTINTEL_PCIE_TRIGGER_REASON_USER_TRIGGER; in btintel_pcie_coredump()
2572 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_coredump()