• Home
  • Raw
  • Download

Lines Matching +full:1 +full:q

41 		"	lgr	1,%[schid]\n"  in do_siga_sync()
50 : "cc", "0", "1", "2", "3"); in do_siga_sync()
61 " lgr 1,%[schid]\n" in do_siga_input()
68 : "cc", "0", "1", "2"); in do_siga_input()
91 " lgr 1,%[schid]\n" in do_siga_output()
100 : "cc", "0", "1", "2", "3"); in do_siga_output()
107 * @q: queue to manipulate
116 static int qdio_do_eqbs(struct qdio_q *q, unsigned char *state, in qdio_do_eqbs() argument
119 int tmp_count = count, tmp_start = start, nr = q->nr; in qdio_do_eqbs()
122 qperf_inc(q, eqbs); in qdio_do_eqbs()
124 if (!q->is_input_q) in qdio_do_eqbs()
125 nr += q->irq_ptr->nr_input_qs; in qdio_do_eqbs()
127 ccq = do_eqbs(q->irq_ptr->sch_token, state, nr, &tmp_start, &tmp_count, in qdio_do_eqbs()
137 qperf_inc(q, eqbs_partial); in qdio_do_eqbs()
138 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "EQBS part:%02x", in qdio_do_eqbs()
143 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, "EQBS again:%2d", ccq); in qdio_do_eqbs()
146 DBF_ERROR("%4x ccq:%3d", SCH_NO(q), ccq); in qdio_do_eqbs()
147 DBF_ERROR("%4x EQBS ERROR", SCH_NO(q)); in qdio_do_eqbs()
149 q->handler(q->irq_ptr->cdev, QDIO_ERROR_GET_BUF_STATE, q->nr, in qdio_do_eqbs()
150 q->first_to_check, count, q->irq_ptr->int_parm); in qdio_do_eqbs()
157 * @q: queue to manipulate
166 static int qdio_do_sqbs(struct qdio_q *q, unsigned char state, int start, in qdio_do_sqbs() argument
171 int nr = q->nr; in qdio_do_sqbs()
175 qperf_inc(q, sqbs); in qdio_do_sqbs()
177 if (!q->is_input_q) in qdio_do_sqbs()
178 nr += q->irq_ptr->nr_input_qs; in qdio_do_sqbs()
180 ccq = do_sqbs(q->irq_ptr->sch_token, state, nr, &tmp_start, &tmp_count); in qdio_do_sqbs()
190 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "SQBS again:%2d", ccq); in qdio_do_sqbs()
191 qperf_inc(q, sqbs_partial); in qdio_do_sqbs()
194 DBF_ERROR("%4x ccq:%3d", SCH_NO(q), ccq); in qdio_do_sqbs()
195 DBF_ERROR("%4x SQBS ERROR", SCH_NO(q)); in qdio_do_sqbs()
197 q->handler(q->irq_ptr->cdev, QDIO_ERROR_SET_BUF_STATE, q->nr, in qdio_do_sqbs()
198 q->first_to_check, count, q->irq_ptr->int_parm); in qdio_do_sqbs()
207 static inline int get_buf_states(struct qdio_q *q, unsigned int bufnr, in get_buf_states() argument
212 int i = 1; in get_buf_states()
214 if (is_qebsm(q)) in get_buf_states()
215 return qdio_do_eqbs(q, state, bufnr, count, auto_ack); in get_buf_states()
218 __state = q->slsb.val[bufnr]; in get_buf_states()
232 q->slsb.val[bufnr] == SLSB_P_OUTPUT_PENDING && in get_buf_states()
237 if (q->slsb.val[bufnr] != __state) in get_buf_states()
246 static inline int get_buf_state(struct qdio_q *q, unsigned int bufnr, in get_buf_state() argument
249 return get_buf_states(q, bufnr, state, 1, auto_ack, 0); in get_buf_state()
253 static inline int set_buf_states(struct qdio_q *q, int bufnr, in set_buf_states() argument
258 if (is_qebsm(q)) in set_buf_states()
259 return qdio_do_sqbs(q, state, bufnr, count); in set_buf_states()
265 WRITE_ONCE(q->slsb.val[bufnr], state); in set_buf_states()
275 static inline int set_buf_state(struct qdio_q *q, int bufnr, in set_buf_state() argument
278 return set_buf_states(q, bufnr, state, 1); in set_buf_state()
284 struct qdio_q *q; in qdio_init_buf_states() local
287 for_each_input_queue(irq_ptr, q, i) in qdio_init_buf_states()
288 set_buf_states(q, 0, SLSB_P_INPUT_NOT_INIT, in qdio_init_buf_states()
290 for_each_output_queue(irq_ptr, q, i) in qdio_init_buf_states()
291 set_buf_states(q, 0, SLSB_P_OUTPUT_NOT_INIT, in qdio_init_buf_states()
295 static inline int qdio_siga_sync(struct qdio_q *q, unsigned int output, in qdio_siga_sync() argument
298 unsigned long schid = *((u32 *) &q->irq_ptr->schid); in qdio_siga_sync()
302 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-s:%1d", q->nr); in qdio_siga_sync()
303 qperf_inc(q, siga_sync); in qdio_siga_sync()
305 if (is_qebsm(q)) { in qdio_siga_sync()
306 schid = q->irq_ptr->sch_token; in qdio_siga_sync()
312 DBF_ERROR("%4x SIGA-S:%2d", SCH_NO(q), cc); in qdio_siga_sync()
316 static inline int qdio_siga_sync_q(struct qdio_q *q) in qdio_siga_sync_q() argument
318 if (q->is_input_q) in qdio_siga_sync_q()
319 return qdio_siga_sync(q, 0, q->mask); in qdio_siga_sync_q()
321 return qdio_siga_sync(q, q->mask, 0); in qdio_siga_sync_q()
324 static int qdio_siga_output(struct qdio_q *q, unsigned int count, in qdio_siga_output() argument
327 unsigned long schid = *((u32 *) &q->irq_ptr->schid); in qdio_siga_output()
332 if (queue_type(q) == QDIO_IQDIO_QFMT && !multicast_outbound(q)) { in qdio_siga_output()
333 if (count > 1) in qdio_siga_output()
339 if (is_qebsm(q)) { in qdio_siga_output()
340 schid = q->irq_ptr->sch_token; in qdio_siga_output()
344 cc = do_siga_output(schid, q->mask, busy_bit, fc, aob); in qdio_siga_output()
358 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, in qdio_siga_output()
359 "%4x cc2 BB1:%1d", SCH_NO(q), q->nr); in qdio_siga_output()
360 DBF_DEV_EVENT(DBF_WARN, q->irq_ptr, "count:%u", retries); in qdio_siga_output()
365 static inline int qdio_siga_input(struct qdio_q *q) in qdio_siga_input() argument
367 unsigned long schid = *((u32 *) &q->irq_ptr->schid); in qdio_siga_input()
371 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-r:%1d", q->nr); in qdio_siga_input()
372 qperf_inc(q, siga_read); in qdio_siga_input()
374 if (is_qebsm(q)) { in qdio_siga_input()
375 schid = q->irq_ptr->sch_token; in qdio_siga_input()
379 cc = do_siga_input(schid, q->mask, fc); in qdio_siga_input()
381 DBF_ERROR("%4x SIGA-R:%2d", SCH_NO(q), cc); in qdio_siga_input()
385 #define qdio_siga_sync_out(q) qdio_siga_sync(q, ~0U, 0) argument
386 #define qdio_siga_sync_all(q) qdio_siga_sync(q, ~0U, ~0U) argument
388 static inline void qdio_sync_queues(struct qdio_q *q) in qdio_sync_queues() argument
391 if (pci_out_supported(q->irq_ptr)) in qdio_sync_queues()
392 qdio_siga_sync_all(q); in qdio_sync_queues()
394 qdio_siga_sync_q(q); in qdio_sync_queues()
397 int debug_get_buf_state(struct qdio_q *q, unsigned int bufnr, in debug_get_buf_state() argument
400 if (need_siga_sync(q)) in debug_get_buf_state()
401 qdio_siga_sync_q(q); in debug_get_buf_state()
402 return get_buf_state(q, bufnr, state, 0); in debug_get_buf_state()
405 static inline void qdio_stop_polling(struct qdio_q *q) in qdio_stop_polling() argument
407 if (!q->u.in.batch_count) in qdio_stop_polling()
410 qperf_inc(q, stop_polling); in qdio_stop_polling()
413 set_buf_states(q, q->u.in.batch_start, SLSB_P_INPUT_NOT_INIT, in qdio_stop_polling()
414 q->u.in.batch_count); in qdio_stop_polling()
415 q->u.in.batch_count = 0; in qdio_stop_polling()
418 static inline void account_sbals(struct qdio_q *q, unsigned int count) in account_sbals() argument
420 q->q_stats.nr_sbal_total += count; in account_sbals()
421 q->q_stats.nr_sbals[ilog2(count)]++; in account_sbals()
424 static void process_buffer_error(struct qdio_q *q, unsigned int start, in process_buffer_error() argument
427 q->qdio_error = QDIO_ERROR_SLSB_STATE; in process_buffer_error()
430 if (queue_type(q) == QDIO_IQDIO_QFMT && !q->is_input_q && in process_buffer_error()
431 q->sbal[start]->element[15].sflags == 0x10) { in process_buffer_error()
432 qperf_inc(q, target_full); in process_buffer_error()
433 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "OUTFULL FTC:%02x", start); in process_buffer_error()
437 DBF_ERROR("%4x BUF ERROR", SCH_NO(q)); in process_buffer_error()
438 DBF_ERROR((q->is_input_q) ? "IN:%2d" : "OUT:%2d", q->nr); in process_buffer_error()
441 q->sbal[start]->element[14].sflags, in process_buffer_error()
442 q->sbal[start]->element[15].sflags); in process_buffer_error()
445 static inline void inbound_handle_work(struct qdio_q *q, unsigned int start, in inbound_handle_work() argument
450 set_buf_state(q, add_buf(start, count - 1), SLSB_P_INPUT_ACK); in inbound_handle_work()
452 if (!q->u.in.batch_count) in inbound_handle_work()
453 q->u.in.batch_start = start; in inbound_handle_work()
454 q->u.in.batch_count += count; in inbound_handle_work()
457 static int get_inbound_buffer_frontier(struct qdio_q *q, unsigned int start) in get_inbound_buffer_frontier() argument
462 q->timestamp = get_tod_clock_fast(); in get_inbound_buffer_frontier()
464 count = atomic_read(&q->nr_buf_used); in get_inbound_buffer_frontier()
472 count = get_buf_states(q, start, &state, count, 1, 0); in get_inbound_buffer_frontier()
478 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in prim:%1d %02x", q->nr, in get_inbound_buffer_frontier()
481 inbound_handle_work(q, start, count, is_qebsm(q)); in get_inbound_buffer_frontier()
482 if (atomic_sub_return(count, &q->nr_buf_used) == 0) in get_inbound_buffer_frontier()
483 qperf_inc(q, inbound_queue_full); in get_inbound_buffer_frontier()
484 if (q->irq_ptr->perf_stat_enabled) in get_inbound_buffer_frontier()
485 account_sbals(q, count); in get_inbound_buffer_frontier()
488 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in err:%1d %02x", q->nr, in get_inbound_buffer_frontier()
491 process_buffer_error(q, start, count); in get_inbound_buffer_frontier()
492 inbound_handle_work(q, start, count, false); in get_inbound_buffer_frontier()
493 if (atomic_sub_return(count, &q->nr_buf_used) == 0) in get_inbound_buffer_frontier()
494 qperf_inc(q, inbound_queue_full); in get_inbound_buffer_frontier()
495 if (q->irq_ptr->perf_stat_enabled) in get_inbound_buffer_frontier()
496 account_sbals_error(q, count); in get_inbound_buffer_frontier()
499 if (q->irq_ptr->perf_stat_enabled) in get_inbound_buffer_frontier()
500 q->q_stats.nr_sbal_nop++; in get_inbound_buffer_frontier()
501 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "in nop:%1d %#02x", in get_inbound_buffer_frontier()
502 q->nr, start); in get_inbound_buffer_frontier()
508 dev_WARN_ONCE(&q->irq_ptr->cdev->dev, 1, in get_inbound_buffer_frontier()
510 state, start, q->nr); in get_inbound_buffer_frontier()
515 static int qdio_inbound_q_moved(struct qdio_q *q, unsigned int start) in qdio_inbound_q_moved() argument
517 return get_inbound_buffer_frontier(q, start); in qdio_inbound_q_moved()
520 static inline int qdio_inbound_q_done(struct qdio_q *q, unsigned int start) in qdio_inbound_q_done() argument
524 if (!atomic_read(&q->nr_buf_used)) in qdio_inbound_q_done()
525 return 1; in qdio_inbound_q_done()
527 if (need_siga_sync(q)) in qdio_inbound_q_done()
528 qdio_siga_sync_q(q); in qdio_inbound_q_done()
529 get_buf_state(q, start, &state, 0); in qdio_inbound_q_done()
535 return 1; in qdio_inbound_q_done()
538 static inline unsigned long qdio_aob_for_buffer(struct qdio_output_q *q, in qdio_aob_for_buffer() argument
543 if (!q->aobs[bufnr]) { in qdio_aob_for_buffer()
545 q->aobs[bufnr] = aob; in qdio_aob_for_buffer()
547 if (q->aobs[bufnr]) { in qdio_aob_for_buffer()
548 q->aobs[bufnr]->user1 = (u64) q->sbal_state[bufnr].user; in qdio_aob_for_buffer()
549 phys_aob = virt_to_phys(q->aobs[bufnr]); in qdio_aob_for_buffer()
553 q->sbal_state[bufnr].flags = 0; in qdio_aob_for_buffer()
557 static void qdio_kick_handler(struct qdio_q *q, unsigned int start, in qdio_kick_handler() argument
560 if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE)) in qdio_kick_handler()
563 if (q->is_input_q) { in qdio_kick_handler()
564 qperf_inc(q, inbound_handler); in qdio_kick_handler()
565 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "kih s:%02x c:%02x", start, count); in qdio_kick_handler()
567 qperf_inc(q, outbound_handler); in qdio_kick_handler()
568 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "koh: s:%02x c:%02x", in qdio_kick_handler()
572 q->handler(q->irq_ptr->cdev, q->qdio_error, q->nr, start, count, in qdio_kick_handler()
573 q->irq_ptr->int_parm); in qdio_kick_handler()
576 q->qdio_error = 0; in qdio_kick_handler()
579 static inline int qdio_tasklet_schedule(struct qdio_q *q) in qdio_tasklet_schedule() argument
581 if (likely(q->irq_ptr->state == QDIO_IRQ_STATE_ACTIVE)) { in qdio_tasklet_schedule()
582 tasklet_schedule(&q->tasklet); in qdio_tasklet_schedule()
588 static void __qdio_inbound_processing(struct qdio_q *q) in __qdio_inbound_processing() argument
590 unsigned int start = q->first_to_check; in __qdio_inbound_processing()
593 qperf_inc(q, tasklet_inbound); in __qdio_inbound_processing()
595 count = qdio_inbound_q_moved(q, start); in __qdio_inbound_processing()
599 qdio_kick_handler(q, start, count); in __qdio_inbound_processing()
601 q->first_to_check = start; in __qdio_inbound_processing()
603 if (!qdio_inbound_q_done(q, start)) { in __qdio_inbound_processing()
605 qperf_inc(q, tasklet_inbound_resched); in __qdio_inbound_processing()
606 if (!qdio_tasklet_schedule(q)) in __qdio_inbound_processing()
610 qdio_stop_polling(q); in __qdio_inbound_processing()
615 if (!qdio_inbound_q_done(q, start)) { in __qdio_inbound_processing()
616 qperf_inc(q, tasklet_inbound_resched2); in __qdio_inbound_processing()
617 qdio_tasklet_schedule(q); in __qdio_inbound_processing()
623 struct qdio_q *q = (struct qdio_q *)data; in qdio_inbound_processing() local
624 __qdio_inbound_processing(q); in qdio_inbound_processing()
627 static void qdio_check_pending(struct qdio_q *q, unsigned int index) in qdio_check_pending() argument
631 if (get_buf_state(q, index, &state, 0) > 0 && in qdio_check_pending()
633 q->u.out.aobs[index]) { in qdio_check_pending()
634 q->u.out.sbal_state[index].flags |= in qdio_check_pending()
636 q->u.out.aobs[index] = NULL; in qdio_check_pending()
640 static int get_outbound_buffer_frontier(struct qdio_q *q, unsigned int start) in get_outbound_buffer_frontier() argument
645 q->timestamp = get_tod_clock_fast(); in get_outbound_buffer_frontier()
647 if (need_siga_sync(q)) in get_outbound_buffer_frontier()
648 if (((queue_type(q) != QDIO_IQDIO_QFMT) && in get_outbound_buffer_frontier()
649 !pci_out_supported(q->irq_ptr)) || in get_outbound_buffer_frontier()
650 (queue_type(q) == QDIO_IQDIO_QFMT && in get_outbound_buffer_frontier()
651 multicast_outbound(q))) in get_outbound_buffer_frontier()
652 qdio_siga_sync_q(q); in get_outbound_buffer_frontier()
654 count = atomic_read(&q->nr_buf_used); in get_outbound_buffer_frontier()
658 count = get_buf_states(q, start, &state, count, 0, q->u.out.use_cq); in get_outbound_buffer_frontier()
666 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, in get_outbound_buffer_frontier()
667 "out empty:%1d %02x", q->nr, count); in get_outbound_buffer_frontier()
669 atomic_sub(count, &q->nr_buf_used); in get_outbound_buffer_frontier()
670 if (q->irq_ptr->perf_stat_enabled) in get_outbound_buffer_frontier()
671 account_sbals(q, count); in get_outbound_buffer_frontier()
674 process_buffer_error(q, start, count); in get_outbound_buffer_frontier()
675 atomic_sub(count, &q->nr_buf_used); in get_outbound_buffer_frontier()
676 if (q->irq_ptr->perf_stat_enabled) in get_outbound_buffer_frontier()
677 account_sbals_error(q, count); in get_outbound_buffer_frontier()
681 if (q->irq_ptr->perf_stat_enabled) in get_outbound_buffer_frontier()
682 q->q_stats.nr_sbal_nop++; in get_outbound_buffer_frontier()
683 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "out primed:%1d", in get_outbound_buffer_frontier()
684 q->nr); in get_outbound_buffer_frontier()
691 dev_WARN_ONCE(&q->irq_ptr->cdev->dev, 1, in get_outbound_buffer_frontier()
693 state, start, q->nr); in get_outbound_buffer_frontier()
699 static inline int qdio_outbound_q_done(struct qdio_q *q) in qdio_outbound_q_done() argument
701 return atomic_read(&q->nr_buf_used) == 0; in qdio_outbound_q_done()
704 static inline int qdio_outbound_q_moved(struct qdio_q *q, unsigned int start) in qdio_outbound_q_moved() argument
708 count = get_outbound_buffer_frontier(q, start); in qdio_outbound_q_moved()
711 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "out moved:%1d", q->nr); in qdio_outbound_q_moved()
713 if (q->u.out.use_cq) { in qdio_outbound_q_moved()
717 qdio_check_pending(q, QDIO_BUFNR(start + i)); in qdio_outbound_q_moved()
724 static int qdio_kick_outbound_q(struct qdio_q *q, unsigned int count, in qdio_kick_outbound_q() argument
730 if (!need_siga_out(q)) in qdio_kick_outbound_q()
733 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w:%1d", q->nr); in qdio_kick_outbound_q()
735 qperf_inc(q, siga_write); in qdio_kick_outbound_q()
737 cc = qdio_siga_output(q, count, &busy_bit, aob); in qdio_kick_outbound_q()
747 DBF_ERROR("%4x cc2 BBC:%1d", SCH_NO(q), q->nr); in qdio_kick_outbound_q()
750 DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "siga-w cc2:%1d", q->nr); in qdio_kick_outbound_q()
754 case 1: in qdio_kick_outbound_q()
756 DBF_ERROR("%4x SIGA-W:%1d", SCH_NO(q), cc); in qdio_kick_outbound_q()
761 DBF_ERROR("%4x cc2 BB2:%1d", SCH_NO(q), q->nr); in qdio_kick_outbound_q()
767 static void __qdio_outbound_processing(struct qdio_q *q) in __qdio_outbound_processing() argument
769 unsigned int start = q->first_to_check; in __qdio_outbound_processing()
772 qperf_inc(q, tasklet_outbound); in __qdio_outbound_processing()
773 WARN_ON_ONCE(atomic_read(&q->nr_buf_used) < 0); in __qdio_outbound_processing()
775 count = qdio_outbound_q_moved(q, start); in __qdio_outbound_processing()
777 q->first_to_check = add_buf(start, count); in __qdio_outbound_processing()
778 qdio_kick_handler(q, start, count); in __qdio_outbound_processing()
781 if (queue_type(q) == QDIO_ZFCP_QFMT && !pci_out_supported(q->irq_ptr) && in __qdio_outbound_processing()
782 !qdio_outbound_q_done(q)) in __qdio_outbound_processing()
785 if (q->u.out.pci_out_enabled) in __qdio_outbound_processing()
793 if (qdio_outbound_q_done(q)) in __qdio_outbound_processing()
794 del_timer_sync(&q->u.out.timer); in __qdio_outbound_processing()
796 if (!timer_pending(&q->u.out.timer) && in __qdio_outbound_processing()
797 likely(q->irq_ptr->state == QDIO_IRQ_STATE_ACTIVE)) in __qdio_outbound_processing()
798 mod_timer(&q->u.out.timer, jiffies + 10 * HZ); in __qdio_outbound_processing()
802 qdio_tasklet_schedule(q); in __qdio_outbound_processing()
808 struct qdio_q *q = (struct qdio_q *)data; in qdio_outbound_processing() local
809 __qdio_outbound_processing(q); in qdio_outbound_processing()
814 struct qdio_q *q = from_timer(q, t, u.out.timer); in qdio_outbound_timer() local
816 qdio_tasklet_schedule(q); in qdio_outbound_timer()
834 struct qdio_q *q = (struct qdio_q *)data; in tiqdio_inbound_processing() local
836 if (need_siga_sync(q) && need_siga_sync_after_ai(q)) in tiqdio_inbound_processing()
837 qdio_sync_queues(q); in tiqdio_inbound_processing()
840 qdio_check_outbound_pci_queues(q->irq_ptr); in tiqdio_inbound_processing()
842 __qdio_inbound_processing(q); in tiqdio_inbound_processing()
848 DBF_DEV_EVENT(DBF_INFO, irq_ptr, "newstate: %1d", state); in qdio_set_state()
867 struct qdio_q *q; in qdio_int_handler_pci() local
878 for_each_input_queue(irq_ptr, q, i) in qdio_int_handler_pci()
879 tasklet_schedule(&q->tasklet); in qdio_int_handler_pci()
885 for_each_output_queue(irq_ptr, q, i) { in qdio_int_handler_pci()
886 if (qdio_outbound_q_done(q)) in qdio_int_handler_pci()
888 if (need_siga_sync(q) && need_siga_sync_out_after_pci(q)) in qdio_int_handler_pci()
889 qdio_siga_sync_q(q); in qdio_int_handler_pci()
890 qdio_tasklet_schedule(q); in qdio_int_handler_pci()
898 struct qdio_q *q; in qdio_handle_activate_check() local
905 q = irq_ptr->input_qs[0]; in qdio_handle_activate_check()
907 q = irq_ptr->output_qs[0]; in qdio_handle_activate_check()
913 q->handler(q->irq_ptr->cdev, QDIO_ERROR_ACTIVATE, in qdio_handle_activate_check()
914 q->nr, q->first_to_check, 0, irq_ptr->int_parm); in qdio_handle_activate_check()
991 WARN_ON_ONCE(1); in qdio_int_handler()
1020 struct qdio_q *q; in qdio_shutdown_queues() local
1023 for_each_input_queue(irq_ptr, q, i) in qdio_shutdown_queues()
1024 tasklet_kill(&q->tasklet); in qdio_shutdown_queues()
1026 for_each_output_queue(irq_ptr, q, i) { in qdio_shutdown_queues()
1027 del_timer_sync(&q->u.out.timer); in qdio_shutdown_queues()
1028 tasklet_kill(&q->tasklet); in qdio_shutdown_queues()
1169 DBF_DEV_EVENT(DBF_ERR, irq_ptr, "alloc niq:%1u noq:%1u", no_input_qs, in qdio_allocate()
1209 struct qdio_q *q = irq_ptr->input_qs[0]; in qdio_detect_hsicq() local
1212 if (irq_ptr->nr_input_qs > 1 && queue_type(q) == QDIO_IQDIO_QFMT) in qdio_detect_hsicq()
1213 use_cq = 1; in qdio_detect_hsicq()
1215 for_each_output_queue(irq_ptr, q, i) { in qdio_detect_hsicq()
1217 if (multicast_outbound(q)) in qdio_detect_hsicq()
1219 if (qdio_enable_async_operation(&q->u.out) < 0) { in qdio_detect_hsicq()
1224 qdio_disable_async_operation(&q->u.out); in qdio_detect_hsicq()
1232 DBF_DEV_EVENT(DBF_ERR, irq, "qfmt:%1u", data->q_format); in qdio_trace_init_data()
1237 DBF_DEV_EVENT(DBF_ERR, irq, "niq:%1u noq:%1u", data->no_input_qs, in qdio_trace_init_data()
1286 /* establish q */ in qdio_establish()
1403 * @q: queue containing the buffers
1408 static int handle_inbound(struct qdio_q *q, unsigned int callflags, in handle_inbound() argument
1413 qperf_inc(q, inbound_call); in handle_inbound()
1416 overlap = min_t(int, count - sub_buf(q->u.in.batch_start, bufnr), in handle_inbound()
1417 q->u.in.batch_count); in handle_inbound()
1419 q->u.in.batch_start = add_buf(q->u.in.batch_start, overlap); in handle_inbound()
1420 q->u.in.batch_count -= overlap; in handle_inbound()
1423 count = set_buf_states(q, bufnr, SLSB_CU_INPUT_EMPTY, count); in handle_inbound()
1424 atomic_add(count, &q->nr_buf_used); in handle_inbound()
1426 if (need_siga_in(q)) in handle_inbound()
1427 return qdio_siga_input(q); in handle_inbound()
1434 * @q: queue containing the buffers
1439 static int handle_outbound(struct qdio_q *q, unsigned int callflags, in handle_outbound() argument
1442 const unsigned int scan_threshold = q->irq_ptr->scan_threshold; in handle_outbound()
1446 qperf_inc(q, outbound_call); in handle_outbound()
1448 count = set_buf_states(q, bufnr, SLSB_CU_OUTPUT_PRIMED, count); in handle_outbound()
1449 used = atomic_add_return(count, &q->nr_buf_used); in handle_outbound()
1452 qperf_inc(q, outbound_queue_full); in handle_outbound()
1455 q->u.out.pci_out_enabled = 1; in handle_outbound()
1456 qperf_inc(q, pci_request_int); in handle_outbound()
1458 q->u.out.pci_out_enabled = 0; in handle_outbound()
1460 if (queue_type(q) == QDIO_IQDIO_QFMT) { in handle_outbound()
1463 if (q->u.out.use_cq && count == 1) in handle_outbound()
1464 phys_aob = qdio_aob_for_buffer(&q->u.out, bufnr); in handle_outbound()
1466 rc = qdio_kick_outbound_q(q, count, phys_aob); in handle_outbound()
1467 } else if (need_siga_sync(q)) { in handle_outbound()
1468 rc = qdio_siga_sync_q(q); in handle_outbound()
1470 get_buf_state(q, prev_buf(bufnr), &state, 0) > 0 && in handle_outbound()
1473 qperf_inc(q, fast_requeue); in handle_outbound()
1475 rc = qdio_kick_outbound_q(q, count, 0); in handle_outbound()
1484 qdio_tasklet_schedule(q); in handle_outbound()
1487 if (!timer_pending(&q->u.out.timer) && in handle_outbound()
1488 likely(q->irq_ptr->state == QDIO_IRQ_STATE_ACTIVE)) in handle_outbound()
1489 mod_timer(&q->u.out.timer, jiffies + HZ); in handle_outbound()
1535 * 1 - irqs not started since new data is available
1539 struct qdio_q *q; in qdio_start_irq() local
1546 for_each_input_queue(irq_ptr, q, i) in qdio_start_irq()
1547 qdio_stop_polling(q); in qdio_start_irq()
1558 for_each_input_queue(irq_ptr, q, i) { in qdio_start_irq()
1559 if (!qdio_inbound_q_done(q, q->first_to_check)) in qdio_start_irq()
1569 return 1; in qdio_start_irq()
1574 static int __qdio_inspect_queue(struct qdio_q *q, unsigned int *bufnr, in __qdio_inspect_queue() argument
1577 unsigned int start = q->first_to_check; in __qdio_inspect_queue()
1580 count = q->is_input_q ? qdio_inbound_q_moved(q, start) : in __qdio_inspect_queue()
1581 qdio_outbound_q_moved(q, start); in __qdio_inspect_queue()
1586 *error = q->qdio_error; in __qdio_inspect_queue()
1589 q->first_to_check = add_buf(start, count); in __qdio_inspect_queue()
1590 q->qdio_error = 0; in __qdio_inspect_queue()
1599 struct qdio_q *q; in qdio_inspect_queue() local
1603 q = is_input ? irq_ptr->input_qs[nr] : irq_ptr->output_qs[nr]; in qdio_inspect_queue()
1605 if (need_siga_sync(q)) in qdio_inspect_queue()
1606 qdio_siga_sync_q(q); in qdio_inspect_queue()
1608 return __qdio_inspect_queue(q, bufnr, error); in qdio_inspect_queue()
1627 struct qdio_q *q; in qdio_get_next_buffers() local
1632 q = irq_ptr->input_qs[nr]; in qdio_get_next_buffers()
1638 if (need_siga_sync(q)) in qdio_get_next_buffers()
1639 qdio_sync_queues(q); in qdio_get_next_buffers()
1644 if (unlikely(q->irq_ptr->state != QDIO_IRQ_STATE_ACTIVE)) in qdio_get_next_buffers()
1647 return __qdio_inspect_queue(q, bufnr, error); in qdio_get_next_buffers()
1657 * 1 - interrupts successfully disabled
1669 return 1; in qdio_stop_irq()