Lines Matching full:q
103 * @q: queue to manipulate
112 static int qdio_do_eqbs(struct qdio_q *q, unsigned char *state, in qdio_do_eqbs() argument
115 int tmp_count = count, tmp_start = start, nr = q->nr; in qdio_do_eqbs()
118 qperf_inc(q, eqbs); in qdio_do_eqbs()
120 if (!q->is_input_q) in qdio_do_eqbs()
121 nr += q->irq_ptr->nr_input_qs; in qdio_do_eqbs()
123 ccq = do_eqbs(q->irq_ptr->sch_token, state, nr, &tmp_start, &tmp_count, in qdio_do_eqbs()
133 qperf_inc(q, eqbs_partial); in qdio_do_eqbs()
134 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, "EQBS part:%02x", in qdio_do_eqbs()
139 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, "EQBS again:%2d", ccq); in qdio_do_eqbs()
142 DBF_ERROR("%4x ccq:%3d", SCH_NO(q), ccq); in qdio_do_eqbs()
143 DBF_ERROR("%4x EQBS ERROR", SCH_NO(q)); in qdio_do_eqbs()
145 q->handler(q->irq_ptr->cdev, QDIO_ERROR_GET_BUF_STATE, q->nr, in qdio_do_eqbs()
146 q->first_to_kick, count, q->irq_ptr->int_parm); in qdio_do_eqbs()
153 * @q: queue to manipulate
162 static int qdio_do_sqbs(struct qdio_q *q, unsigned char state, int start, in qdio_do_sqbs() argument
167 int nr = q->nr; in qdio_do_sqbs()
171 qperf_inc(q, sqbs); in qdio_do_sqbs()
173 if (!q->is_input_q) in qdio_do_sqbs()
174 nr += q->irq_ptr->nr_input_qs; in qdio_do_sqbs()
176 ccq = do_sqbs(q->irq_ptr->sch_token, state, nr, &tmp_start, &tmp_count); in qdio_do_sqbs()
186 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "SQBS again:%2d", ccq); in qdio_do_sqbs()
187 qperf_inc(q, sqbs_partial); in qdio_do_sqbs()
190 DBF_ERROR("%4x ccq:%3d", SCH_NO(q), ccq); in qdio_do_sqbs()
191 DBF_ERROR("%4x SQBS ERROR", SCH_NO(q)); in qdio_do_sqbs()
193 q->handler(q->irq_ptr->cdev, QDIO_ERROR_SET_BUF_STATE, q->nr, in qdio_do_sqbs()
194 q->first_to_kick, count, q->irq_ptr->int_parm); in qdio_do_sqbs()
203 static inline int get_buf_states(struct qdio_q *q, unsigned int bufnr, in get_buf_states() argument
210 if (is_qebsm(q)) in get_buf_states()
211 return qdio_do_eqbs(q, state, bufnr, count, auto_ack); in get_buf_states()
214 __state = q->slsb.val[bufnr]; in get_buf_states()
223 q->slsb.val[bufnr] == SLSB_P_OUTPUT_PENDING && in get_buf_states()
228 if (q->slsb.val[bufnr] != __state) in get_buf_states()
235 static inline int get_buf_state(struct qdio_q *q, unsigned int bufnr, in get_buf_state() argument
238 return get_buf_states(q, bufnr, state, 1, auto_ack, 0); in get_buf_state()
242 static inline int set_buf_states(struct qdio_q *q, int bufnr, in set_buf_states() argument
247 if (is_qebsm(q)) in set_buf_states()
248 return qdio_do_sqbs(q, state, bufnr, count); in set_buf_states()
251 xchg(&q->slsb.val[bufnr], state); in set_buf_states()
257 static inline int set_buf_state(struct qdio_q *q, int bufnr, in set_buf_state() argument
260 return set_buf_states(q, bufnr, state, 1); in set_buf_state()
266 struct qdio_q *q; in qdio_init_buf_states() local
269 for_each_input_queue(irq_ptr, q, i) in qdio_init_buf_states()
270 set_buf_states(q, 0, SLSB_P_INPUT_NOT_INIT, in qdio_init_buf_states()
272 for_each_output_queue(irq_ptr, q, i) in qdio_init_buf_states()
273 set_buf_states(q, 0, SLSB_P_OUTPUT_NOT_INIT, in qdio_init_buf_states()
277 static inline int qdio_siga_sync(struct qdio_q *q, unsigned int output, in qdio_siga_sync() argument
280 unsigned long schid = *((u32 *) &q->irq_ptr->schid); in qdio_siga_sync()
284 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-s:%1d", q->nr); in qdio_siga_sync()
285 qperf_inc(q, siga_sync); in qdio_siga_sync()
287 if (is_qebsm(q)) { in qdio_siga_sync()
288 schid = q->irq_ptr->sch_token; in qdio_siga_sync()
294 DBF_ERROR("%4x SIGA-S:%2d", SCH_NO(q), cc); in qdio_siga_sync()
298 static inline int qdio_siga_sync_q(struct qdio_q *q) in qdio_siga_sync_q() argument
300 if (q->is_input_q) in qdio_siga_sync_q()
301 return qdio_siga_sync(q, 0, q->mask); in qdio_siga_sync_q()
303 return qdio_siga_sync(q, q->mask, 0); in qdio_siga_sync_q()
306 static int qdio_siga_output(struct qdio_q *q, unsigned int *busy_bit, in qdio_siga_output() argument
309 unsigned long schid = *((u32 *) &q->irq_ptr->schid); in qdio_siga_output()
315 WARN_ON_ONCE(aob && ((queue_type(q) != QDIO_IQDIO_QFMT) || in qdio_siga_output()
316 !q->u.out.use_cq)); in qdio_siga_output()
317 if (q->u.out.use_cq && aob != 0) { in qdio_siga_output()
322 if (is_qebsm(q)) { in qdio_siga_output()
323 schid = q->irq_ptr->sch_token; in qdio_siga_output()
327 cc = do_siga_output(schid, q->mask, busy_bit, fc, laob); in qdio_siga_output()
341 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, in qdio_siga_output()
342 "%4x cc2 BB1:%1d", SCH_NO(q), q->nr); in qdio_siga_output()
343 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, "count:%u", retries); in qdio_siga_output()
348 static inline int qdio_siga_input(struct qdio_q *q) in qdio_siga_input() argument
350 unsigned long schid = *((u32 *) &q->irq_ptr->schid); in qdio_siga_input()
354 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-r:%1d", q->nr); in qdio_siga_input()
355 qperf_inc(q, siga_read); in qdio_siga_input()
357 if (is_qebsm(q)) { in qdio_siga_input()
358 schid = q->irq_ptr->sch_token; in qdio_siga_input()
362 cc = do_siga_input(schid, q->mask, fc); in qdio_siga_input()
364 DBF_ERROR("%4x SIGA-R:%2d", SCH_NO(q), cc); in qdio_siga_input()
368 #define qdio_siga_sync_out(q) qdio_siga_sync(q, ~0U, 0) argument
369 #define qdio_siga_sync_all(q) qdio_siga_sync(q, ~0U, ~0U) argument
371 static inline void qdio_sync_queues(struct qdio_q *q) in qdio_sync_queues() argument
374 if (pci_out_supported(q)) in qdio_sync_queues()
375 qdio_siga_sync_all(q); in qdio_sync_queues()
377 qdio_siga_sync_q(q); in qdio_sync_queues()
380 int debug_get_buf_state(struct qdio_q *q, unsigned int bufnr, in debug_get_buf_state() argument
383 if (need_siga_sync(q)) in debug_get_buf_state()
384 qdio_siga_sync_q(q); in debug_get_buf_state()
385 return get_buf_states(q, bufnr, state, 1, 0, 0); in debug_get_buf_state()
388 static inline void qdio_stop_polling(struct qdio_q *q) in qdio_stop_polling() argument
390 if (!q->u.in.polling) in qdio_stop_polling()
393 q->u.in.polling = 0; in qdio_stop_polling()
394 qperf_inc(q, stop_polling); in qdio_stop_polling()
397 if (is_qebsm(q)) { in qdio_stop_polling()
398 set_buf_states(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT, in qdio_stop_polling()
399 q->u.in.ack_count); in qdio_stop_polling()
400 q->u.in.ack_count = 0; in qdio_stop_polling()
402 set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT); in qdio_stop_polling()
405 static inline void account_sbals(struct qdio_q *q, unsigned int count) in account_sbals() argument
409 q->q_stats.nr_sbal_total += count; in account_sbals()
411 q->q_stats.nr_sbals[7]++; in account_sbals()
415 q->q_stats.nr_sbals[pos]++; in account_sbals()
418 static void process_buffer_error(struct qdio_q *q, int count) in process_buffer_error() argument
420 unsigned char state = (q->is_input_q) ? SLSB_P_INPUT_NOT_INIT : in process_buffer_error()
423 q->qdio_error = QDIO_ERROR_SLSB_STATE; in process_buffer_error()
426 if (queue_type(q) == QDIO_IQDIO_QFMT && !q->is_input_q && in process_buffer_error()
427 q->sbal[q->first_to_check]->element[15].sflags == 0x10) { in process_buffer_error()
428 qperf_inc(q, target_full); in process_buffer_error()
429 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "OUTFULL FTC:%02x", in process_buffer_error()
430 q->first_to_check); in process_buffer_error()
434 DBF_ERROR("%4x BUF ERROR", SCH_NO(q)); in process_buffer_error()
435 DBF_ERROR((q->is_input_q) ? "IN:%2d" : "OUT:%2d", q->nr); in process_buffer_error()
436 DBF_ERROR("FTC:%3d C:%3d", q->first_to_check, count); in process_buffer_error()
438 q->sbal[q->first_to_check]->element[14].sflags, in process_buffer_error()
439 q->sbal[q->first_to_check]->element[15].sflags); in process_buffer_error()
446 set_buf_states(q, q->first_to_check, state, count); in process_buffer_error()
449 static inline void inbound_primed(struct qdio_q *q, int count) in inbound_primed() argument
453 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in prim:%1d %02x", q->nr, count); in inbound_primed()
456 if (is_qebsm(q)) { in inbound_primed()
457 if (!q->u.in.polling) { in inbound_primed()
458 q->u.in.polling = 1; in inbound_primed()
459 q->u.in.ack_count = count; in inbound_primed()
460 q->u.in.ack_start = q->first_to_check; in inbound_primed()
465 set_buf_states(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT, in inbound_primed()
466 q->u.in.ack_count); in inbound_primed()
467 q->u.in.ack_count = count; in inbound_primed()
468 q->u.in.ack_start = q->first_to_check; in inbound_primed()
476 new = add_buf(q->first_to_check, count - 1); in inbound_primed()
477 if (q->u.in.polling) { in inbound_primed()
479 set_buf_state(q, new, SLSB_P_INPUT_ACK); in inbound_primed()
480 set_buf_state(q, q->u.in.ack_start, SLSB_P_INPUT_NOT_INIT); in inbound_primed()
482 q->u.in.polling = 1; in inbound_primed()
483 set_buf_state(q, new, SLSB_P_INPUT_ACK); in inbound_primed()
486 q->u.in.ack_start = new; in inbound_primed()
491 set_buf_states(q, q->first_to_check, SLSB_P_INPUT_NOT_INIT, count); in inbound_primed()
494 static int get_inbound_buffer_frontier(struct qdio_q *q) in get_inbound_buffer_frontier() argument
499 q->timestamp = get_tod_clock_fast(); in get_inbound_buffer_frontier()
505 count = min(atomic_read(&q->nr_buf_used), QDIO_MAX_BUFFERS_MASK); in get_inbound_buffer_frontier()
513 count = get_buf_states(q, q->first_to_check, &state, count, 1, 0); in get_inbound_buffer_frontier()
519 inbound_primed(q, count); in get_inbound_buffer_frontier()
520 q->first_to_check = add_buf(q->first_to_check, count); in get_inbound_buffer_frontier()
521 if (atomic_sub_return(count, &q->nr_buf_used) == 0) in get_inbound_buffer_frontier()
522 qperf_inc(q, inbound_queue_full); in get_inbound_buffer_frontier()
523 if (q->irq_ptr->perf_stat_enabled) in get_inbound_buffer_frontier()
524 account_sbals(q, count); in get_inbound_buffer_frontier()
527 process_buffer_error(q, count); in get_inbound_buffer_frontier()
528 q->first_to_check = add_buf(q->first_to_check, count); in get_inbound_buffer_frontier()
529 if (atomic_sub_return(count, &q->nr_buf_used) == 0) in get_inbound_buffer_frontier()
530 qperf_inc(q, inbound_queue_full); in get_inbound_buffer_frontier()
531 if (q->irq_ptr->perf_stat_enabled) in get_inbound_buffer_frontier()
532 account_sbals_error(q, count); in get_inbound_buffer_frontier()
537 if (q->irq_ptr->perf_stat_enabled) in get_inbound_buffer_frontier()
538 q->q_stats.nr_sbal_nop++; in get_inbound_buffer_frontier()
539 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in nop:%1d %#02x", in get_inbound_buffer_frontier()
540 q->nr, q->first_to_check); in get_inbound_buffer_frontier()
546 return q->first_to_check; in get_inbound_buffer_frontier()
549 static int qdio_inbound_q_moved(struct qdio_q *q) in qdio_inbound_q_moved() argument
553 bufnr = get_inbound_buffer_frontier(q); in qdio_inbound_q_moved()
555 if (bufnr != q->last_move) { in qdio_inbound_q_moved()
556 q->last_move = bufnr; in qdio_inbound_q_moved()
557 if (!is_thinint_irq(q->irq_ptr) && MACHINE_IS_LPAR) in qdio_inbound_q_moved()
558 q->u.in.timestamp = get_tod_clock(); in qdio_inbound_q_moved()
564 static inline int qdio_inbound_q_done(struct qdio_q *q) in qdio_inbound_q_done() argument
568 if (!atomic_read(&q->nr_buf_used)) in qdio_inbound_q_done()
571 if (need_siga_sync(q)) in qdio_inbound_q_done()
572 qdio_siga_sync_q(q); in qdio_inbound_q_done()
573 get_buf_state(q, q->first_to_check, &state, 0); in qdio_inbound_q_done()
579 if (is_thinint_irq(q->irq_ptr)) in qdio_inbound_q_done()
590 if (get_tod_clock_fast() > q->u.in.timestamp + QDIO_INPUT_THRESHOLD) { in qdio_inbound_q_done()
591 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in done:%02x", in qdio_inbound_q_done()
592 q->first_to_check); in qdio_inbound_q_done()
598 static inline int contains_aobs(struct qdio_q *q) in contains_aobs() argument
600 return !q->is_input_q && q->u.out.use_cq; in contains_aobs()
603 static inline void qdio_handle_aobs(struct qdio_q *q, int start, int count) in qdio_handle_aobs() argument
608 if (!contains_aobs(q)) in qdio_handle_aobs()
612 get_buf_state(q, b, &state, 0); in qdio_handle_aobs()
614 struct qaob *aob = q->u.out.aobs[b]; in qdio_handle_aobs()
618 q->u.out.sbal_state[b].flags |= in qdio_handle_aobs()
620 q->u.out.aobs[b] = NULL; in qdio_handle_aobs()
622 q->u.out.sbal_state[b].aob = NULL; in qdio_handle_aobs()
628 static inline unsigned long qdio_aob_for_buffer(struct qdio_output_q *q, in qdio_aob_for_buffer() argument
633 if (!q->use_cq) in qdio_aob_for_buffer()
636 if (!q->aobs[bufnr]) { in qdio_aob_for_buffer()
638 q->aobs[bufnr] = aob; in qdio_aob_for_buffer()
640 if (q->aobs[bufnr]) { in qdio_aob_for_buffer()
641 q->sbal_state[bufnr].aob = q->aobs[bufnr]; in qdio_aob_for_buffer()
642 q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user; in qdio_aob_for_buffer()
643 phys_aob = virt_to_phys(q->aobs[bufnr]); in qdio_aob_for_buffer()
647 q->sbal_state[bufnr].flags = 0; in qdio_aob_for_buffer()
651 static void qdio_kick_handler(struct qdio_q *q) in qdio_kick_handler() argument
653 int start = q->first_to_kick; in qdio_kick_handler()
654 int end = q->first_to_check; in qdio_kick_handler()
657 if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE)) in qdio_kick_handler()
662 if (q->is_input_q) { in qdio_kick_handler()
663 qperf_inc(q, inbound_handler); in qdio_kick_handler()
664 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "kih s:%02x c:%02x", start, count); in qdio_kick_handler()
666 qperf_inc(q, outbound_handler); in qdio_kick_handler()
667 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "koh: s:%02x c:%02x", in qdio_kick_handler()
671 qdio_handle_aobs(q, start, count); in qdio_kick_handler()
673 q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count, in qdio_kick_handler()
674 q->irq_ptr->int_parm); in qdio_kick_handler()
677 q->first_to_kick = end; in qdio_kick_handler()
678 q->qdio_error = 0; in qdio_kick_handler()
681 static inline int qdio_tasklet_schedule(struct qdio_q *q) in qdio_tasklet_schedule() argument
683 if (likely(q->irq_ptr->state == QDIO_IRQ_STATE_ACTIVE)) { in qdio_tasklet_schedule()
684 tasklet_schedule(&q->tasklet); in qdio_tasklet_schedule()
690 static void __qdio_inbound_processing(struct qdio_q *q) in __qdio_inbound_processing() argument
692 qperf_inc(q, tasklet_inbound); in __qdio_inbound_processing()
694 if (!qdio_inbound_q_moved(q)) in __qdio_inbound_processing()
697 qdio_kick_handler(q); in __qdio_inbound_processing()
699 if (!qdio_inbound_q_done(q)) { in __qdio_inbound_processing()
701 qperf_inc(q, tasklet_inbound_resched); in __qdio_inbound_processing()
702 if (!qdio_tasklet_schedule(q)) in __qdio_inbound_processing()
706 qdio_stop_polling(q); in __qdio_inbound_processing()
711 if (!qdio_inbound_q_done(q)) { in __qdio_inbound_processing()
712 qperf_inc(q, tasklet_inbound_resched2); in __qdio_inbound_processing()
713 qdio_tasklet_schedule(q); in __qdio_inbound_processing()
719 struct qdio_q *q = (struct qdio_q *)data; in qdio_inbound_processing() local
720 __qdio_inbound_processing(q); in qdio_inbound_processing()
723 static int get_outbound_buffer_frontier(struct qdio_q *q) in get_outbound_buffer_frontier() argument
728 q->timestamp = get_tod_clock_fast(); in get_outbound_buffer_frontier()
730 if (need_siga_sync(q)) in get_outbound_buffer_frontier()
731 if (((queue_type(q) != QDIO_IQDIO_QFMT) && in get_outbound_buffer_frontier()
732 !pci_out_supported(q)) || in get_outbound_buffer_frontier()
733 (queue_type(q) == QDIO_IQDIO_QFMT && in get_outbound_buffer_frontier()
734 multicast_outbound(q))) in get_outbound_buffer_frontier()
735 qdio_siga_sync_q(q); in get_outbound_buffer_frontier()
741 count = min(atomic_read(&q->nr_buf_used), QDIO_MAX_BUFFERS_MASK); in get_outbound_buffer_frontier()
745 count = get_buf_states(q, q->first_to_check, &state, count, 0, in get_outbound_buffer_frontier()
746 q->u.out.use_cq); in get_outbound_buffer_frontier()
754 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, in get_outbound_buffer_frontier()
755 "out empty:%1d %02x", q->nr, count); in get_outbound_buffer_frontier()
757 atomic_sub(count, &q->nr_buf_used); in get_outbound_buffer_frontier()
758 q->first_to_check = add_buf(q->first_to_check, count); in get_outbound_buffer_frontier()
759 if (q->irq_ptr->perf_stat_enabled) in get_outbound_buffer_frontier()
760 account_sbals(q, count); in get_outbound_buffer_frontier()
764 process_buffer_error(q, count); in get_outbound_buffer_frontier()
765 q->first_to_check = add_buf(q->first_to_check, count); in get_outbound_buffer_frontier()
766 atomic_sub(count, &q->nr_buf_used); in get_outbound_buffer_frontier()
767 if (q->irq_ptr->perf_stat_enabled) in get_outbound_buffer_frontier()
768 account_sbals_error(q, count); in get_outbound_buffer_frontier()
772 if (q->irq_ptr->perf_stat_enabled) in get_outbound_buffer_frontier()
773 q->q_stats.nr_sbal_nop++; in get_outbound_buffer_frontier()
774 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "out primed:%1d", in get_outbound_buffer_frontier()
775 q->nr); in get_outbound_buffer_frontier()
785 return q->first_to_check; in get_outbound_buffer_frontier()
789 static inline int qdio_outbound_q_done(struct qdio_q *q) in qdio_outbound_q_done() argument
791 return atomic_read(&q->nr_buf_used) == 0; in qdio_outbound_q_done()
794 static inline int qdio_outbound_q_moved(struct qdio_q *q) in qdio_outbound_q_moved() argument
798 bufnr = get_outbound_buffer_frontier(q); in qdio_outbound_q_moved()
800 if (bufnr != q->last_move) { in qdio_outbound_q_moved()
801 q->last_move = bufnr; in qdio_outbound_q_moved()
802 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "out moved:%1d", q->nr); in qdio_outbound_q_moved()
808 static int qdio_kick_outbound_q(struct qdio_q *q, unsigned long aob) in qdio_kick_outbound_q() argument
813 if (!need_siga_out(q)) in qdio_kick_outbound_q()
816 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w:%1d", q->nr); in qdio_kick_outbound_q()
818 qperf_inc(q, siga_write); in qdio_kick_outbound_q()
820 cc = qdio_siga_output(q, &busy_bit, aob); in qdio_kick_outbound_q()
830 DBF_ERROR("%4x cc2 BBC:%1d", SCH_NO(q), q->nr); in qdio_kick_outbound_q()
833 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w cc2:%1d", q->nr); in qdio_kick_outbound_q()
839 DBF_ERROR("%4x SIGA-W:%1d", SCH_NO(q), cc); in qdio_kick_outbound_q()
844 DBF_ERROR("%4x cc2 BB2:%1d", SCH_NO(q), q->nr); in qdio_kick_outbound_q()
850 static void __qdio_outbound_processing(struct qdio_q *q) in __qdio_outbound_processing() argument
852 qperf_inc(q, tasklet_outbound); in __qdio_outbound_processing()
853 WARN_ON_ONCE(atomic_read(&q->nr_buf_used) < 0); in __qdio_outbound_processing()
855 if (qdio_outbound_q_moved(q)) in __qdio_outbound_processing()
856 qdio_kick_handler(q); in __qdio_outbound_processing()
858 if (queue_type(q) == QDIO_ZFCP_QFMT) in __qdio_outbound_processing()
859 if (!pci_out_supported(q) && !qdio_outbound_q_done(q)) in __qdio_outbound_processing()
862 if (q->u.out.pci_out_enabled) in __qdio_outbound_processing()
870 if (qdio_outbound_q_done(q)) in __qdio_outbound_processing()
871 del_timer_sync(&q->u.out.timer); in __qdio_outbound_processing()
873 if (!timer_pending(&q->u.out.timer) && in __qdio_outbound_processing()
874 likely(q->irq_ptr->state == QDIO_IRQ_STATE_ACTIVE)) in __qdio_outbound_processing()
875 mod_timer(&q->u.out.timer, jiffies + 10 * HZ); in __qdio_outbound_processing()
879 qdio_tasklet_schedule(q); in __qdio_outbound_processing()
885 struct qdio_q *q = (struct qdio_q *)data; in qdio_outbound_processing() local
886 __qdio_outbound_processing(q); in qdio_outbound_processing()
891 struct qdio_q *q = from_timer(q, t, u.out.timer); in qdio_outbound_timer() local
893 qdio_tasklet_schedule(q); in qdio_outbound_timer()
896 static inline void qdio_check_outbound_after_thinint(struct qdio_q *q) in qdio_check_outbound_after_thinint() argument
901 if (!pci_out_supported(q)) in qdio_check_outbound_after_thinint()
904 for_each_output_queue(q->irq_ptr, out, i) in qdio_check_outbound_after_thinint()
909 static void __tiqdio_inbound_processing(struct qdio_q *q) in __tiqdio_inbound_processing() argument
911 qperf_inc(q, tasklet_inbound); in __tiqdio_inbound_processing()
912 if (need_siga_sync(q) && need_siga_sync_after_ai(q)) in __tiqdio_inbound_processing()
913 qdio_sync_queues(q); in __tiqdio_inbound_processing()
919 qdio_check_outbound_after_thinint(q); in __tiqdio_inbound_processing()
921 if (!qdio_inbound_q_moved(q)) in __tiqdio_inbound_processing()
924 qdio_kick_handler(q); in __tiqdio_inbound_processing()
926 if (!qdio_inbound_q_done(q)) { in __tiqdio_inbound_processing()
927 qperf_inc(q, tasklet_inbound_resched); in __tiqdio_inbound_processing()
928 if (!qdio_tasklet_schedule(q)) in __tiqdio_inbound_processing()
932 qdio_stop_polling(q); in __tiqdio_inbound_processing()
937 if (!qdio_inbound_q_done(q)) { in __tiqdio_inbound_processing()
938 qperf_inc(q, tasklet_inbound_resched2); in __tiqdio_inbound_processing()
939 qdio_tasklet_schedule(q); in __tiqdio_inbound_processing()
945 struct qdio_q *q = (struct qdio_q *)data; in tiqdio_inbound_processing() local
946 __tiqdio_inbound_processing(q); in tiqdio_inbound_processing()
971 struct qdio_q *q; in qdio_int_handler_pci() local
976 for_each_input_queue(irq_ptr, q, i) { in qdio_int_handler_pci()
977 if (q->u.in.queue_start_poll) { in qdio_int_handler_pci()
980 &q->u.in.queue_irq_state)) { in qdio_int_handler_pci()
981 qperf_inc(q, int_discarded); in qdio_int_handler_pci()
984 q->u.in.queue_start_poll(q->irq_ptr->cdev, q->nr, in qdio_int_handler_pci()
985 q->irq_ptr->int_parm); in qdio_int_handler_pci()
987 tasklet_schedule(&q->tasklet); in qdio_int_handler_pci()
994 for_each_output_queue(irq_ptr, q, i) { in qdio_int_handler_pci()
995 if (qdio_outbound_q_done(q)) in qdio_int_handler_pci()
997 if (need_siga_sync(q) && need_siga_sync_out_after_pci(q)) in qdio_int_handler_pci()
998 qdio_siga_sync_q(q); in qdio_int_handler_pci()
999 qdio_tasklet_schedule(q); in qdio_int_handler_pci()
1007 struct qdio_q *q; in qdio_handle_activate_check() local
1015 q = irq_ptr->input_qs[0]; in qdio_handle_activate_check()
1017 q = irq_ptr->output_qs[0]; in qdio_handle_activate_check()
1023 count = sub_buf(q->first_to_check, q->first_to_kick); in qdio_handle_activate_check()
1024 q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE, in qdio_handle_activate_check()
1025 q->nr, q->first_to_kick, count, irq_ptr->int_parm); in qdio_handle_activate_check()
1134 struct qdio_q *q; in qdio_shutdown_queues() local
1137 for_each_input_queue(irq_ptr, q, i) in qdio_shutdown_queues()
1138 tasklet_kill(&q->tasklet); in qdio_shutdown_queues()
1140 for_each_output_queue(irq_ptr, q, i) { in qdio_shutdown_queues()
1141 del_timer_sync(&q->u.out.timer); in qdio_shutdown_queues()
1142 tasklet_kill(&q->tasklet); in qdio_shutdown_queues()
1314 struct qdio_q *q = irq_ptr->input_qs[0]; in qdio_detect_hsicq() local
1317 if (irq_ptr->nr_input_qs > 1 && queue_type(q) == QDIO_IQDIO_QFMT) in qdio_detect_hsicq()
1320 for_each_output_queue(irq_ptr, q, i) { in qdio_detect_hsicq()
1322 if (qdio_enable_async_operation(&q->u.out) < 0) { in qdio_detect_hsicq()
1327 qdio_disable_async_operation(&q->u.out); in qdio_detect_hsicq()
1360 /* establish q */ in qdio_establish()
1485 * @q: queue containing the buffers
1490 static int handle_inbound(struct qdio_q *q, unsigned int callflags, in handle_inbound() argument
1495 qperf_inc(q, inbound_call); in handle_inbound()
1497 if (!q->u.in.polling) in handle_inbound()
1503 q->u.in.polling = 0; in handle_inbound()
1504 q->u.in.ack_count = 0; in handle_inbound()
1506 } else if (buf_in_between(q->u.in.ack_start, bufnr, count)) { in handle_inbound()
1507 if (is_qebsm(q)) { in handle_inbound()
1510 diff = sub_buf(diff, q->u.in.ack_start); in handle_inbound()
1511 q->u.in.ack_count -= diff; in handle_inbound()
1512 if (q->u.in.ack_count <= 0) { in handle_inbound()
1513 q->u.in.polling = 0; in handle_inbound()
1514 q->u.in.ack_count = 0; in handle_inbound()
1517 q->u.in.ack_start = add_buf(q->u.in.ack_start, diff); in handle_inbound()
1521 q->u.in.polling = 0; in handle_inbound()
1525 count = set_buf_states(q, bufnr, SLSB_CU_INPUT_EMPTY, count); in handle_inbound()
1526 atomic_add(count, &q->nr_buf_used); in handle_inbound()
1528 if (need_siga_in(q)) in handle_inbound()
1529 return qdio_siga_input(q); in handle_inbound()
1536 * @q: queue containing the buffers
1541 static int handle_outbound(struct qdio_q *q, unsigned int callflags, in handle_outbound() argument
1547 qperf_inc(q, outbound_call); in handle_outbound()
1549 count = set_buf_states(q, bufnr, SLSB_CU_OUTPUT_PRIMED, count); in handle_outbound()
1550 used = atomic_add_return(count, &q->nr_buf_used); in handle_outbound()
1553 qperf_inc(q, outbound_queue_full); in handle_outbound()
1556 q->u.out.pci_out_enabled = 1; in handle_outbound()
1557 qperf_inc(q, pci_request_int); in handle_outbound()
1559 q->u.out.pci_out_enabled = 0; in handle_outbound()
1561 if (queue_type(q) == QDIO_IQDIO_QFMT) { in handle_outbound()
1565 WARN_ON_ONCE(count > 1 && !multicast_outbound(q)); in handle_outbound()
1567 phys_aob = qdio_aob_for_buffer(&q->u.out, bufnr); in handle_outbound()
1569 rc = qdio_kick_outbound_q(q, phys_aob); in handle_outbound()
1570 } else if (need_siga_sync(q)) { in handle_outbound()
1571 rc = qdio_siga_sync_q(q); in handle_outbound()
1573 get_buf_state(q, prev_buf(bufnr), &state, 0) > 0 && in handle_outbound()
1576 qperf_inc(q, fast_requeue); in handle_outbound()
1578 rc = qdio_kick_outbound_q(q, 0); in handle_outbound()
1582 if (used >= q->u.out.scan_threshold || rc) in handle_outbound()
1583 qdio_tasklet_schedule(q); in handle_outbound()
1586 if (!timer_pending(&q->u.out.timer) && in handle_outbound()
1587 likely(q->irq_ptr->state == QDIO_IRQ_STATE_ACTIVE)) in handle_outbound()
1588 mod_timer(&q->u.out.timer, jiffies + HZ); in handle_outbound()
1640 struct qdio_q *q; in qdio_start_irq() local
1645 q = irq_ptr->input_qs[nr]; in qdio_start_irq()
1648 qdio_stop_polling(q); in qdio_start_irq()
1649 clear_bit(QDIO_QUEUE_IRQS_DISABLED, &q->u.in.queue_irq_state); in qdio_start_irq()
1657 if (!qdio_inbound_q_done(q)) in qdio_start_irq()
1663 &q->u.in.queue_irq_state)) in qdio_start_irq()
1686 struct qdio_q *q; in qdio_get_next_buffers() local
1692 q = irq_ptr->input_qs[nr]; in qdio_get_next_buffers()
1698 if (need_siga_sync(q)) in qdio_get_next_buffers()
1699 qdio_sync_queues(q); in qdio_get_next_buffers()
1702 qdio_check_outbound_after_thinint(q); in qdio_get_next_buffers()
1704 if (!qdio_inbound_q_moved(q)) in qdio_get_next_buffers()
1708 if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE)) in qdio_get_next_buffers()
1711 start = q->first_to_kick; in qdio_get_next_buffers()
1712 end = q->first_to_check; in qdio_get_next_buffers()
1714 *error = q->qdio_error; in qdio_get_next_buffers()
1717 q->first_to_kick = end; in qdio_get_next_buffers()
1718 q->qdio_error = 0; in qdio_get_next_buffers()
1734 struct qdio_q *q; in qdio_stop_irq() local
1739 q = irq_ptr->input_qs[nr]; in qdio_stop_irq()
1742 &q->u.in.queue_irq_state)) in qdio_stop_irq()