Lines Matching full:data
154 static int btintel_pcie_setup_dbgc(struct btintel_pcie_data *data) in btintel_pcie_setup_dbgc() argument
160 data->dbgc.count = BTINTEL_PCIE_DBGC_BUFFER_COUNT; in btintel_pcie_setup_dbgc()
161 data->dbgc.bufs = devm_kcalloc(&data->pdev->dev, data->dbgc.count, in btintel_pcie_setup_dbgc()
163 if (!data->dbgc.bufs) in btintel_pcie_setup_dbgc()
166 data->dbgc.buf_v_addr = dmam_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_dbgc()
167 data->dbgc.count * in btintel_pcie_setup_dbgc()
169 &data->dbgc.buf_p_addr, in btintel_pcie_setup_dbgc()
171 if (!data->dbgc.buf_v_addr) in btintel_pcie_setup_dbgc()
174 data->dbgc.frag_v_addr = dmam_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_dbgc()
176 &data->dbgc.frag_p_addr, in btintel_pcie_setup_dbgc()
178 if (!data->dbgc.frag_v_addr) in btintel_pcie_setup_dbgc()
181 data->dbgc.frag_size = sizeof(struct btintel_pcie_dbgc_ctxt); in btintel_pcie_setup_dbgc()
188 for (i = 0; i < data->dbgc.count; i++) { in btintel_pcie_setup_dbgc()
189 buf = &data->dbgc.bufs[i]; in btintel_pcie_setup_dbgc()
190 buf->data_p_addr = data->dbgc.buf_p_addr + i * BTINTEL_PCIE_DBGC_BUFFER_SIZE; in btintel_pcie_setup_dbgc()
191 buf->data = data->dbgc.buf_v_addr + i * BTINTEL_PCIE_DBGC_BUFFER_SIZE; in btintel_pcie_setup_dbgc()
197 memcpy(data->dbgc.frag_v_addr, &db_frag, sizeof(db_frag)); in btintel_pcie_setup_dbgc()
228 static void btintel_pcie_set_tx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_tx_db() argument
235 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_tx_db()
238 /* Copy the data to next(@tfd_index) data buffer and update the TFD(transfer
239 * descriptor) with the data length and the DMA address of the data buffer.
255 /* Copy the outgoing data to DMA buffer */ in btintel_pcie_prepare_tx()
256 memcpy(buf->data, skb->data, tfd->size); in btintel_pcie_prepare_tx()
261 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_debug_registers() local
275 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_dump_debug_registers()
279 data->boot_stage_cache = reg; in btintel_pcie_dump_debug_registers()
281 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_STATUS_REG); in btintel_pcie_dump_debug_registers()
286 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_CONTROL_REG); in btintel_pcie_dump_debug_registers()
291 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG); in btintel_pcie_dump_debug_registers()
297 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MBOX_STATUS_REG); in btintel_pcie_dump_debug_registers()
301 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
309 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
317 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
325 mbox_reg = btintel_pcie_rd_reg32(data, in btintel_pcie_dump_debug_registers()
332 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_dump_debug_registers()
333 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_dump_debug_registers()
338 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_dump_debug_registers()
339 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_dump_debug_registers()
349 static int btintel_pcie_send_sync(struct btintel_pcie_data *data, in btintel_pcie_send_sync() argument
356 struct hci_dev *hdev = data->hdev; in btintel_pcie_send_sync()
358 struct txq *txq = &data->txq; in btintel_pcie_send_sync()
360 tfd_index = data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_send_sync()
372 data->gp0_received = false; in btintel_pcie_send_sync()
373 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_send_sync()
374 data->alive_intr_ctxt = in btintel_pcie_send_sync()
377 bt_dev_dbg(data->hdev, "sending cmd: 0x%4.4x alive context changed: %s -> %s", in btintel_pcie_send_sync()
379 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_sync()
385 /* Prepare for TX. It updates the TFD with the length of data and in btintel_pcie_send_sync()
386 * address of the DMA buffer, and copy the data to the DMA buffer in btintel_pcie_send_sync()
391 data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM] = tfd_index; in btintel_pcie_send_sync()
394 data->tx_wait_done = false; in btintel_pcie_send_sync()
397 btintel_pcie_set_tx_db(data, tfd_index); in btintel_pcie_send_sync()
400 ret = wait_event_timeout(data->tx_wait_q, data->tx_wait_done, in btintel_pcie_send_sync()
403 bt_dev_err(data->hdev, "Timeout (%u ms) on tx completion", in btintel_pcie_send_sync()
405 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_send_sync()
410 ret = wait_event_timeout(data->gp0_wait_q, in btintel_pcie_send_sync()
411 data->gp0_received, in btintel_pcie_send_sync()
417 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_sync()
425 * is available to receive the data
427 static void btintel_pcie_set_rx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_rx_db() argument
434 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_rx_db()
456 static int btintel_pcie_submit_rx(struct btintel_pcie_data *data) in btintel_pcie_submit_rx() argument
459 struct rxq *rxq = &data->rxq; in btintel_pcie_submit_rx()
461 frbd_index = data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_submit_rx()
472 data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM] = frbd_index; in btintel_pcie_submit_rx()
473 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_submit_rx()
476 btintel_pcie_set_rx_db(data, frbd_index); in btintel_pcie_submit_rx()
481 static int btintel_pcie_start_rx(struct btintel_pcie_data *data) in btintel_pcie_start_rx() argument
484 struct rxq *rxq = &data->rxq; in btintel_pcie_start_rx()
491 ret = btintel_pcie_submit_rx(data); in btintel_pcie_start_rx()
499 static void btintel_pcie_reset_ia(struct btintel_pcie_data *data) in btintel_pcie_reset_ia() argument
501 memset(data->ia.tr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
502 memset(data->ia.tr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
503 memset(data->ia.cr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
504 memset(data->ia.cr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
507 static int btintel_pcie_reset_bt(struct btintel_pcie_data *data) in btintel_pcie_reset_bt() argument
512 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
519 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
522 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
530 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
536 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
539 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
540 bt_dev_dbg(data->hdev, "csr register after reset: 0x%8.8x", reg); in btintel_pcie_reset_bt()
542 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_reset_bt()
550 static void btintel_pcie_mac_init(struct btintel_pcie_data *data) in btintel_pcie_mac_init() argument
555 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_mac_init()
561 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_mac_init()
564 static int btintel_pcie_get_mac_access(struct btintel_pcie_data *data) in btintel_pcie_get_mac_access() argument
569 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_get_mac_access()
576 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_get_mac_access()
579 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_get_mac_access()
590 static void btintel_pcie_release_mac_access(struct btintel_pcie_data *data) in btintel_pcie_release_mac_access() argument
594 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_release_mac_access()
605 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_release_mac_access()
609 void *data, size_t size) in btintel_pcie_copy_tlv() argument
616 memcpy(tlv->val, data, tlv->len); in btintel_pcie_copy_tlv()
620 static int btintel_pcie_read_dram_buffers(struct btintel_pcie_data *data) in btintel_pcie_read_dram_buffers() argument
623 struct btintel_pcie_dbgc *dbgc = &data->dbgc; in btintel_pcie_read_dram_buffers()
624 struct hci_dev *hdev = data->hdev; in btintel_pcie_read_dram_buffers()
638 wr_ptr_status = btintel_pcie_rd_dev_mem(data, BTINTEL_PCIE_DBGC_CUR_DBGBUFF_STATUS); in btintel_pcie_read_dram_buffers()
649 data->dmp_hdr.write_ptr = prev_size + offset; in btintel_pcie_read_dram_buffers()
655 data->dmp_hdr.driver_name); in btintel_pcie_read_dram_buffers()
665 2000 + (data->dmp_hdr.fw_timestamp >> 8), in btintel_pcie_read_dram_buffers()
666 data->dmp_hdr.fw_timestamp & 0xff, data->dmp_hdr.fw_build_type, in btintel_pcie_read_dram_buffers()
667 data->dmp_hdr.fw_build_num); in btintel_pcie_read_dram_buffers()
669 data_len = sizeof(*tlv) + sizeof(data->dmp_hdr.cnvi_bt) + in btintel_pcie_read_dram_buffers()
670 sizeof(*tlv) + sizeof(data->dmp_hdr.write_ptr) + in btintel_pcie_read_dram_buffers()
671 sizeof(*tlv) + sizeof(data->dmp_hdr.wrap_ctr) + in btintel_pcie_read_dram_buffers()
672 sizeof(*tlv) + sizeof(data->dmp_hdr.trigger_reason) + in btintel_pcie_read_dram_buffers()
673 sizeof(*tlv) + sizeof(data->dmp_hdr.fw_git_sha1) + in btintel_pcie_read_dram_buffers()
674 sizeof(*tlv) + sizeof(data->dmp_hdr.cnvr_top) + in btintel_pcie_read_dram_buffers()
675 sizeof(*tlv) + sizeof(data->dmp_hdr.cnvi_top) + in btintel_pcie_read_dram_buffers()
683 * sizeof(data_len) - to store tlv data size in btintel_pcie_read_dram_buffers()
684 * data_len - TLV data in btintel_pcie_read_dram_buffers()
689 /* Add debug buffers data length to dump size */ in btintel_pcie_read_dram_buffers()
709 p = btintel_pcie_copy_tlv(p, BTINTEL_CNVI_BT, &data->dmp_hdr.cnvi_bt, in btintel_pcie_read_dram_buffers()
710 sizeof(data->dmp_hdr.cnvi_bt)); in btintel_pcie_read_dram_buffers()
711 p = btintel_pcie_copy_tlv(p, BTINTEL_WRITE_PTR, &data->dmp_hdr.write_ptr, in btintel_pcie_read_dram_buffers()
712 sizeof(data->dmp_hdr.write_ptr)); in btintel_pcie_read_dram_buffers()
713 p = btintel_pcie_copy_tlv(p, BTINTEL_WRAP_CTR, &data->dmp_hdr.wrap_ctr, in btintel_pcie_read_dram_buffers()
714 sizeof(data->dmp_hdr.wrap_ctr)); in btintel_pcie_read_dram_buffers()
716 data->dmp_hdr.wrap_ctr = btintel_pcie_rd_dev_mem(data, in btintel_pcie_read_dram_buffers()
719 p = btintel_pcie_copy_tlv(p, BTINTEL_TRIGGER_REASON, &data->dmp_hdr.trigger_reason, in btintel_pcie_read_dram_buffers()
720 sizeof(data->dmp_hdr.trigger_reason)); in btintel_pcie_read_dram_buffers()
721 p = btintel_pcie_copy_tlv(p, BTINTEL_FW_SHA, &data->dmp_hdr.fw_git_sha1, in btintel_pcie_read_dram_buffers()
722 sizeof(data->dmp_hdr.fw_git_sha1)); in btintel_pcie_read_dram_buffers()
723 p = btintel_pcie_copy_tlv(p, BTINTEL_CNVR_TOP, &data->dmp_hdr.cnvr_top, in btintel_pcie_read_dram_buffers()
724 sizeof(data->dmp_hdr.cnvr_top)); in btintel_pcie_read_dram_buffers()
725 p = btintel_pcie_copy_tlv(p, BTINTEL_CNVI_TOP, &data->dmp_hdr.cnvi_top, in btintel_pcie_read_dram_buffers()
726 sizeof(data->dmp_hdr.cnvi_top)); in btintel_pcie_read_dram_buffers()
728 memcpy(p, dbgc->bufs[0].data, dbgc->count * BTINTEL_PCIE_DBGC_BUFFER_SIZE); in btintel_pcie_read_dram_buffers()
735 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_dump_traces() local
738 ret = btintel_pcie_get_mac_access(data); in btintel_pcie_dump_traces()
744 ret = btintel_pcie_read_dram_buffers(data); in btintel_pcie_dump_traces()
746 btintel_pcie_release_mac_access(data); in btintel_pcie_dump_traces()
758 static int btintel_pcie_enable_bt(struct btintel_pcie_data *data) in btintel_pcie_enable_bt() argument
763 data->gp0_received = false; in btintel_pcie_enable_bt()
766 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_LSB_REG, in btintel_pcie_enable_bt()
767 data->ci_p_addr & 0xffffffff); in btintel_pcie_enable_bt()
768 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG, in btintel_pcie_enable_bt()
769 (u64)data->ci_p_addr >> 32); in btintel_pcie_enable_bt()
774 data->boot_stage_cache = 0x0; in btintel_pcie_enable_bt()
777 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
784 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_enable_bt()
787 btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, in btintel_pcie_enable_bt()
790 btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
795 data->alive_intr_ctxt = BTINTEL_PCIE_ROM; in btintel_pcie_enable_bt()
796 err = wait_event_timeout(data->gp0_wait_q, data->gp0_received, in btintel_pcie_enable_bt()
802 if (~data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ROM) in btintel_pcie_enable_bt()
808 static inline bool btintel_pcie_in_op(struct btintel_pcie_data *data) in btintel_pcie_in_op() argument
810 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW; in btintel_pcie_in_op()
813 static inline bool btintel_pcie_in_iml(struct btintel_pcie_data *data) in btintel_pcie_in_iml() argument
815 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML && in btintel_pcie_in_iml()
816 !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW); in btintel_pcie_in_iml()
819 static inline bool btintel_pcie_in_d3(struct btintel_pcie_data *data) in btintel_pcie_in_d3() argument
821 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY; in btintel_pcie_in_d3()
824 static inline bool btintel_pcie_in_d0(struct btintel_pcie_data *data) in btintel_pcie_in_d0() argument
826 return !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY); in btintel_pcie_in_d0()
829 static inline bool btintel_pcie_in_device_halt(struct btintel_pcie_data *data) in btintel_pcie_in_device_halt() argument
831 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_DEVICE_HALTED; in btintel_pcie_in_device_halt()
834 static void btintel_pcie_wr_sleep_cntrl(struct btintel_pcie_data *data, in btintel_pcie_wr_sleep_cntrl() argument
837 bt_dev_dbg(data->hdev, "writing sleep_ctl_reg: 0x%8.8x", dxstate); in btintel_pcie_wr_sleep_cntrl()
838 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG, dxstate); in btintel_pcie_wr_sleep_cntrl()
841 static int btintel_pcie_read_device_mem(struct btintel_pcie_data *data, in btintel_pcie_read_device_mem() argument
848 err = btintel_pcie_get_mac_access(data); in btintel_pcie_read_device_mem()
850 bt_dev_err(data->hdev, "Failed to get mac access %d", err); in btintel_pcie_read_device_mem()
855 *val = btintel_pcie_rd_dev_mem(data, dev_addr); in btintel_pcie_read_device_mem()
857 btintel_pcie_release_mac_access(data); in btintel_pcie_read_device_mem()
862 static inline bool btintel_pcie_in_lockdown(struct btintel_pcie_data *data) in btintel_pcie_in_lockdown() argument
864 return (data->boot_stage_cache & in btintel_pcie_in_lockdown()
866 (data->boot_stage_cache & in btintel_pcie_in_lockdown()
870 static inline bool btintel_pcie_in_error(struct btintel_pcie_data *data) in btintel_pcie_in_error() argument
872 return (data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_DEVICE_ERR) || in btintel_pcie_in_error()
873 (data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ABORT_HANDLER); in btintel_pcie_in_error()
876 static void btintel_pcie_msix_gp1_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp1_handler() argument
878 bt_dev_err(data->hdev, "Received gp1 mailbox interrupt"); in btintel_pcie_msix_gp1_handler()
879 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp1_handler()
885 static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp0_handler() argument
894 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_msix_gp0_handler()
895 if (reg != data->boot_stage_cache) in btintel_pcie_msix_gp0_handler()
896 data->boot_stage_cache = reg; in btintel_pcie_msix_gp0_handler()
898 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()
899 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt), in btintel_pcie_msix_gp0_handler()
900 data->boot_stage_cache, reg); in btintel_pcie_msix_gp0_handler()
901 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IMG_RESPONSE_REG); in btintel_pcie_msix_gp0_handler()
902 if (reg != data->img_resp_cache) in btintel_pcie_msix_gp0_handler()
903 data->img_resp_cache = reg; in btintel_pcie_msix_gp0_handler()
905 if (btintel_pcie_in_error(data)) { in btintel_pcie_msix_gp0_handler()
906 bt_dev_err(data->hdev, "Controller in error state"); in btintel_pcie_msix_gp0_handler()
907 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp0_handler()
911 if (btintel_pcie_in_lockdown(data)) { in btintel_pcie_msix_gp0_handler()
912 bt_dev_err(data->hdev, "Controller in lockdown state"); in btintel_pcie_msix_gp0_handler()
913 btintel_pcie_dump_debug_registers(data->hdev); in btintel_pcie_msix_gp0_handler()
917 data->gp0_received = true; in btintel_pcie_msix_gp0_handler()
919 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_msix_gp0_handler()
923 switch (data->alive_intr_ctxt) { in btintel_pcie_msix_gp0_handler()
925 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
934 if (btintel_pcie_in_op(data)) { in btintel_pcie_msix_gp0_handler()
940 if (btintel_pcie_in_iml(data)) { in btintel_pcie_msix_gp0_handler()
943 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
948 if (btintel_test_and_clear_flag(data->hdev, INTEL_WAIT_FOR_D0)) { in btintel_pcie_msix_gp0_handler()
949 btintel_wake_up_flag(data->hdev, INTEL_WAIT_FOR_D0); in btintel_pcie_msix_gp0_handler()
950 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
954 if (btintel_pcie_in_d3(data)) { in btintel_pcie_msix_gp0_handler()
955 data->alive_intr_ctxt = BTINTEL_PCIE_D3; in btintel_pcie_msix_gp0_handler()
961 if (btintel_pcie_in_d0(data)) { in btintel_pcie_msix_gp0_handler()
962 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
969 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
974 bt_dev_err(data->hdev, "Unknown state: 0x%2.2x", in btintel_pcie_msix_gp0_handler()
975 data->alive_intr_ctxt); in btintel_pcie_msix_gp0_handler()
980 btintel_pcie_reset_ia(data); in btintel_pcie_msix_gp0_handler()
981 btintel_pcie_start_rx(data); in btintel_pcie_msix_gp0_handler()
985 bt_dev_dbg(data->hdev, "wake up gp0 wait_q"); in btintel_pcie_msix_gp0_handler()
986 wake_up(&data->gp0_wait_q); in btintel_pcie_msix_gp0_handler()
989 if (old_ctxt != data->alive_intr_ctxt) in btintel_pcie_msix_gp0_handler()
990 bt_dev_dbg(data->hdev, "alive context changed: %s -> %s", in btintel_pcie_msix_gp0_handler()
992 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_msix_gp0_handler()
997 static void btintel_pcie_msix_tx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_tx_handle() argument
1003 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
1004 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
1009 txq = &data->txq; in btintel_pcie_msix_tx_handle()
1012 data->tx_wait_done = true; in btintel_pcie_msix_tx_handle()
1013 wake_up(&data->tx_wait_q); in btintel_pcie_msix_tx_handle()
1021 data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] = cr_tia; in btintel_pcie_msix_tx_handle()
1022 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_TXQ_NUM); in btintel_pcie_msix_tx_handle()
1028 struct hci_event_hdr *hdr = (void *)skb->data; in btintel_pcie_recv_event()
1029 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_recv_event() local
1033 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btintel_pcie_recv_event()
1037 switch (skb->data[2]) { in btintel_pcie_recv_event()
1049 if (btintel_pcie_in_op(data)) { in btintel_pcie_recv_event()
1050 btintel_pcie_wr_sleep_cntrl(data, BTINTEL_PCIE_STATE_D0); in btintel_pcie_recv_event()
1051 data->alive_intr_ctxt = BTINTEL_PCIE_INTEL_HCI_RESET2; in btintel_pcie_recv_event()
1056 if (btintel_pcie_in_iml(data)) { in btintel_pcie_recv_event()
1065 if (btintel_test_and_clear_flag(data->hdev, in btintel_pcie_recv_event()
1067 btintel_wake_up_flag(data->hdev, in btintel_pcie_recv_event()
1087 if (skb->data[2] == 0x97) { in btintel_pcie_recv_event()
1095 /* Process the received rx data
1096 * It check the frame header to identify the data type and create skb
1099 static int btintel_pcie_recv_frame(struct btintel_pcie_data *data, in btintel_pcie_recv_frame() argument
1107 struct hci_dev *hdev = data->hdev; in btintel_pcie_recv_frame()
1109 spin_lock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
1198 spin_unlock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
1203 static void btintel_pcie_read_hwexp(struct btintel_pcie_data *data) in btintel_pcie_read_hwexp() argument
1219 switch (data->dmp_hdr.cnvi_top & 0xfff) { in btintel_pcie_read_hwexp()
1223 if (INTEL_CNVX_TOP_STEP(data->dmp_hdr.cnvi_top) != 0x01) in btintel_pcie_read_hwexp()
1225 len = BTINTEL_PCIE_BLZR_HWEXP_SIZE; /* exception data length */ in btintel_pcie_read_hwexp()
1233 bt_dev_err(data->hdev, "Unsupported cnvi 0x%8.8x", data->dmp_hdr.cnvi_top); in btintel_pcie_read_hwexp()
1241 btintel_pcie_mac_init(data); in btintel_pcie_read_hwexp()
1243 err = btintel_pcie_read_device_mem(data, buf, addr, len); in btintel_pcie_read_hwexp()
1249 bt_dev_err(data->hdev, "Invalid exception dump signature: 0x%8.8x", in btintel_pcie_read_hwexp()
1254 snprintf(prefix, sizeof(prefix), "Bluetooth: %s: ", bt_dev_name(data->hdev)); in btintel_pcie_read_hwexp()
1265 bt_dev_dbg(data->hdev, "Invalid TLV type 0"); in btintel_pcie_read_hwexp()
1282 bt_dev_dbg(data->hdev, "TLV packet length: %u", pkt_len); in btintel_pcie_read_hwexp()
1299 btintel_pcie_recv_frame(data, skb); in btintel_pcie_read_hwexp()
1306 static void btintel_pcie_msix_hw_exp_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_hw_exp_handler() argument
1308 bt_dev_err(data->hdev, "Received hw exception interrupt"); in btintel_pcie_msix_hw_exp_handler()
1310 if (test_and_set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1313 if (test_and_set_bit(BTINTEL_PCIE_HWEXP_INPROGRESS, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1317 if (!test_and_set_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) in btintel_pcie_msix_hw_exp_handler()
1318 data->dmp_hdr.trigger_reason = BTINTEL_PCIE_TRIGGER_REASON_FW_ASSERT; in btintel_pcie_msix_hw_exp_handler()
1320 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_msix_hw_exp_handler()
1325 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_rx_work() local
1329 if (test_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) { in btintel_pcie_rx_work()
1330 btintel_pcie_dump_traces(data->hdev); in btintel_pcie_rx_work()
1331 clear_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags); in btintel_pcie_rx_work()
1334 if (test_bit(BTINTEL_PCIE_HWEXP_INPROGRESS, &data->flags)) { in btintel_pcie_rx_work()
1342 btintel_pcie_read_hwexp(data); in btintel_pcie_rx_work()
1343 clear_bit(BTINTEL_PCIE_HWEXP_INPROGRESS, &data->flags); in btintel_pcie_rx_work()
1347 while ((skb = skb_dequeue(&data->rx_skb_q))) { in btintel_pcie_rx_work()
1348 btintel_pcie_recv_frame(data, skb); in btintel_pcie_rx_work()
1352 /* create sk_buff with data and save it to queue and start RX work */
1353 static int btintel_pcie_submit_rx_work(struct btintel_pcie_data *data, u8 status, in btintel_pcie_submit_rx_work() argument
1376 skb_queue_tail(&data->rx_skb_q, skb); in btintel_pcie_submit_rx_work()
1377 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_submit_rx_work()
1380 ret = btintel_pcie_submit_rx(data); in btintel_pcie_submit_rx_work()
1386 static void btintel_pcie_msix_rx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_rx_handle() argument
1393 struct hci_dev *hdev = data->hdev; in btintel_pcie_msix_rx_handle()
1395 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
1396 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
1404 rxq = &data->rxq; in btintel_pcie_msix_rx_handle()
1411 ipc_print_urbd1(data->hdev, urbd1, cr_tia); in btintel_pcie_msix_rx_handle()
1420 ret = btintel_pcie_submit_rx_work(data, urbd1->status, in btintel_pcie_msix_rx_handle()
1421 buf->data); in btintel_pcie_msix_rx_handle()
1428 data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM] = cr_tia; in btintel_pcie_msix_rx_handle()
1429 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_msix_rx_handle()
1433 static inline bool btintel_pcie_is_rxq_empty(struct btintel_pcie_data *data) in btintel_pcie_is_rxq_empty() argument
1435 return data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM] == data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_is_rxq_empty()
1438 static inline bool btintel_pcie_is_txackq_empty(struct btintel_pcie_data *data) in btintel_pcie_is_txackq_empty() argument
1440 return data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] == data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_is_txackq_empty()
1446 struct btintel_pcie_data *data = btintel_pcie_get_data(entry); in btintel_pcie_irq_msix_handler() local
1449 spin_lock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
1450 intr_fh = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES); in btintel_pcie_irq_msix_handler()
1451 intr_hw = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES); in btintel_pcie_irq_msix_handler()
1454 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES, intr_fh); in btintel_pcie_irq_msix_handler()
1455 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES, intr_hw); in btintel_pcie_irq_msix_handler()
1456 spin_unlock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
1465 btintel_pcie_msix_hw_exp_handler(data); in btintel_pcie_irq_msix_handler()
1468 btintel_pcie_msix_gp1_handler(data); in btintel_pcie_irq_msix_handler()
1473 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
1474 if (!btintel_pcie_is_rxq_empty(data)) in btintel_pcie_irq_msix_handler()
1475 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
1480 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
1481 if (!btintel_pcie_is_txackq_empty(data)) in btintel_pcie_irq_msix_handler()
1482 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
1489 btintel_pcie_msix_gp0_handler(data); in btintel_pcie_irq_msix_handler()
1499 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_AUTOMASK_ST, in btintel_pcie_irq_msix_handler()
1508 static int btintel_pcie_setup_irq(struct btintel_pcie_data *data) in btintel_pcie_setup_irq() argument
1514 data->msix_entries[i].entry = i; in btintel_pcie_setup_irq()
1516 num_irqs = pci_alloc_irq_vectors(data->pdev, BTINTEL_PCIE_MSIX_VEC_MIN, in btintel_pcie_setup_irq()
1521 data->alloc_vecs = num_irqs; in btintel_pcie_setup_irq()
1522 data->msix_enabled = 1; in btintel_pcie_setup_irq()
1523 data->def_irq = 0; in btintel_pcie_setup_irq()
1526 for (i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_setup_irq()
1529 msix_entry = &data->msix_entries[i]; in btintel_pcie_setup_irq()
1530 msix_entry->vector = pci_irq_vector(data->pdev, i); in btintel_pcie_setup_irq()
1532 err = devm_request_threaded_irq(&data->pdev->dev, in btintel_pcie_setup_irq()
1540 pci_free_irq_vectors(data->pdev); in btintel_pcie_setup_irq()
1541 data->alloc_vecs = 0; in btintel_pcie_setup_irq()
1568 static void btintel_pcie_config_msix(struct btintel_pcie_data *data) in btintel_pcie_config_msix() argument
1571 int val = data->def_irq | BTINTEL_PCIE_MSIX_NON_AUTO_CLEAR_CAUSE; in btintel_pcie_config_msix()
1575 btintel_pcie_wr_reg8(data, in btintel_pcie_config_msix()
1578 btintel_pcie_clr_reg_bits(data, in btintel_pcie_config_msix()
1584 data->fh_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK); in btintel_pcie_config_msix()
1585 data->hw_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK); in btintel_pcie_config_msix()
1589 struct btintel_pcie_data *data) in btintel_pcie_config_pcie() argument
1606 data->base_addr = pcim_iomap_region(pdev, 0, KBUILD_MODNAME); in btintel_pcie_config_pcie()
1607 if (IS_ERR(data->base_addr)) in btintel_pcie_config_pcie()
1608 return PTR_ERR(data->base_addr); in btintel_pcie_config_pcie()
1610 err = btintel_pcie_setup_irq(data); in btintel_pcie_config_pcie()
1615 btintel_pcie_config_msix(data); in btintel_pcie_config_pcie()
1620 static void btintel_pcie_init_ci(struct btintel_pcie_data *data, in btintel_pcie_init_ci() argument
1626 ci->addr_cr_hia = data->ia.cr_hia_p_addr; in btintel_pcie_init_ci()
1627 ci->addr_tr_tia = data->ia.tr_tia_p_addr; in btintel_pcie_init_ci()
1628 ci->addr_cr_tia = data->ia.cr_tia_p_addr; in btintel_pcie_init_ci()
1629 ci->addr_tr_hia = data->ia.tr_hia_p_addr; in btintel_pcie_init_ci()
1632 ci->addr_urbdq0 = data->txq.urbd0s_p_addr; in btintel_pcie_init_ci()
1633 ci->addr_tfdq = data->txq.tfds_p_addr; in btintel_pcie_init_ci()
1634 ci->num_tfdq = data->txq.count; in btintel_pcie_init_ci()
1635 ci->num_urbdq0 = data->txq.count; in btintel_pcie_init_ci()
1639 ci->addr_frbdq = data->rxq.frbds_p_addr; in btintel_pcie_init_ci()
1640 ci->num_frbdq = data->rxq.count; in btintel_pcie_init_ci()
1642 ci->addr_urbdq1 = data->rxq.urbd1s_p_addr; in btintel_pcie_init_ci()
1643 ci->num_urbdq1 = data->rxq.count; in btintel_pcie_init_ci()
1647 ci->dbgc_addr = data->dbgc.frag_p_addr; in btintel_pcie_init_ci()
1648 ci->dbgc_size = data->dbgc.frag_size; in btintel_pcie_init_ci()
1652 static void btintel_pcie_free_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_txq_bufs() argument
1655 /* Free data buffers first */ in btintel_pcie_free_txq_bufs()
1656 dma_free_coherent(&data->pdev->dev, txq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_txq_bufs()
1661 static int btintel_pcie_setup_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_txq_bufs() argument
1672 /* Allocate full chunk of data buffer for DMA first and do indexing and in btintel_pcie_setup_txq_bufs()
1675 txq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_txq_bufs()
1690 buf->data = txq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_txq_bufs()
1696 static void btintel_pcie_free_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_rxq_bufs() argument
1699 /* Free data buffers first */ in btintel_pcie_free_rxq_bufs()
1700 dma_free_coherent(&data->pdev->dev, rxq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_rxq_bufs()
1705 static int btintel_pcie_setup_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_rxq_bufs() argument
1716 /* Allocate full chunk of data buffer for DMA first and do indexing and in btintel_pcie_setup_rxq_bufs()
1719 rxq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_rxq_bufs()
1734 buf->data = rxq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_rxq_bufs()
1740 static void btintel_pcie_setup_ia(struct btintel_pcie_data *data, in btintel_pcie_setup_ia() argument
1761 static void btintel_pcie_free(struct btintel_pcie_data *data) in btintel_pcie_free() argument
1763 btintel_pcie_free_rxq_bufs(data, &data->rxq); in btintel_pcie_free()
1764 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_free()
1766 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_free()
1767 dma_pool_destroy(data->dma_pool); in btintel_pcie_free()
1770 /* Allocate tx and rx queues, any related data structures and buffers.
1772 static int btintel_pcie_alloc(struct btintel_pcie_data *data) in btintel_pcie_alloc() argument
1781 * The DMA memory for data buffer is allocated while setting up the in btintel_pcie_alloc()
1799 data->dma_pool = dma_pool_create(KBUILD_MODNAME, &data->pdev->dev, in btintel_pcie_alloc()
1801 if (!data->dma_pool) { in btintel_pcie_alloc()
1806 v_addr = dma_pool_zalloc(data->dma_pool, GFP_KERNEL | __GFP_NOWARN, in btintel_pcie_alloc()
1809 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
1814 data->dma_p_addr = p_addr; in btintel_pcie_alloc()
1815 data->dma_v_addr = v_addr; in btintel_pcie_alloc()
1818 data->txq.count = BTINTEL_PCIE_TX_DESCS_COUNT; in btintel_pcie_alloc()
1819 data->rxq.count = BTINTEL_PCIE_RX_DESCS_COUNT; in btintel_pcie_alloc()
1822 data->txq.tfds_p_addr = p_addr; in btintel_pcie_alloc()
1823 data->txq.tfds = v_addr; in btintel_pcie_alloc()
1829 data->txq.urbd0s_p_addr = p_addr; in btintel_pcie_alloc()
1830 data->txq.urbd0s = v_addr; in btintel_pcie_alloc()
1836 data->rxq.frbds_p_addr = p_addr; in btintel_pcie_alloc()
1837 data->rxq.frbds = v_addr; in btintel_pcie_alloc()
1843 data->rxq.urbd1s_p_addr = p_addr; in btintel_pcie_alloc()
1844 data->rxq.urbd1s = v_addr; in btintel_pcie_alloc()
1849 /* Setup data buffers for txq */ in btintel_pcie_alloc()
1850 err = btintel_pcie_setup_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
1854 /* Setup data buffers for rxq */ in btintel_pcie_alloc()
1855 err = btintel_pcie_setup_rxq_bufs(data, &data->rxq); in btintel_pcie_alloc()
1860 btintel_pcie_setup_ia(data, p_addr, v_addr, &data->ia); in btintel_pcie_alloc()
1862 /* Setup data buffers for dbgc */ in btintel_pcie_alloc()
1863 err = btintel_pcie_setup_dbgc(data); in btintel_pcie_alloc()
1871 data->ci = v_addr; in btintel_pcie_alloc()
1872 data->ci_p_addr = p_addr; in btintel_pcie_alloc()
1875 btintel_pcie_init_ci(data, data->ci); in btintel_pcie_alloc()
1880 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
1882 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_alloc()
1883 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
1930 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_send_frame() local
1936 if (test_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags)) in btintel_pcie_send_frame()
1941 * the first byte to get the packet type and redirect the rest of data in btintel_pcie_send_frame()
1944 * But for PCIe, THF(Transfer Flow Handler) fetches the 4 bytes of data in btintel_pcie_send_frame()
1950 * head room for profile and driver use, and before sending the data in btintel_pcie_send_frame()
1956 cmd = (void *)skb->data; in btintel_pcie_send_frame()
1959 struct hci_command_hdr *cmd = (void *)skb->data; in btintel_pcie_send_frame()
1989 ret = btintel_pcie_send_sync(data, skb, type, opcode); in btintel_pcie_send_frame()
2003 static void btintel_pcie_release_hdev(struct btintel_pcie_data *data) in btintel_pcie_release_hdev() argument
2007 hdev = data->hdev; in btintel_pcie_release_hdev()
2010 data->hdev = NULL; in btintel_pcie_release_hdev()
2013 static void btintel_pcie_disable_interrupts(struct btintel_pcie_data *data) in btintel_pcie_disable_interrupts() argument
2015 spin_lock(&data->irq_lock); in btintel_pcie_disable_interrupts()
2016 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, data->fh_init_mask); in btintel_pcie_disable_interrupts()
2017 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, data->hw_init_mask); in btintel_pcie_disable_interrupts()
2018 spin_unlock(&data->irq_lock); in btintel_pcie_disable_interrupts()
2021 static void btintel_pcie_enable_interrupts(struct btintel_pcie_data *data) in btintel_pcie_enable_interrupts() argument
2023 spin_lock(&data->irq_lock); in btintel_pcie_enable_interrupts()
2024 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK, ~data->fh_init_mask); in btintel_pcie_enable_interrupts()
2025 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK, ~data->hw_init_mask); in btintel_pcie_enable_interrupts()
2026 spin_unlock(&data->irq_lock); in btintel_pcie_enable_interrupts()
2029 static void btintel_pcie_synchronize_irqs(struct btintel_pcie_data *data) in btintel_pcie_synchronize_irqs() argument
2031 for (int i = 0; i < data->alloc_vecs; i++) in btintel_pcie_synchronize_irqs()
2032 synchronize_irq(data->msix_entries[i].vector); in btintel_pcie_synchronize_irqs()
2037 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup_internal() local
2053 if (skb->data[0]) { in btintel_pcie_setup_internal()
2055 skb->data[0]); in btintel_pcie_setup_internal()
2069 /* For TLV type device, parse the tlv data */ in btintel_pcie_setup_internal()
2122 data->dmp_hdr.cnvi_top = ver_tlv.cnvi_top; in btintel_pcie_setup_internal()
2123 data->dmp_hdr.cnvr_top = ver_tlv.cnvr_top; in btintel_pcie_setup_internal()
2124 data->dmp_hdr.fw_timestamp = ver_tlv.timestamp; in btintel_pcie_setup_internal()
2125 data->dmp_hdr.fw_build_type = ver_tlv.build_type; in btintel_pcie_setup_internal()
2126 data->dmp_hdr.fw_build_num = ver_tlv.build_num; in btintel_pcie_setup_internal()
2127 data->dmp_hdr.cnvi_bt = ver_tlv.cnvi_bt; in btintel_pcie_setup_internal()
2130 data->dmp_hdr.fw_git_sha1 = ver_tlv.git_sha1; in btintel_pcie_setup_internal()
2142 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup() local
2148 btintel_pcie_disable_interrupts(data); in btintel_pcie_setup()
2149 btintel_pcie_synchronize_irqs(data); in btintel_pcie_setup()
2150 err = btintel_pcie_reset_bt(data); in btintel_pcie_setup()
2156 btintel_pcie_reset_ia(data); in btintel_pcie_setup()
2157 btintel_pcie_enable_interrupts(data); in btintel_pcie_setup()
2158 btintel_pcie_config_msix(data); in btintel_pcie_setup()
2159 err = btintel_pcie_enable_bt(data); in btintel_pcie_setup()
2164 btintel_pcie_start_rx(data); in btintel_pcie_setup()
2168 set_bit(BTINTEL_PCIE_SETUP_DONE, &data->flags); in btintel_pcie_setup()
2175 struct btintel_pcie_dev_recovery *tmp, *data = NULL; in btintel_pcie_get_recovery() local
2184 data = tmp; in btintel_pcie_get_recovery()
2189 if (data) { in btintel_pcie_get_recovery()
2190 bt_dev_dbg(hdev, "Found restart data for BDF: %s", data->name); in btintel_pcie_get_recovery()
2191 return data; in btintel_pcie_get_recovery()
2194 data = kzalloc_flex(*data, name, name_len, GFP_ATOMIC); in btintel_pcie_get_recovery()
2195 if (!data) in btintel_pcie_get_recovery()
2198 strscpy(data->name, name, name_len); in btintel_pcie_get_recovery()
2200 list_add_tail(&data->list, &btintel_pcie_recovery_list); in btintel_pcie_get_recovery()
2203 return data; in btintel_pcie_get_recovery()
2220 struct btintel_pcie_dev_recovery *data; in btintel_pcie_inc_recovery_count() local
2223 data = btintel_pcie_get_recovery(pdev, dev); in btintel_pcie_inc_recovery_count()
2224 if (!data) in btintel_pcie_inc_recovery_count()
2227 retry_window = ktime_get_boottime_seconds() - data->last_error; in btintel_pcie_inc_recovery_count()
2228 if (data->count == 0) { in btintel_pcie_inc_recovery_count()
2229 data->last_error = ktime_get_boottime_seconds(); in btintel_pcie_inc_recovery_count()
2230 data->count++; in btintel_pcie_inc_recovery_count()
2232 data->count <= BTINTEL_PCIE_FLR_MAX_RETRY) { in btintel_pcie_inc_recovery_count()
2233 data->count++; in btintel_pcie_inc_recovery_count()
2235 data->last_error = 0; in btintel_pcie_inc_recovery_count()
2236 data->count = 0; in btintel_pcie_inc_recovery_count()
2240 static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data);
2247 struct btintel_pcie_data *data; in btintel_pcie_removal_work() local
2255 data = pci_get_drvdata(pdev); in btintel_pcie_removal_work()
2257 btintel_pcie_disable_interrupts(data); in btintel_pcie_removal_work()
2258 btintel_pcie_synchronize_irqs(data); in btintel_pcie_removal_work()
2260 flush_work(&data->rx_work); in btintel_pcie_removal_work()
2262 bt_dev_dbg(data->hdev, "Release bluetooth interface"); in btintel_pcie_removal_work()
2263 btintel_pcie_release_hdev(data); in btintel_pcie_removal_work()
2271 btintel_pcie_enable_interrupts(data); in btintel_pcie_removal_work()
2272 btintel_pcie_config_msix(data); in btintel_pcie_removal_work()
2274 err = btintel_pcie_enable_bt(data); in btintel_pcie_removal_work()
2281 btintel_pcie_reset_ia(data); in btintel_pcie_removal_work()
2282 btintel_pcie_start_rx(data); in btintel_pcie_removal_work()
2283 data->flags = 0; in btintel_pcie_removal_work()
2285 err = btintel_pcie_setup_hdev(data); in btintel_pcie_removal_work()
2299 struct btintel_pcie_data *data; in btintel_pcie_reset() local
2301 data = hci_get_drvdata(hdev); in btintel_pcie_reset()
2303 if (!test_bit(BTINTEL_PCIE_SETUP_DONE, &data->flags)) in btintel_pcie_reset()
2306 if (test_and_set_bit(BTINTEL_PCIE_RECOVERY_IN_PROGRESS, &data->flags)) in btintel_pcie_reset()
2313 removal->pdev = data->pdev; in btintel_pcie_reset()
2321 struct btintel_pcie_dev_recovery *data; in btintel_pcie_hw_error() local
2331 data = btintel_pcie_get_recovery(pdev, &hdev->dev); in btintel_pcie_hw_error()
2332 if (!data) in btintel_pcie_hw_error()
2335 retry_window = ktime_get_boottime_seconds() - data->last_error; in btintel_pcie_hw_error()
2338 data->count >= BTINTEL_PCIE_FLR_MAX_RETRY) { in btintel_pcie_hw_error()
2340 BTINTEL_PCIE_FLR_MAX_RETRY, data->count); in btintel_pcie_hw_error()
2344 data->last_error); in btintel_pcie_hw_error()
2353 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_wakeup() local
2355 return device_may_wakeup(&data->pdev->dev); in btintel_pcie_wakeup()
2366 static int btintel_pcie_hci_drv_read_info(struct hci_dev *hdev, void *data, in btintel_pcie_hci_drv_read_info() argument
2415 static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data) in btintel_pcie_setup_hdev() argument
2425 hci_set_drvdata(hdev, data); in btintel_pcie_setup_hdev()
2427 data->hdev = hdev; in btintel_pcie_setup_hdev()
2428 SET_HCIDEV_DEV(hdev, &data->pdev->dev); in btintel_pcie_setup_hdev()
2449 data->dmp_hdr.driver_name = KBUILD_MODNAME; in btintel_pcie_setup_hdev()
2461 struct btintel_pcie_data *data; in btintel_pcie_probe() local
2466 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in btintel_pcie_probe()
2467 if (!data) in btintel_pcie_probe()
2470 data->pdev = pdev; in btintel_pcie_probe()
2472 spin_lock_init(&data->irq_lock); in btintel_pcie_probe()
2473 spin_lock_init(&data->hci_rx_lock); in btintel_pcie_probe()
2475 init_waitqueue_head(&data->gp0_wait_q); in btintel_pcie_probe()
2476 data->gp0_received = false; in btintel_pcie_probe()
2478 init_waitqueue_head(&data->tx_wait_q); in btintel_pcie_probe()
2479 data->tx_wait_done = false; in btintel_pcie_probe()
2481 data->workqueue = alloc_ordered_workqueue(KBUILD_MODNAME, WQ_HIGHPRI); in btintel_pcie_probe()
2482 if (!data->workqueue) in btintel_pcie_probe()
2485 skb_queue_head_init(&data->rx_skb_q); in btintel_pcie_probe()
2486 INIT_WORK(&data->rx_work, btintel_pcie_rx_work); in btintel_pcie_probe()
2488 data->boot_stage_cache = 0x00; in btintel_pcie_probe()
2489 data->img_resp_cache = 0x00; in btintel_pcie_probe()
2491 err = btintel_pcie_config_pcie(pdev, data); in btintel_pcie_probe()
2495 pci_set_drvdata(pdev, data); in btintel_pcie_probe()
2497 err = btintel_pcie_alloc(data); in btintel_pcie_probe()
2501 err = btintel_pcie_enable_bt(data); in btintel_pcie_probe()
2506 data->cnvi = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_HW_REV_REG); in btintel_pcie_probe()
2508 data->cnvr = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_RF_ID_REG); in btintel_pcie_probe()
2510 err = btintel_pcie_start_rx(data); in btintel_pcie_probe()
2514 err = btintel_pcie_setup_hdev(data); in btintel_pcie_probe()
2518 bt_dev_dbg(data->hdev, "cnvi: 0x%8.8x cnvr: 0x%8.8x", data->cnvi, in btintel_pcie_probe()
2519 data->cnvr); in btintel_pcie_probe()
2524 btintel_pcie_reset_bt(data); in btintel_pcie_probe()
2535 struct btintel_pcie_data *data; in btintel_pcie_remove() local
2537 data = pci_get_drvdata(pdev); in btintel_pcie_remove()
2539 btintel_pcie_disable_interrupts(data); in btintel_pcie_remove()
2541 btintel_pcie_synchronize_irqs(data); in btintel_pcie_remove()
2543 flush_work(&data->rx_work); in btintel_pcie_remove()
2545 btintel_pcie_reset_bt(data); in btintel_pcie_remove()
2546 for (int i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_remove()
2549 msix_entry = &data->msix_entries[i]; in btintel_pcie_remove()
2555 btintel_pcie_release_hdev(data); in btintel_pcie_remove()
2557 destroy_workqueue(data->workqueue); in btintel_pcie_remove()
2559 btintel_pcie_free(data); in btintel_pcie_remove()
2570 struct btintel_pcie_data *data = pci_get_drvdata(pdev); in btintel_pcie_coredump() local
2572 if (test_and_set_bit(BTINTEL_PCIE_COREDUMP_INPROGRESS, &data->flags)) in btintel_pcie_coredump()
2575 data->dmp_hdr.trigger_reason = BTINTEL_PCIE_TRIGGER_REASON_USER_TRIGGER; in btintel_pcie_coredump()
2576 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_coredump()
2580 static int btintel_pcie_set_dxstate(struct btintel_pcie_data *data, u32 dxstate) in btintel_pcie_set_dxstate() argument
2586 data->gp0_received = false; in btintel_pcie_set_dxstate()
2588 btintel_pcie_wr_sleep_cntrl(data, dxstate); in btintel_pcie_set_dxstate()
2590 status = wait_event_timeout(data->gp0_wait_q, data->gp0_received, in btintel_pcie_set_dxstate()
2596 bt_dev_warn(data->hdev, in btintel_pcie_set_dxstate()
2601 btintel_pcie_clr_reg_bits(data, in btintel_pcie_set_dxstate()
2610 if (btintel_pcie_in_d0(data)) in btintel_pcie_set_dxstate()
2613 if (btintel_pcie_in_d3(data)) in btintel_pcie_set_dxstate()
2625 struct btintel_pcie_data *data; in btintel_pcie_suspend_late() local
2630 data = pci_get_drvdata(pdev); in btintel_pcie_suspend_late()
2635 data->pm_sx_event = mesg.event; in btintel_pcie_suspend_late()
2640 err = btintel_pcie_set_dxstate(data, dxstate); in btintel_pcie_suspend_late()
2645 bt_dev_dbg(data->hdev, in btintel_pcie_suspend_late()
2669 struct btintel_pcie_data *data; in btintel_pcie_resume() local
2673 data = pci_get_drvdata(pdev); in btintel_pcie_resume()
2674 data->gp0_received = false; in btintel_pcie_resume()
2685 if (data->pm_sx_event == PM_EVENT_FREEZE || in btintel_pcie_resume()
2686 data->pm_sx_event == PM_EVENT_HIBERNATE) { in btintel_pcie_resume()
2687 set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags); in btintel_pcie_resume()
2688 btintel_pcie_reset(data->hdev); in btintel_pcie_resume()
2693 err = btintel_pcie_set_dxstate(data, BTINTEL_PCIE_STATE_D0); in btintel_pcie_resume()
2696 bt_dev_dbg(data->hdev, in btintel_pcie_resume()
2707 data->boot_stage_cache = btintel_pcie_rd_reg32(data, in btintel_pcie_resume()
2709 if (btintel_pcie_in_error(data) || in btintel_pcie_resume()
2710 btintel_pcie_in_device_halt(data)) { in btintel_pcie_resume()
2711 bt_dev_err(data->hdev, "Controller in error state for D0 entry"); in btintel_pcie_resume()
2713 &data->flags)) { in btintel_pcie_resume()
2714 data->dmp_hdr.trigger_reason = in btintel_pcie_resume()
2716 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_resume()
2718 set_bit(BTINTEL_PCIE_CORE_HALTED, &data->flags); in btintel_pcie_resume()
2719 btintel_pcie_reset(data->hdev); in btintel_pcie_resume()