Lines Matching full:data
89 static void btintel_pcie_set_tx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_tx_db() argument
96 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_tx_db()
99 /* Copy the data to next(@tfd_index) data buffer and update the TFD(transfer
100 * descriptor) with the data length and the DMA address of the data buffer.
116 /* Copy the outgoing data to DMA buffer */ in btintel_pcie_prepare_tx()
117 memcpy(buf->data, skb->data, tfd->size); in btintel_pcie_prepare_tx()
120 static int btintel_pcie_send_sync(struct btintel_pcie_data *data, in btintel_pcie_send_sync() argument
125 struct txq *txq = &data->txq; in btintel_pcie_send_sync()
127 tfd_index = data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_send_sync()
132 /* Prepare for TX. It updates the TFD with the length of data and in btintel_pcie_send_sync()
133 * address of the DMA buffer, and copy the data to the DMA buffer in btintel_pcie_send_sync()
138 data->ia.tr_hia[BTINTEL_PCIE_TXQ_NUM] = tfd_index; in btintel_pcie_send_sync()
141 data->tx_wait_done = false; in btintel_pcie_send_sync()
144 btintel_pcie_set_tx_db(data, tfd_index); in btintel_pcie_send_sync()
147 ret = wait_event_timeout(data->tx_wait_q, data->tx_wait_done, in btintel_pcie_send_sync()
156 * is available to receive the data
158 static void btintel_pcie_set_rx_db(struct btintel_pcie_data *data, u16 index) in btintel_pcie_set_rx_db() argument
165 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_HBUS_TARG_WRPTR, val); in btintel_pcie_set_rx_db()
187 static int btintel_pcie_submit_rx(struct btintel_pcie_data *data) in btintel_pcie_submit_rx() argument
190 struct rxq *rxq = &data->rxq; in btintel_pcie_submit_rx()
192 frbd_index = data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_submit_rx()
203 data->ia.tr_hia[BTINTEL_PCIE_RXQ_NUM] = frbd_index; in btintel_pcie_submit_rx()
204 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_submit_rx()
207 btintel_pcie_set_rx_db(data, frbd_index); in btintel_pcie_submit_rx()
212 static int btintel_pcie_start_rx(struct btintel_pcie_data *data) in btintel_pcie_start_rx() argument
217 ret = btintel_pcie_submit_rx(data); in btintel_pcie_start_rx()
225 static void btintel_pcie_reset_ia(struct btintel_pcie_data *data) in btintel_pcie_reset_ia() argument
227 memset(data->ia.tr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
228 memset(data->ia.tr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
229 memset(data->ia.cr_hia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
230 memset(data->ia.cr_tia, 0, sizeof(u16) * BTINTEL_PCIE_NUM_QUEUES); in btintel_pcie_reset_ia()
233 static int btintel_pcie_reset_bt(struct btintel_pcie_data *data) in btintel_pcie_reset_bt() argument
238 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
245 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
248 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
256 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
262 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_reset_bt()
265 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_reset_bt()
266 bt_dev_dbg(data->hdev, "csr register after reset: 0x%8.8x", reg); in btintel_pcie_reset_bt()
268 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_reset_bt()
282 static int btintel_pcie_enable_bt(struct btintel_pcie_data *data) in btintel_pcie_enable_bt() argument
287 data->gp0_received = false; in btintel_pcie_enable_bt()
290 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_LSB_REG, in btintel_pcie_enable_bt()
291 data->ci_p_addr & 0xffffffff); in btintel_pcie_enable_bt()
292 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_CI_ADDR_MSB_REG, in btintel_pcie_enable_bt()
293 (u64)data->ci_p_addr >> 32); in btintel_pcie_enable_bt()
298 data->boot_stage_cache = 0x0; in btintel_pcie_enable_bt()
301 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
308 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, reg); in btintel_pcie_enable_bt()
311 btintel_pcie_set_reg_bits(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG, in btintel_pcie_enable_bt()
314 btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_FUNC_CTRL_REG); in btintel_pcie_enable_bt()
319 data->alive_intr_ctxt = BTINTEL_PCIE_ROM; in btintel_pcie_enable_bt()
320 err = wait_event_timeout(data->gp0_wait_q, data->gp0_received, in btintel_pcie_enable_bt()
326 if (~data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ROM) in btintel_pcie_enable_bt()
339 static inline bool btintel_pcie_in_rom(struct btintel_pcie_data *data) in btintel_pcie_in_rom() argument
341 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_ROM && in btintel_pcie_in_rom()
342 !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML) && in btintel_pcie_in_rom()
343 !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW); in btintel_pcie_in_rom()
346 static inline bool btintel_pcie_in_op(struct btintel_pcie_data *data) in btintel_pcie_in_op() argument
348 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW; in btintel_pcie_in_op()
351 static inline bool btintel_pcie_in_iml(struct btintel_pcie_data *data) in btintel_pcie_in_iml() argument
353 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_IML && in btintel_pcie_in_iml()
354 !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_OPFW); in btintel_pcie_in_iml()
357 static inline bool btintel_pcie_in_d3(struct btintel_pcie_data *data) in btintel_pcie_in_d3() argument
359 return data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY; in btintel_pcie_in_d3()
362 static inline bool btintel_pcie_in_d0(struct btintel_pcie_data *data) in btintel_pcie_in_d0() argument
364 return !(data->boot_stage_cache & BTINTEL_PCIE_CSR_BOOT_STAGE_D3_STATE_READY); in btintel_pcie_in_d0()
367 static void btintel_pcie_wr_sleep_cntrl(struct btintel_pcie_data *data, in btintel_pcie_wr_sleep_cntrl() argument
370 bt_dev_dbg(data->hdev, "writing sleep_ctl_reg: 0x%8.8x", dxstate); in btintel_pcie_wr_sleep_cntrl()
371 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_IPC_SLEEP_CTL_REG, dxstate); in btintel_pcie_wr_sleep_cntrl()
399 static void btintel_pcie_msix_gp0_handler(struct btintel_pcie_data *data) in btintel_pcie_msix_gp0_handler() argument
408 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_BOOT_STAGE_REG); in btintel_pcie_msix_gp0_handler()
409 if (reg != data->boot_stage_cache) in btintel_pcie_msix_gp0_handler()
410 data->boot_stage_cache = reg; in btintel_pcie_msix_gp0_handler()
412 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()
413 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt), in btintel_pcie_msix_gp0_handler()
414 data->boot_stage_cache, reg); in btintel_pcie_msix_gp0_handler()
415 reg = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_IMG_RESPONSE_REG); in btintel_pcie_msix_gp0_handler()
416 if (reg != data->img_resp_cache) in btintel_pcie_msix_gp0_handler()
417 data->img_resp_cache = reg; in btintel_pcie_msix_gp0_handler()
419 data->gp0_received = true; in btintel_pcie_msix_gp0_handler()
421 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_msix_gp0_handler()
425 switch (data->alive_intr_ctxt) { in btintel_pcie_msix_gp0_handler()
427 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
436 if (btintel_pcie_in_op(data)) { in btintel_pcie_msix_gp0_handler()
441 if (btintel_pcie_in_iml(data)) { in btintel_pcie_msix_gp0_handler()
443 data->alive_intr_ctxt = BTINTEL_PCIE_FW_DL; in btintel_pcie_msix_gp0_handler()
448 if (btintel_test_and_clear_flag(data->hdev, INTEL_WAIT_FOR_D0)) { in btintel_pcie_msix_gp0_handler()
449 btintel_wake_up_flag(data->hdev, INTEL_WAIT_FOR_D0); in btintel_pcie_msix_gp0_handler()
450 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
454 if (btintel_pcie_in_d3(data)) { in btintel_pcie_msix_gp0_handler()
455 data->alive_intr_ctxt = BTINTEL_PCIE_D3; in btintel_pcie_msix_gp0_handler()
461 if (btintel_pcie_in_d0(data)) { in btintel_pcie_msix_gp0_handler()
462 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
469 data->alive_intr_ctxt = BTINTEL_PCIE_D0; in btintel_pcie_msix_gp0_handler()
474 bt_dev_err(data->hdev, "Unknown state: 0x%2.2x", in btintel_pcie_msix_gp0_handler()
475 data->alive_intr_ctxt); in btintel_pcie_msix_gp0_handler()
480 btintel_pcie_reset_ia(data); in btintel_pcie_msix_gp0_handler()
481 btintel_pcie_start_rx(data); in btintel_pcie_msix_gp0_handler()
485 bt_dev_dbg(data->hdev, "wake up gp0 wait_q"); in btintel_pcie_msix_gp0_handler()
486 wake_up(&data->gp0_wait_q); in btintel_pcie_msix_gp0_handler()
489 if (old_ctxt != data->alive_intr_ctxt) in btintel_pcie_msix_gp0_handler()
490 bt_dev_dbg(data->hdev, "alive context changed: %s -> %s", in btintel_pcie_msix_gp0_handler()
492 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_msix_gp0_handler()
497 static void btintel_pcie_msix_tx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_tx_handle() argument
503 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
504 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_TXQ_NUM]; in btintel_pcie_msix_tx_handle()
509 txq = &data->txq; in btintel_pcie_msix_tx_handle()
512 data->tx_wait_done = true; in btintel_pcie_msix_tx_handle()
513 wake_up(&data->tx_wait_q); in btintel_pcie_msix_tx_handle()
521 data->ia.cr_tia[BTINTEL_PCIE_TXQ_NUM] = cr_tia; in btintel_pcie_msix_tx_handle()
522 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_TXQ_NUM); in btintel_pcie_msix_tx_handle()
528 struct hci_event_hdr *hdr = (void *)skb->data; in btintel_pcie_recv_event()
530 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_recv_event() local
534 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btintel_pcie_recv_event()
538 switch (skb->data[2]) { in btintel_pcie_recv_event()
550 if (btintel_pcie_in_op(data)) { in btintel_pcie_recv_event()
551 btintel_pcie_wr_sleep_cntrl(data, BTINTEL_PCIE_STATE_D0); in btintel_pcie_recv_event()
552 data->alive_intr_ctxt = BTINTEL_PCIE_INTEL_HCI_RESET2; in btintel_pcie_recv_event()
557 if (btintel_pcie_in_iml(data)) { in btintel_pcie_recv_event()
566 if (btintel_test_and_clear_flag(data->hdev, in btintel_pcie_recv_event()
568 btintel_wake_up_flag(data->hdev, in btintel_pcie_recv_event()
589 memcmp(&skb->data[2], diagnostics_hdr, in btintel_pcie_recv_event()
597 if (skb->data[2] == 0x97) in btintel_pcie_recv_event()
603 /* Process the received rx data
604 * It check the frame header to identify the data type and create skb
607 static int btintel_pcie_recv_frame(struct btintel_pcie_data *data, in btintel_pcie_recv_frame() argument
616 struct hci_dev *hdev = data->hdev; in btintel_pcie_recv_frame()
618 spin_lock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
700 skb_put_data(new_skb, skb->data, plen); in btintel_pcie_recv_frame()
712 spin_unlock(&data->hci_rx_lock); in btintel_pcie_recv_frame()
719 struct btintel_pcie_data *data = container_of(work, in btintel_pcie_rx_work() local
723 struct hci_dev *hdev = data->hdev; in btintel_pcie_rx_work()
726 while ((skb = skb_dequeue(&data->rx_skb_q))) { in btintel_pcie_rx_work()
727 err = btintel_pcie_recv_frame(data, skb); in btintel_pcie_rx_work()
735 /* create sk_buff with data and save it to queue and start RX work */
736 static int btintel_pcie_submit_rx_work(struct btintel_pcie_data *data, u8 status, in btintel_pcie_submit_rx_work() argument
759 skb_queue_tail(&data->rx_skb_q, skb); in btintel_pcie_submit_rx_work()
760 queue_work(data->workqueue, &data->rx_work); in btintel_pcie_submit_rx_work()
763 ret = btintel_pcie_submit_rx(data); in btintel_pcie_submit_rx_work()
769 static void btintel_pcie_msix_rx_handle(struct btintel_pcie_data *data) in btintel_pcie_msix_rx_handle() argument
776 struct hci_dev *hdev = data->hdev; in btintel_pcie_msix_rx_handle()
778 cr_hia = data->ia.cr_hia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
779 cr_tia = data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM]; in btintel_pcie_msix_rx_handle()
789 rxq = &data->rxq; in btintel_pcie_msix_rx_handle()
796 ipc_print_urbd1(data->hdev, urbd1, cr_tia); in btintel_pcie_msix_rx_handle()
805 ret = btintel_pcie_submit_rx_work(data, urbd1->status, in btintel_pcie_msix_rx_handle()
806 buf->data); in btintel_pcie_msix_rx_handle()
813 data->ia.cr_tia[BTINTEL_PCIE_RXQ_NUM] = cr_tia; in btintel_pcie_msix_rx_handle()
814 ipc_print_ia_ring(data->hdev, &data->ia, BTINTEL_PCIE_RXQ_NUM); in btintel_pcie_msix_rx_handle()
818 static irqreturn_t btintel_pcie_msix_isr(int irq, void *data) in btintel_pcie_msix_isr() argument
826 struct btintel_pcie_data *data = btintel_pcie_get_data(entry); in btintel_pcie_irq_msix_handler() local
829 spin_lock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
830 intr_fh = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES); in btintel_pcie_irq_msix_handler()
831 intr_hw = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES); in btintel_pcie_irq_msix_handler()
834 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_CAUSES, intr_fh); in btintel_pcie_irq_msix_handler()
835 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_CAUSES, intr_hw); in btintel_pcie_irq_msix_handler()
836 spin_unlock(&data->irq_lock); in btintel_pcie_irq_msix_handler()
847 btintel_pcie_msix_gp0_handler(data); in btintel_pcie_irq_msix_handler()
851 btintel_pcie_msix_tx_handle(data); in btintel_pcie_irq_msix_handler()
855 btintel_pcie_msix_rx_handle(data); in btintel_pcie_irq_msix_handler()
865 btintel_pcie_wr_reg32(data, BTINTEL_PCIE_CSR_MSIX_AUTOMASK_ST, in btintel_pcie_irq_msix_handler()
874 static int btintel_pcie_setup_irq(struct btintel_pcie_data *data) in btintel_pcie_setup_irq() argument
880 data->msix_entries[i].entry = i; in btintel_pcie_setup_irq()
882 num_irqs = pci_alloc_irq_vectors(data->pdev, BTINTEL_PCIE_MSIX_VEC_MIN, in btintel_pcie_setup_irq()
887 data->alloc_vecs = num_irqs; in btintel_pcie_setup_irq()
888 data->msix_enabled = 1; in btintel_pcie_setup_irq()
889 data->def_irq = 0; in btintel_pcie_setup_irq()
892 for (i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_setup_irq()
895 msix_entry = &data->msix_entries[i]; in btintel_pcie_setup_irq()
896 msix_entry->vector = pci_irq_vector(data->pdev, i); in btintel_pcie_setup_irq()
898 err = devm_request_threaded_irq(&data->pdev->dev, in btintel_pcie_setup_irq()
906 pci_free_irq_vectors(data->pdev); in btintel_pcie_setup_irq()
907 data->alloc_vecs = 0; in btintel_pcie_setup_irq()
933 static void btintel_pcie_config_msix(struct btintel_pcie_data *data) in btintel_pcie_config_msix() argument
936 int val = data->def_irq | BTINTEL_PCIE_MSIX_NON_AUTO_CLEAR_CAUSE; in btintel_pcie_config_msix()
940 btintel_pcie_wr_reg8(data, in btintel_pcie_config_msix()
943 btintel_pcie_clr_reg_bits(data, in btintel_pcie_config_msix()
949 data->fh_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_FH_INT_MASK); in btintel_pcie_config_msix()
950 data->hw_init_mask = ~btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_MSIX_HW_INT_MASK); in btintel_pcie_config_msix()
954 struct btintel_pcie_data *data) in btintel_pcie_config_pcie() argument
971 data->base_addr = pcim_iomap_region(pdev, 0, KBUILD_MODNAME); in btintel_pcie_config_pcie()
972 if (IS_ERR(data->base_addr)) in btintel_pcie_config_pcie()
973 return PTR_ERR(data->base_addr); in btintel_pcie_config_pcie()
975 err = btintel_pcie_setup_irq(data); in btintel_pcie_config_pcie()
980 btintel_pcie_config_msix(data); in btintel_pcie_config_pcie()
985 static void btintel_pcie_init_ci(struct btintel_pcie_data *data, in btintel_pcie_init_ci() argument
991 ci->addr_cr_hia = data->ia.cr_hia_p_addr; in btintel_pcie_init_ci()
992 ci->addr_tr_tia = data->ia.tr_tia_p_addr; in btintel_pcie_init_ci()
993 ci->addr_cr_tia = data->ia.cr_tia_p_addr; in btintel_pcie_init_ci()
994 ci->addr_tr_hia = data->ia.tr_hia_p_addr; in btintel_pcie_init_ci()
997 ci->addr_urbdq0 = data->txq.urbd0s_p_addr; in btintel_pcie_init_ci()
998 ci->addr_tfdq = data->txq.tfds_p_addr; in btintel_pcie_init_ci()
999 ci->num_tfdq = data->txq.count; in btintel_pcie_init_ci()
1000 ci->num_urbdq0 = data->txq.count; in btintel_pcie_init_ci()
1004 ci->addr_frbdq = data->rxq.frbds_p_addr; in btintel_pcie_init_ci()
1005 ci->num_frbdq = data->rxq.count; in btintel_pcie_init_ci()
1007 ci->addr_urbdq1 = data->rxq.urbd1s_p_addr; in btintel_pcie_init_ci()
1008 ci->num_urbdq1 = data->rxq.count; in btintel_pcie_init_ci()
1012 static void btintel_pcie_free_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_txq_bufs() argument
1015 /* Free data buffers first */ in btintel_pcie_free_txq_bufs()
1016 dma_free_coherent(&data->pdev->dev, txq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_txq_bufs()
1021 static int btintel_pcie_setup_txq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_txq_bufs() argument
1032 /* Allocate full chunk of data buffer for DMA first and do indexing and in btintel_pcie_setup_txq_bufs()
1035 txq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_txq_bufs()
1050 buf->data = txq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_txq_bufs()
1056 static void btintel_pcie_free_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_free_rxq_bufs() argument
1059 /* Free data buffers first */ in btintel_pcie_free_rxq_bufs()
1060 dma_free_coherent(&data->pdev->dev, rxq->count * BTINTEL_PCIE_BUFFER_SIZE, in btintel_pcie_free_rxq_bufs()
1065 static int btintel_pcie_setup_rxq_bufs(struct btintel_pcie_data *data, in btintel_pcie_setup_rxq_bufs() argument
1076 /* Allocate full chunk of data buffer for DMA first and do indexing and in btintel_pcie_setup_rxq_bufs()
1079 rxq->buf_v_addr = dma_alloc_coherent(&data->pdev->dev, in btintel_pcie_setup_rxq_bufs()
1094 buf->data = rxq->buf_v_addr + (i * BTINTEL_PCIE_BUFFER_SIZE); in btintel_pcie_setup_rxq_bufs()
1100 static void btintel_pcie_setup_ia(struct btintel_pcie_data *data, in btintel_pcie_setup_ia() argument
1121 static void btintel_pcie_free(struct btintel_pcie_data *data) in btintel_pcie_free() argument
1123 btintel_pcie_free_rxq_bufs(data, &data->rxq); in btintel_pcie_free()
1124 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_free()
1126 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_free()
1127 dma_pool_destroy(data->dma_pool); in btintel_pcie_free()
1130 /* Allocate tx and rx queues, any related data structures and buffers.
1132 static int btintel_pcie_alloc(struct btintel_pcie_data *data) in btintel_pcie_alloc() argument
1141 * The DMA memory for data buffer is allocated while setting up the in btintel_pcie_alloc()
1159 data->dma_pool = dma_pool_create(KBUILD_MODNAME, &data->pdev->dev, in btintel_pcie_alloc()
1161 if (!data->dma_pool) { in btintel_pcie_alloc()
1166 v_addr = dma_pool_zalloc(data->dma_pool, GFP_KERNEL | __GFP_NOWARN, in btintel_pcie_alloc()
1169 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
1174 data->dma_p_addr = p_addr; in btintel_pcie_alloc()
1175 data->dma_v_addr = v_addr; in btintel_pcie_alloc()
1178 data->txq.count = BTINTEL_DESCS_COUNT; in btintel_pcie_alloc()
1179 data->rxq.count = BTINTEL_DESCS_COUNT; in btintel_pcie_alloc()
1182 data->txq.tfds_p_addr = p_addr; in btintel_pcie_alloc()
1183 data->txq.tfds = v_addr; in btintel_pcie_alloc()
1189 data->txq.urbd0s_p_addr = p_addr; in btintel_pcie_alloc()
1190 data->txq.urbd0s = v_addr; in btintel_pcie_alloc()
1196 data->rxq.frbds_p_addr = p_addr; in btintel_pcie_alloc()
1197 data->rxq.frbds = v_addr; in btintel_pcie_alloc()
1203 data->rxq.urbd1s_p_addr = p_addr; in btintel_pcie_alloc()
1204 data->rxq.urbd1s = v_addr; in btintel_pcie_alloc()
1209 /* Setup data buffers for txq */ in btintel_pcie_alloc()
1210 err = btintel_pcie_setup_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
1214 /* Setup data buffers for rxq */ in btintel_pcie_alloc()
1215 err = btintel_pcie_setup_rxq_bufs(data, &data->rxq); in btintel_pcie_alloc()
1220 btintel_pcie_setup_ia(data, p_addr, v_addr, &data->ia); in btintel_pcie_alloc()
1226 data->ci = v_addr; in btintel_pcie_alloc()
1227 data->ci_p_addr = p_addr; in btintel_pcie_alloc()
1230 btintel_pcie_init_ci(data, data->ci); in btintel_pcie_alloc()
1235 btintel_pcie_free_txq_bufs(data, &data->txq); in btintel_pcie_alloc()
1237 dma_pool_free(data->dma_pool, data->dma_v_addr, data->dma_p_addr); in btintel_pcie_alloc()
1238 dma_pool_destroy(data->dma_pool); in btintel_pcie_alloc()
1285 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_send_frame() local
1294 * the first byte to get the packet type and redirect the rest of data in btintel_pcie_send_frame()
1297 * But for PCIe, THF(Transfer Flow Handler) fetches the 4 bytes of data in btintel_pcie_send_frame()
1303 * head room for profile and driver use, and before sending the data in btintel_pcie_send_frame()
1309 cmd = (void *)skb->data; in btintel_pcie_send_frame()
1312 struct hci_command_hdr *cmd = (void *)skb->data; in btintel_pcie_send_frame()
1343 ret = btintel_pcie_send_sync(data, skb); in btintel_pcie_send_frame()
1352 old_ctxt = data->alive_intr_ctxt; in btintel_pcie_send_frame()
1353 data->alive_intr_ctxt = in btintel_pcie_send_frame()
1356 bt_dev_dbg(data->hdev, "sent cmd: 0x%4.4x alive context changed: %s -> %s", in btintel_pcie_send_frame()
1358 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_frame()
1360 data->gp0_received = false; in btintel_pcie_send_frame()
1361 ret = wait_event_timeout(data->gp0_wait_q, in btintel_pcie_send_frame()
1362 data->gp0_received, in btintel_pcie_send_frame()
1367 btintel_pcie_alivectxt_state2str(data->alive_intr_ctxt)); in btintel_pcie_send_frame()
1380 static void btintel_pcie_release_hdev(struct btintel_pcie_data *data) in btintel_pcie_release_hdev() argument
1384 hdev = data->hdev; in btintel_pcie_release_hdev()
1387 data->hdev = NULL; in btintel_pcie_release_hdev()
1407 if (skb->data[0]) { in btintel_pcie_setup_internal()
1409 skb->data[0]); in btintel_pcie_setup_internal()
1423 /* For TLV type device, parse the tlv data */ in btintel_pcie_setup_internal()
1484 struct btintel_pcie_data *data = hci_get_drvdata(hdev); in btintel_pcie_setup() local
1489 err = btintel_pcie_reset_bt(data); in btintel_pcie_setup()
1495 btintel_pcie_reset_ia(data); in btintel_pcie_setup()
1496 btintel_pcie_config_msix(data); in btintel_pcie_setup()
1497 err = btintel_pcie_enable_bt(data); in btintel_pcie_setup()
1502 btintel_pcie_start_rx(data); in btintel_pcie_setup()
1507 static int btintel_pcie_setup_hdev(struct btintel_pcie_data *data) in btintel_pcie_setup_hdev() argument
1517 hci_set_drvdata(hdev, data); in btintel_pcie_setup_hdev()
1519 data->hdev = hdev; in btintel_pcie_setup_hdev()
1520 SET_HCIDEV_DEV(hdev, &data->pdev->dev); in btintel_pcie_setup_hdev()
1549 struct btintel_pcie_data *data; in btintel_pcie_probe() local
1554 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in btintel_pcie_probe()
1555 if (!data) in btintel_pcie_probe()
1558 data->pdev = pdev; in btintel_pcie_probe()
1560 spin_lock_init(&data->irq_lock); in btintel_pcie_probe()
1561 spin_lock_init(&data->hci_rx_lock); in btintel_pcie_probe()
1563 init_waitqueue_head(&data->gp0_wait_q); in btintel_pcie_probe()
1564 data->gp0_received = false; in btintel_pcie_probe()
1566 init_waitqueue_head(&data->tx_wait_q); in btintel_pcie_probe()
1567 data->tx_wait_done = false; in btintel_pcie_probe()
1569 data->workqueue = alloc_ordered_workqueue(KBUILD_MODNAME, WQ_HIGHPRI); in btintel_pcie_probe()
1570 if (!data->workqueue) in btintel_pcie_probe()
1573 skb_queue_head_init(&data->rx_skb_q); in btintel_pcie_probe()
1574 INIT_WORK(&data->rx_work, btintel_pcie_rx_work); in btintel_pcie_probe()
1576 data->boot_stage_cache = 0x00; in btintel_pcie_probe()
1577 data->img_resp_cache = 0x00; in btintel_pcie_probe()
1579 err = btintel_pcie_config_pcie(pdev, data); in btintel_pcie_probe()
1583 pci_set_drvdata(pdev, data); in btintel_pcie_probe()
1585 err = btintel_pcie_alloc(data); in btintel_pcie_probe()
1589 err = btintel_pcie_enable_bt(data); in btintel_pcie_probe()
1594 data->cnvi = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_HW_REV_REG); in btintel_pcie_probe()
1596 data->cnvr = btintel_pcie_rd_reg32(data, BTINTEL_PCIE_CSR_RF_ID_REG); in btintel_pcie_probe()
1598 err = btintel_pcie_start_rx(data); in btintel_pcie_probe()
1602 err = btintel_pcie_setup_hdev(data); in btintel_pcie_probe()
1606 bt_dev_dbg(data->hdev, "cnvi: 0x%8.8x cnvr: 0x%8.8x", data->cnvi, in btintel_pcie_probe()
1607 data->cnvr); in btintel_pcie_probe()
1612 btintel_pcie_reset_bt(data); in btintel_pcie_probe()
1623 struct btintel_pcie_data *data; in btintel_pcie_remove() local
1625 data = pci_get_drvdata(pdev); in btintel_pcie_remove()
1627 btintel_pcie_reset_bt(data); in btintel_pcie_remove()
1628 for (int i = 0; i < data->alloc_vecs; i++) { in btintel_pcie_remove()
1631 msix_entry = &data->msix_entries[i]; in btintel_pcie_remove()
1637 btintel_pcie_release_hdev(data); in btintel_pcie_remove()
1639 flush_work(&data->rx_work); in btintel_pcie_remove()
1641 destroy_workqueue(data->workqueue); in btintel_pcie_remove()
1643 btintel_pcie_free(data); in btintel_pcie_remove()