Lines Matching refs:pio
141 struct hci_pio_data *pio; in hci_pio_init() local
144 pio = kzalloc(sizeof(*pio), GFP_KERNEL); in hci_pio_init()
145 if (!pio) in hci_pio_init()
148 hci->io_data = pio; in hci_pio_init()
149 spin_lock_init(&pio->lock); in hci_pio_init()
174 pio->rx_thresh_size = 2 << rx_thresh; in hci_pio_init()
175 pio->tx_thresh_size = 2 << tx_thresh; in hci_pio_init()
178 pio->rx_thresh_size = 1 << rx_thresh; in hci_pio_init()
179 pio->tx_thresh_size = 1 << tx_thresh; in hci_pio_init()
191 pio->max_ibi_thresh = clamp_val(ibi_val/2, 1, 63); in hci_pio_init()
193 FIELD_PREP(QUEUE_IBI_DATA_THLD, pio->max_ibi_thresh) | in hci_pio_init()
197 pio->reg_queue_thresh = val; in hci_pio_init()
204 pio->enabled_irqs = STAT_ALL_ERRORS; in hci_pio_init()
211 struct hci_pio_data *pio = hci->io_data; in hci_pio_cleanup() local
215 if (pio) { in hci_pio_cleanup()
218 BUG_ON(pio->curr_xfer); in hci_pio_cleanup()
219 BUG_ON(pio->curr_rx); in hci_pio_cleanup()
220 BUG_ON(pio->curr_tx); in hci_pio_cleanup()
221 BUG_ON(pio->curr_resp); in hci_pio_cleanup()
222 kfree(pio); in hci_pio_cleanup()
241 static bool hci_pio_do_rx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_do_rx() argument
243 struct hci_xfer *xfer = pio->curr_rx; in hci_pio_do_rx()
254 nr_words = min(xfer->data_left / 4, pio->rx_thresh_size); in hci_pio_do_rx()
267 struct hci_pio_data *pio, unsigned int count) in hci_pio_do_trailing_rx() argument
269 struct hci_xfer *xfer = pio->curr_rx; in hci_pio_do_trailing_rx()
307 static bool hci_pio_do_tx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_do_tx() argument
309 struct hci_xfer *xfer = pio->curr_tx; in hci_pio_do_tx()
321 nr_words = min(xfer->data_left / 4, pio->tx_thresh_size); in hci_pio_do_tx()
347 static bool hci_pio_process_rx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_rx() argument
349 while (pio->curr_rx && hci_pio_do_rx(hci, pio)) in hci_pio_process_rx()
350 pio->curr_rx = pio->curr_rx->next_data; in hci_pio_process_rx()
351 return !pio->curr_rx; in hci_pio_process_rx()
354 static bool hci_pio_process_tx(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_tx() argument
356 while (pio->curr_tx && hci_pio_do_tx(hci, pio)) in hci_pio_process_tx()
357 pio->curr_tx = pio->curr_tx->next_data; in hci_pio_process_tx()
358 return !pio->curr_tx; in hci_pio_process_tx()
361 static void hci_pio_queue_data(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_queue_data() argument
363 struct hci_xfer *xfer = pio->curr_xfer; in hci_pio_queue_data()
372 prev_queue_tail = pio->rx_queue; in hci_pio_queue_data()
373 pio->rx_queue = xfer; in hci_pio_queue_data()
374 if (pio->curr_rx) { in hci_pio_queue_data()
377 pio->curr_rx = xfer; in hci_pio_queue_data()
378 if (!hci_pio_process_rx(hci, pio)) in hci_pio_queue_data()
379 pio->enabled_irqs |= STAT_RX_THLD; in hci_pio_queue_data()
382 prev_queue_tail = pio->tx_queue; in hci_pio_queue_data()
383 pio->tx_queue = xfer; in hci_pio_queue_data()
384 if (pio->curr_tx) { in hci_pio_queue_data()
387 pio->curr_tx = xfer; in hci_pio_queue_data()
388 if (!hci_pio_process_tx(hci, pio)) in hci_pio_queue_data()
389 pio->enabled_irqs |= STAT_TX_THLD; in hci_pio_queue_data()
473 static void hci_pio_err(struct i3c_hci *hci, struct hci_pio_data *pio,
476 static bool hci_pio_process_resp(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_resp() argument
478 while (pio->curr_resp && in hci_pio_process_resp()
480 struct hci_xfer *xfer = pio->curr_resp; in hci_pio_process_resp()
490 hci_pio_err(hci, pio, STAT_PROG_ERRORS); in hci_pio_process_resp()
495 if (pio->curr_rx == xfer) { in hci_pio_process_resp()
506 hci_pio_do_trailing_rx(hci, pio, in hci_pio_process_resp()
515 if (hci_pio_process_rx(hci, pio)) in hci_pio_process_resp()
516 pio->enabled_irqs &= ~STAT_RX_THLD; in hci_pio_process_resp()
524 if (pio->curr_rx == xfer) { in hci_pio_process_resp()
526 pio->curr_rx = pio->curr_rx->next_data; in hci_pio_process_resp()
527 } else if (pio->curr_tx == xfer) { in hci_pio_process_resp()
529 pio->curr_tx = pio->curr_tx->next_data; in hci_pio_process_resp()
535 pio->curr_resp = xfer->next_resp; in hci_pio_process_resp()
539 return !pio->curr_resp; in hci_pio_process_resp()
542 static void hci_pio_queue_resp(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_queue_resp() argument
544 struct hci_xfer *xfer = pio->curr_xfer; in hci_pio_queue_resp()
550 prev_queue_tail = pio->resp_queue; in hci_pio_queue_resp()
551 pio->resp_queue = xfer; in hci_pio_queue_resp()
552 if (pio->curr_resp) { in hci_pio_queue_resp()
555 pio->curr_resp = xfer; in hci_pio_queue_resp()
556 if (!hci_pio_process_resp(hci, pio)) in hci_pio_queue_resp()
557 pio->enabled_irqs |= STAT_RESP_READY; in hci_pio_queue_resp()
561 static bool hci_pio_process_cmd(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_cmd() argument
563 while (pio->curr_xfer && in hci_pio_process_cmd()
569 hci_pio_queue_data(hci, pio); in hci_pio_process_cmd()
575 hci_pio_queue_resp(hci, pio); in hci_pio_process_cmd()
579 hci_pio_write_cmd(hci, pio->curr_xfer); in hci_pio_process_cmd()
583 pio->curr_xfer = pio->curr_xfer->next_xfer; in hci_pio_process_cmd()
585 return !pio->curr_xfer; in hci_pio_process_cmd()
590 struct hci_pio_data *pio = hci->io_data; in hci_pio_queue_xfer() local
604 spin_lock_irq(&pio->lock); in hci_pio_queue_xfer()
605 prev_queue_tail = pio->xfer_queue; in hci_pio_queue_xfer()
606 pio->xfer_queue = &xfer[n - 1]; in hci_pio_queue_xfer()
607 if (pio->curr_xfer) { in hci_pio_queue_xfer()
610 pio->curr_xfer = xfer; in hci_pio_queue_xfer()
611 if (!hci_pio_process_cmd(hci, pio)) in hci_pio_queue_xfer()
612 pio->enabled_irqs |= STAT_CMD_QUEUE_READY; in hci_pio_queue_xfer()
613 pio_reg_write(INTR_SIGNAL_ENABLE, pio->enabled_irqs); in hci_pio_queue_xfer()
617 spin_unlock_irq(&pio->lock); in hci_pio_queue_xfer()
622 struct hci_pio_data *pio, in hci_pio_dequeue_xfer_common() argument
634 for (p = pio->curr_resp; p; p = p->next_resp) in hci_pio_dequeue_xfer_common()
638 for (p = pio->curr_rx; p; p = p->next_data) in hci_pio_dequeue_xfer_common()
642 for (p = pio->curr_tx; p; p = p->next_data) in hci_pio_dequeue_xfer_common()
651 p_prev_next = &pio->curr_xfer; in hci_pio_dequeue_xfer_common()
652 for (p = pio->curr_xfer; p; p = p->next_xfer) { in hci_pio_dequeue_xfer_common()
668 for (p = pio->curr_resp; p; p = p->next_resp) { in hci_pio_dequeue_xfer_common()
673 for (p = pio->curr_xfer; p; p = p->next_xfer) { in hci_pio_dequeue_xfer_common()
678 pio->curr_xfer = pio->curr_rx = pio->curr_tx = pio->curr_resp = NULL; in hci_pio_dequeue_xfer_common()
685 struct hci_pio_data *pio = hci->io_data; in hci_pio_dequeue_xfer() local
688 spin_lock_irq(&pio->lock); in hci_pio_dequeue_xfer()
694 ret = hci_pio_dequeue_xfer_common(hci, pio, xfer, n); in hci_pio_dequeue_xfer()
695 spin_unlock_irq(&pio->lock); in hci_pio_dequeue_xfer()
699 static void hci_pio_err(struct i3c_hci *hci, struct hci_pio_data *pio, in hci_pio_err() argument
728 hci_pio_dequeue_xfer_common(hci, pio, pio->curr_resp, 1); in hci_pio_err()
730 if (pio->curr_tx && pio->curr_tx->data_left != pio->curr_tx->data_len) in hci_pio_err()
731 hci_pio_dequeue_xfer_common(hci, pio, pio->curr_tx, 1); in hci_pio_err()
741 struct hci_pio_data *pio, in hci_pio_set_ibi_thresh() argument
744 u32 regval = pio->reg_queue_thresh; in hci_pio_set_ibi_thresh()
749 if (regval != pio->reg_queue_thresh) { in hci_pio_set_ibi_thresh()
751 pio->reg_queue_thresh = regval; in hci_pio_set_ibi_thresh()
757 struct hci_pio_data *pio) in hci_pio_get_ibi_segment() argument
759 struct hci_pio_ibi_data *ibi = &pio->ibi; in hci_pio_get_ibi_segment()
768 thresh_val = min(nr_words, pio->max_ibi_thresh); in hci_pio_get_ibi_segment()
769 hci_pio_set_ibi_thresh(hci, pio, thresh_val); in hci_pio_get_ibi_segment()
791 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_get_ibi_segment()
806 static bool hci_pio_prep_new_ibi(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_prep_new_ibi() argument
808 struct hci_pio_ibi_data *ibi = &pio->ibi; in hci_pio_prep_new_ibi()
861 static void hci_pio_free_ibi_slot(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_free_ibi_slot() argument
863 struct hci_pio_ibi_data *ibi = &pio->ibi; in hci_pio_free_ibi_slot()
873 static bool hci_pio_process_ibi(struct i3c_hci *hci, struct hci_pio_data *pio) in hci_pio_process_ibi() argument
875 struct hci_pio_ibi_data *ibi = &pio->ibi; in hci_pio_process_ibi()
878 if (!hci_pio_prep_new_ibi(hci, pio)) in hci_pio_process_ibi()
886 if (!hci_pio_get_ibi_segment(hci, pio)) in hci_pio_process_ibi()
894 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_process_ibi()
904 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_process_ibi()
915 hci_pio_set_ibi_thresh(hci, pio, 1); in hci_pio_process_ibi()
925 hci_pio_free_ibi_slot(hci, pio); in hci_pio_process_ibi()
934 hci_pio_free_ibi_slot(hci, pio); in hci_pio_process_ibi()
984 struct hci_pio_data *pio = hci->io_data; in hci_pio_irq_handler() local
987 spin_lock(&pio->lock); in hci_pio_irq_handler()
989 DBG("(in) status: %#x/%#x", status, pio->enabled_irqs); in hci_pio_irq_handler()
990 status &= pio->enabled_irqs | STAT_LATENCY_WARNINGS; in hci_pio_irq_handler()
992 spin_unlock(&pio->lock); in hci_pio_irq_handler()
997 hci_pio_process_ibi(hci, pio); in hci_pio_irq_handler()
1000 if (hci_pio_process_rx(hci, pio)) in hci_pio_irq_handler()
1001 pio->enabled_irqs &= ~STAT_RX_THLD; in hci_pio_irq_handler()
1003 if (hci_pio_process_tx(hci, pio)) in hci_pio_irq_handler()
1004 pio->enabled_irqs &= ~STAT_TX_THLD; in hci_pio_irq_handler()
1006 if (hci_pio_process_resp(hci, pio)) in hci_pio_irq_handler()
1007 pio->enabled_irqs &= ~STAT_RESP_READY; in hci_pio_irq_handler()
1018 hci_pio_err(hci, pio, status & STAT_ALL_ERRORS); in hci_pio_irq_handler()
1022 if (hci_pio_process_cmd(hci, pio)) in hci_pio_irq_handler()
1023 pio->enabled_irqs &= ~STAT_CMD_QUEUE_READY; in hci_pio_irq_handler()
1025 pio_reg_write(INTR_SIGNAL_ENABLE, pio->enabled_irqs); in hci_pio_irq_handler()
1028 spin_unlock(&pio->lock); in hci_pio_irq_handler()