Lines Matching +full:rx +full:- +full:eq
1 /*-
61 hw_eq_t *eqs[hw->config.n_rq]; in ocs_hw_init_queues()
62 hw_cq_t *cqs[hw->config.n_rq]; in ocs_hw_init_queues()
63 hw_rq_t *rqs[hw->config.n_rq]; in ocs_hw_init_queues()
68 hw_eq_t *eq = NULL; in ocs_hw_init_queues() local
76 default_lengths[QTOP_CQ] = hw->num_qentries[SLI_QTYPE_CQ]; in ocs_hw_init_queues()
77 default_lengths[QTOP_WQ] = hw->num_qentries[SLI_QTYPE_WQ]; in ocs_hw_init_queues()
78 default_lengths[QTOP_RQ] = hw->num_qentries[SLI_QTYPE_RQ]; in ocs_hw_init_queues()
83 hw->eq_count = 0; in ocs_hw_init_queues()
84 hw->cq_count = 0; in ocs_hw_init_queues()
85 hw->mq_count = 0; in ocs_hw_init_queues()
86 hw->wq_count = 0; in ocs_hw_init_queues()
87 hw->rq_count = 0; in ocs_hw_init_queues()
88 hw->hw_rq_count = 0; in ocs_hw_init_queues()
89 ocs_list_init(&hw->eq_list, hw_eq_t, link); in ocs_hw_init_queues()
92 if ((hw->config.n_rq > 1 ) && !hw->sli.config.features.flag.mrqp) { in ocs_hw_init_queues()
93 ocs_log_err(hw->os, "MRQ topology not supported by SLI4.\n"); in ocs_hw_init_queues()
97 if (hw->config.n_rq > 1) in ocs_hw_init_queues()
101 for (i = 0; i < ARRAY_SIZE(hw->wq_class_array); i++) { in ocs_hw_init_queues()
102 hw->wq_class_array[i] = ocs_varray_alloc(hw->os, OCS_HW_MAX_NUM_WQ); in ocs_hw_init_queues()
103 if (hw->wq_class_array[i] == NULL) { in ocs_hw_init_queues()
104 ocs_log_err(hw->os, "ocs_varray_alloc for wq_class failed\n"); in ocs_hw_init_queues()
110 for (i = 0; i < ARRAY_SIZE(hw->wq_cpu_array); i++) { in ocs_hw_init_queues()
111 hw->wq_cpu_array[i] = ocs_varray_alloc(hw->os, OCS_HW_MAX_NUM_WQ); in ocs_hw_init_queues()
112 if (hw->wq_cpu_array[i] == NULL) { in ocs_hw_init_queues()
113 ocs_log_err(hw->os, "ocs_varray_alloc for wq_class failed\n"); in ocs_hw_init_queues()
120 for (i = 0, qt = qtop->entries; i < qtop->inuse_count; i++, qt++) { in ocs_hw_init_queues()
121 if (i == qtop->inuse_count - 1) in ocs_hw_init_queues()
126 switch(qt->entry) { in ocs_hw_init_queues()
128 len = (qt->len) ? qt->len : default_lengths[QTOP_EQ]; in ocs_hw_init_queues()
130 if (qt->set_default) { in ocs_hw_init_queues()
135 eq = hw_new_eq(hw, len); in ocs_hw_init_queues()
136 if (eq == NULL) { in ocs_hw_init_queues()
143 len = (qt->len) ? qt->len : default_lengths[QTOP_CQ]; in ocs_hw_init_queues()
145 if (qt->set_default) { in ocs_hw_init_queues()
150 if (!eq || !next_qt) { in ocs_hw_init_queues()
155 if (!use_mrq || next_qt->entry != QTOP_RQ) { in ocs_hw_init_queues()
156 cq = hw_new_cq(eq, len); in ocs_hw_init_queues()
164 len = (qt->len) ? qt->len : default_lengths[QTOP_WQ]; in ocs_hw_init_queues()
165 if (qt->set_default) { in ocs_hw_init_queues()
170 if ((hw->ulp_start + qt->ulp) > hw->ulp_max) { in ocs_hw_init_queues()
171 ocs_log_err(hw->os, "invalid ULP %d for WQ\n", qt->ulp); in ocs_hw_init_queues()
179 wq = hw_new_wq(cq, len, qt->class, hw->ulp_start + qt->ulp); in ocs_hw_init_queues()
184 /* Place this WQ on the EQ WQ array */ in ocs_hw_init_queues()
185 if (ocs_varray_add(eq->wq_array, wq)) { in ocs_hw_init_queues()
186 ocs_log_err(hw->os, "QTOP_WQ: EQ ocs_varray_add failed\n"); in ocs_hw_init_queues()
192 if (qt->class < ARRAY_SIZE(hw->wq_class_array)) { in ocs_hw_init_queues()
193 if (ocs_varray_add(hw->wq_class_array[qt->class], wq)) { in ocs_hw_init_queues()
194 ocs_log_err(hw->os, "HW wq_class_array ocs_varray_add failed\n"); in ocs_hw_init_queues()
199 ocs_log_err(hw->os, "Invalid class value: %d\n", qt->class); in ocs_hw_init_queues()
206 * by the EQ instance modulo number of CPUs in ocs_hw_init_queues()
208 if (ocs_varray_add(hw->wq_cpu_array[eq->instance % ocs_get_num_cpus()], wq)) { in ocs_hw_init_queues()
209 ocs_log_err(hw->os, "HW wq_cpu_array ocs_varray_add failed\n"); in ocs_hw_init_queues()
217 len = (qt->len) ? qt->len : default_lengths[QTOP_RQ]; in ocs_hw_init_queues()
218 if (qt->set_default) { in ocs_hw_init_queues()
223 if ((hw->ulp_start + qt->ulp) > hw->ulp_max) { in ocs_hw_init_queues()
224 ocs_log_err(hw->os, "invalid ULP %d for RQ\n", qt->ulp); in ocs_hw_init_queues()
231 mrq.rq_cfg[mrq.num_pairs].ulp = hw->ulp_start + qt->ulp; in ocs_hw_init_queues()
232 mrq.rq_cfg[mrq.num_pairs].filter_mask = qt->filter_mask; in ocs_hw_init_queues()
233 mrq.rq_cfg[mrq.num_pairs].eq = eq; in ocs_hw_init_queues()
236 rq = hw_new_rq(cq, len, hw->ulp_start + qt->ulp); in ocs_hw_init_queues()
241 rq->filter_mask = qt->filter_mask; in ocs_hw_init_queues()
247 len = (qt->len) ? qt->len : default_lengths[QTOP_MQ]; in ocs_hw_init_queues()
248 if (qt->set_default) { in ocs_hw_init_queues()
275 ocs_log_crit(hw->os, "Cant create morethan one RQ Set\n"); in ocs_hw_init_queues()
283 eqs[rqset_count] = mrq.rq_cfg[i].eq; in ocs_hw_init_queues()
290 cq = hw_new_cq(mrq.rq_cfg[i].eq, default_lengths[QTOP_CQ]); in ocs_hw_init_queues()
301 rq->filter_mask = mrq.rq_cfg[i].filter_mask; in ocs_hw_init_queues()
308 ocs_log_crit(hw->os, in ocs_hw_init_queues()
328 rqs[i]->filter_mask = rqset_filter_mask; in ocs_hw_init_queues()
329 rqs[i]->is_mrq = TRUE; in ocs_hw_init_queues()
330 rqs[i]->base_mrq_id = rqs[0]->hdr->id; in ocs_hw_init_queues()
333 hw->hw_mrq_count = rqset_count; in ocs_hw_init_queues()
345 * @brief Allocate a new EQ object
347 * A new EQ object is instantiated
350 * @param entry_count number of entries in the EQ
352 * @return pointer to allocated EQ object
357 hw_eq_t *eq = ocs_malloc(hw->os, sizeof(*eq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_eq() local
359 if (eq != NULL) { in hw_new_eq()
360 eq->type = SLI_QTYPE_EQ; in hw_new_eq()
361 eq->hw = hw; in hw_new_eq()
362 eq->entry_count = entry_count; in hw_new_eq()
363 eq->instance = hw->eq_count++; in hw_new_eq()
364 eq->queue = &hw->eq[eq->instance]; in hw_new_eq()
365 ocs_list_init(&eq->cq_list, hw_cq_t, link); in hw_new_eq()
367 eq->wq_array = ocs_varray_alloc(hw->os, OCS_HW_MAX_NUM_WQ); in hw_new_eq()
368 if (eq->wq_array == NULL) { in hw_new_eq()
369 ocs_free(hw->os, eq, sizeof(*eq)); in hw_new_eq()
370 eq = NULL; in hw_new_eq()
372 if (sli_queue_alloc(&hw->sli, SLI_QTYPE_EQ, eq->queue, entry_count, NULL, 0)) { in hw_new_eq()
373 ocs_log_err(hw->os, "EQ[%d] allocation failure\n", eq->instance); in hw_new_eq()
374 ocs_free(hw->os, eq, sizeof(*eq)); in hw_new_eq()
375 eq = NULL; in hw_new_eq()
377 sli_eq_modify_delay(&hw->sli, eq->queue, 1, 0, 8); in hw_new_eq()
378 hw->hw_eq[eq->instance] = eq; in hw_new_eq()
379 ocs_list_add_tail(&hw->eq_list, eq); in hw_new_eq()
380 ocs_log_debug(hw->os, "create eq[%2d] id %3d len %4d\n", eq->instance, eq->queue->id, in hw_new_eq()
381 eq->entry_count); in hw_new_eq()
385 return eq; in hw_new_eq()
393 * @param eq pointer to parent EQ object
399 hw_new_cq(hw_eq_t *eq, uint32_t entry_count) in hw_new_cq() argument
401 ocs_hw_t *hw = eq->hw; in hw_new_cq()
402 hw_cq_t *cq = ocs_malloc(hw->os, sizeof(*cq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_cq()
405 cq->eq = eq; in hw_new_cq()
406 cq->type = SLI_QTYPE_CQ; in hw_new_cq()
407 cq->instance = eq->hw->cq_count++; in hw_new_cq()
408 cq->entry_count = entry_count; in hw_new_cq()
409 cq->queue = &hw->cq[cq->instance]; in hw_new_cq()
411 ocs_list_init(&cq->q_list, hw_q_t, link); in hw_new_cq()
413 if (sli_queue_alloc(&hw->sli, SLI_QTYPE_CQ, cq->queue, cq->entry_count, eq->queue, 0)) { in hw_new_cq()
414 ocs_log_err(hw->os, "CQ[%d] allocation failure len=%d\n", in hw_new_cq()
415 eq->instance, in hw_new_cq()
416 eq->entry_count); in hw_new_cq()
417 ocs_free(hw->os, cq, sizeof(*cq)); in hw_new_cq()
420 hw->hw_cq[cq->instance] = cq; in hw_new_cq()
421 ocs_list_add_tail(&eq->cq_list, cq); in hw_new_cq()
422 ocs_log_debug(hw->os, "create cq[%2d] id %3d len %4d\n", cq->instance, cq->queue->id, in hw_new_cq()
423 cq->entry_count); in hw_new_cq()
432 * @param eqs pointer to a set of EQ objects.
437 * @return 0 on success and -1 on failure.
443 ocs_hw_t *hw = eqs[0]->hw; in hw_new_cq_set()
444 sli4_t *sli4 = &hw->sli; in hw_new_cq_set()
454 cq = ocs_malloc(hw->os, sizeof(*cq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_cq_set()
459 cq->eq = eqs[i]; in hw_new_cq_set()
460 cq->type = SLI_QTYPE_CQ; in hw_new_cq_set()
461 cq->instance = hw->cq_count++; in hw_new_cq_set()
462 cq->entry_count = entry_count; in hw_new_cq_set()
463 cq->queue = &hw->cq[cq->instance]; in hw_new_cq_set()
464 qs[i] = cq->queue; in hw_new_cq_set()
465 assocs[i] = eqs[i]->queue; in hw_new_cq_set()
466 ocs_list_init(&cq->q_list, hw_q_t, link); in hw_new_cq_set()
475 hw->hw_cq[cqs[i]->instance] = cqs[i]; in hw_new_cq_set()
476 ocs_list_add_tail(&cqs[i]->eq->cq_list, cqs[i]); in hw_new_cq_set()
484 ocs_free(hw->os, cqs[i], sizeof(*cqs[i])); in hw_new_cq_set()
488 return -1; in hw_new_cq_set()
504 ocs_hw_t *hw = cq->eq->hw; in hw_new_mq()
505 hw_mq_t *mq = ocs_malloc(hw->os, sizeof(*mq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_mq()
508 mq->cq = cq; in hw_new_mq()
509 mq->type = SLI_QTYPE_MQ; in hw_new_mq()
510 mq->instance = cq->eq->hw->mq_count++; in hw_new_mq()
511 mq->entry_count = entry_count; in hw_new_mq()
512 mq->entry_size = OCS_HW_MQ_DEPTH; in hw_new_mq()
513 mq->queue = &hw->mq[mq->instance]; in hw_new_mq()
515 if (sli_queue_alloc(&hw->sli, SLI_QTYPE_MQ, in hw_new_mq()
516 mq->queue, in hw_new_mq()
517 mq->entry_size, in hw_new_mq()
518 cq->queue, 0)) { in hw_new_mq()
519 ocs_log_err(hw->os, "MQ allocation failure\n"); in hw_new_mq()
520 ocs_free(hw->os, mq, sizeof(*mq)); in hw_new_mq()
523 hw->hw_mq[mq->instance] = mq; in hw_new_mq()
524 ocs_list_add_tail(&cq->q_list, mq); in hw_new_mq()
525 ocs_log_debug(hw->os, "create mq[%2d] id %3d len %4d\n", mq->instance, mq->queue->id, in hw_new_mq()
526 mq->entry_count); in hw_new_mq()
547 ocs_hw_t *hw = cq->eq->hw; in hw_new_wq()
548 hw_wq_t *wq = ocs_malloc(hw->os, sizeof(*wq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_wq()
551 wq->hw = cq->eq->hw; in hw_new_wq()
552 wq->cq = cq; in hw_new_wq()
553 wq->type = SLI_QTYPE_WQ; in hw_new_wq()
554 wq->instance = cq->eq->hw->wq_count++; in hw_new_wq()
555 wq->entry_count = entry_count; in hw_new_wq()
556 wq->queue = &hw->wq[wq->instance]; in hw_new_wq()
557 wq->ulp = ulp; in hw_new_wq()
558 wq->wqec_set_count = OCS_HW_WQEC_SET_COUNT; in hw_new_wq()
559 wq->wqec_count = wq->wqec_set_count; in hw_new_wq()
560 wq->free_count = wq->entry_count - 1; in hw_new_wq()
561 wq->class = class; in hw_new_wq()
562 ocs_list_init(&wq->pending_list, ocs_hw_wqe_t, link); in hw_new_wq()
564 if (sli_queue_alloc(&hw->sli, SLI_QTYPE_WQ, wq->queue, wq->entry_count, cq->queue, ulp)) { in hw_new_wq()
565 ocs_log_err(hw->os, "WQ allocation failure\n"); in hw_new_wq()
566 ocs_free(hw->os, wq, sizeof(*wq)); in hw_new_wq()
569 hw->hw_wq[wq->instance] = wq; in hw_new_wq()
570 ocs_list_add_tail(&cq->q_list, wq); in hw_new_wq()
571 …ocs_log_debug(hw->os, "create wq[%2d] id %3d len %4d cls %d ulp %d\n", wq->instance, wq->queue->id, in hw_new_wq()
572 wq->entry_count, wq->class, wq->ulp); in hw_new_wq()
592 ocs_hw_t *hw = cq->eq->hw; in hw_new_rq()
593 hw_rq_t *rq = ocs_malloc(hw->os, sizeof(*rq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_rq()
599 rq->instance = hw->hw_rq_count++; in hw_new_rq()
600 rq->cq = cq; in hw_new_rq()
601 rq->type = SLI_QTYPE_RQ; in hw_new_rq()
602 rq->ulp = ulp; in hw_new_rq()
604 rq->entry_count = OCS_MIN(entry_count, OCS_MIN(max_hw_rq, OCS_HW_RQ_NUM_HDR)); in hw_new_rq()
607 ocs_hw_assert(hw->rq_count < ARRAY_SIZE(hw->rq)); in hw_new_rq()
608 rq->hdr = &hw->rq[hw->rq_count]; in hw_new_rq()
609 rq->hdr_entry_size = OCS_HW_RQ_HEADER_SIZE; in hw_new_rq()
611 if (sli_fc_rq_alloc(&hw->sli, rq->hdr, in hw_new_rq()
612 rq->entry_count, in hw_new_rq()
613 rq->hdr_entry_size, in hw_new_rq()
614 cq->queue, in hw_new_rq()
616 ocs_log_err(hw->os, "RQ allocation failure - header\n"); in hw_new_rq()
617 ocs_free(hw->os, rq, sizeof(*rq)); in hw_new_rq()
620 hw->hw_rq_lookup[hw->rq_count] = rq->instance; /* Update hw_rq_lookup[] */ in hw_new_rq()
621 hw->rq_count++; in hw_new_rq()
622 ocs_log_debug(hw->os, "create rq[%2d] id %3d len %4d hdr size %4d ulp %d\n", in hw_new_rq()
623 rq->instance, rq->hdr->id, rq->entry_count, rq->hdr_entry_size, rq->ulp); in hw_new_rq()
626 ocs_hw_assert(hw->rq_count < ARRAY_SIZE(hw->rq)); in hw_new_rq()
627 rq->data = &hw->rq[hw->rq_count]; in hw_new_rq()
628 rq->data_entry_size = hw->config.rq_default_buffer_size; in hw_new_rq()
630 if (sli_fc_rq_alloc(&hw->sli, rq->data, in hw_new_rq()
631 rq->entry_count, in hw_new_rq()
632 rq->data_entry_size, in hw_new_rq()
633 cq->queue, in hw_new_rq()
635 ocs_log_err(hw->os, "RQ allocation failure - first burst\n"); in hw_new_rq()
636 ocs_free(hw->os, rq, sizeof(*rq)); in hw_new_rq()
639 hw->hw_rq_lookup[hw->rq_count] = rq->instance; /* Update hw_rq_lookup[] */ in hw_new_rq()
640 hw->rq_count++; in hw_new_rq()
641 ocs_log_debug(hw->os, "create rq[%2d] id %3d len %4d data size %4d ulp %d\n", rq->instance, in hw_new_rq()
642 rq->data->id, rq->entry_count, rq->data_entry_size, rq->ulp); in hw_new_rq()
644 hw->hw_rq[rq->instance] = rq; in hw_new_rq()
645 ocs_list_add_tail(&cq->q_list, rq); in hw_new_rq()
647 rq->rq_tracker = ocs_malloc(hw->os, sizeof(ocs_hw_sequence_t*) * in hw_new_rq()
648 rq->entry_count, OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_rq()
649 if (rq->rq_tracker == NULL) { in hw_new_rq()
650 ocs_log_err(hw->os, "RQ tracker buf allocation failure\n"); in hw_new_rq()
669 * @return 0 in success and -1 on failure.
674 ocs_hw_t *hw = cqs[0]->eq->hw; in hw_new_rq_set()
687 rq = ocs_malloc(hw->os, sizeof(*rq), OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_rq_set()
692 rq->instance = hw->hw_rq_count++; in hw_new_rq_set()
693 rq->cq = cqs[i]; in hw_new_rq_set()
694 rq->type = SLI_QTYPE_RQ; in hw_new_rq_set()
695 rq->ulp = ulp; in hw_new_rq_set()
696 rq->entry_count = OCS_MIN(entry_count, OCS_MIN(max_hw_rq, OCS_HW_RQ_NUM_HDR)); in hw_new_rq_set()
699 rq->hdr = &hw->rq[hw->rq_count]; in hw_new_rq_set()
700 rq->hdr_entry_size = OCS_HW_RQ_HEADER_SIZE; in hw_new_rq_set()
701 hw->hw_rq_lookup[hw->rq_count] = rq->instance; in hw_new_rq_set()
702 hw->rq_count++; in hw_new_rq_set()
703 qs[q_count] = rq->hdr; in hw_new_rq_set()
706 rq->data = &hw->rq[hw->rq_count]; in hw_new_rq_set()
707 rq->data_entry_size = hw->config.rq_default_buffer_size; in hw_new_rq_set()
708 hw->hw_rq_lookup[hw->rq_count] = rq->instance; in hw_new_rq_set()
709 hw->rq_count++; in hw_new_rq_set()
710 qs[q_count + 1] = rq->data; in hw_new_rq_set()
712 rq->rq_tracker = NULL; in hw_new_rq_set()
715 if (sli_fc_rq_set_alloc(&hw->sli, num_rq_pairs, qs, in hw_new_rq_set()
716 cqs[0]->queue->id, in hw_new_rq_set()
717 rqs[0]->entry_count, in hw_new_rq_set()
718 rqs[0]->hdr_entry_size, in hw_new_rq_set()
719 rqs[0]->data_entry_size, in hw_new_rq_set()
721 ocs_log_err(hw->os, "RQ Set allocation failure for base CQ=%d\n", cqs[0]->queue->id); in hw_new_rq_set()
726 hw->hw_rq[rqs[i]->instance] = rqs[i]; in hw_new_rq_set()
727 ocs_list_add_tail(&cqs[i]->q_list, rqs[i]); in hw_new_rq_set()
728 rqs[i]->rq_tracker = ocs_malloc(hw->os, sizeof(ocs_hw_sequence_t*) * in hw_new_rq_set()
729 rqs[i]->entry_count, OCS_M_ZERO | OCS_M_NOWAIT); in hw_new_rq_set()
730 if (rqs[i]->rq_tracker == NULL) { in hw_new_rq_set()
731 ocs_log_err(hw->os, "RQ tracker buf allocation failure\n"); in hw_new_rq_set()
741 if (rqs[i]->rq_tracker != NULL) { in hw_new_rq_set()
742 ocs_free(hw->os, rqs[i]->rq_tracker, in hw_new_rq_set()
744 rqs[i]->entry_count); in hw_new_rq_set()
746 ocs_free(hw->os, rqs[i], sizeof(*rqs[i])); in hw_new_rq_set()
750 return -1; in hw_new_rq_set()
754 * @brief Free an EQ object
756 * The EQ object and any child queue objects are freed
758 * @param eq pointer to EQ object
763 hw_del_eq(hw_eq_t *eq) in hw_del_eq() argument
765 if (eq != NULL) { in hw_del_eq()
769 ocs_list_foreach_safe(&eq->cq_list, cq, cq_next) { in hw_del_eq()
772 ocs_varray_free(eq->wq_array); in hw_del_eq()
773 ocs_list_remove(&eq->hw->eq_list, eq); in hw_del_eq()
774 eq->hw->hw_eq[eq->instance] = NULL; in hw_del_eq()
775 ocs_free(eq->hw->os, eq, sizeof(*eq)); in hw_del_eq()
795 ocs_list_foreach_safe(&cq->q_list, q, q_next) { in hw_del_cq()
796 switch(q->type) { in hw_del_cq()
810 ocs_list_remove(&cq->eq->cq_list, cq); in hw_del_cq()
811 cq->eq->hw->hw_cq[cq->instance] = NULL; in hw_del_cq()
812 ocs_free(cq->eq->hw->os, cq, sizeof(*cq)); in hw_del_cq()
829 ocs_list_remove(&mq->cq->q_list, mq); in hw_del_mq()
830 mq->cq->eq->hw->hw_mq[mq->instance] = NULL; in hw_del_mq()
831 ocs_free(mq->cq->eq->hw->os, mq, sizeof(*mq)); in hw_del_mq()
848 ocs_list_remove(&wq->cq->q_list, wq); in hw_del_wq()
849 wq->cq->eq->hw->hw_wq[wq->instance] = NULL; in hw_del_wq()
850 ocs_free(wq->cq->eq->hw->os, wq, sizeof(*wq)); in hw_del_wq()
868 ocs_hw_t *hw = rq->cq->eq->hw; in hw_del_rq()
870 if (rq->rq_tracker != NULL) { in hw_del_rq()
871 ocs_free(hw->os, rq->rq_tracker, sizeof(ocs_hw_sequence_t*) * rq->entry_count); in hw_del_rq()
872 rq->rq_tracker = NULL; in hw_del_rq()
874 ocs_list_remove(&rq->cq->q_list, rq); in hw_del_rq()
875 hw->hw_rq[rq->instance] = NULL; in hw_del_rq()
876 ocs_free(hw->os, rq, sizeof(*rq)); in hw_del_rq()
892 hw_eq_t *eq; in hw_queue_dump() local
899 ocs_list_foreach(&hw->eq_list, eq) { in hw_queue_dump()
900 ocs_printf("eq[%d] id %2d\n", eq->instance, eq->queue->id); in hw_queue_dump()
901 ocs_list_foreach(&eq->cq_list, cq) { in hw_queue_dump()
902 ocs_printf(" cq[%d] id %2d current\n", cq->instance, cq->queue->id); in hw_queue_dump()
903 ocs_list_foreach(&cq->q_list, q) { in hw_queue_dump()
904 switch(q->type) { in hw_queue_dump()
907 ocs_printf(" mq[%d] id %2d\n", mq->instance, mq->queue->id); in hw_queue_dump()
911 ocs_printf(" wq[%d] id %2d\n", wq->instance, wq->queue->id); in hw_queue_dump()
915 ocs_printf(" rq[%d] hdr id %2d\n", rq->instance, rq->hdr->id); in hw_queue_dump()
938 hw_eq_t *eq; in hw_queue_teardown() local
941 if (ocs_list_valid(&hw->eq_list)) { in hw_queue_teardown()
942 ocs_list_foreach_safe(&hw->eq_list, eq, eq_next) { in hw_queue_teardown()
943 hw_del_eq(eq); in hw_queue_teardown()
946 for (i = 0; i < ARRAY_SIZE(hw->wq_cpu_array); i++) { in hw_queue_teardown()
947 ocs_varray_free(hw->wq_cpu_array[i]); in hw_queue_teardown()
948 hw->wq_cpu_array[i] = NULL; in hw_queue_teardown()
950 for (i = 0; i < ARRAY_SIZE(hw->wq_class_array); i++) { in hw_queue_teardown()
951 ocs_varray_free(hw->wq_class_array[i]); in hw_queue_teardown()
952 hw->wq_class_array[i] = NULL; in hw_queue_teardown()
961 * If wq_steering is OCS_HW_WQ_STEERING_CLASS, a WQ from io->wq_class is
964 * If wq_steering is OCS_HW_WQ_STEERING_REQUEST, then a WQ from the EQ that
978 hw_eq_t *eq; in ocs_hw_queue_next_wq() local
981 switch(io->wq_steering) { in ocs_hw_queue_next_wq()
983 if (likely(io->wq_class < ARRAY_SIZE(hw->wq_class_array))) { in ocs_hw_queue_next_wq()
984 wq = ocs_varray_iter_next(hw->wq_class_array[io->wq_class]); in ocs_hw_queue_next_wq()
988 eq = io->eq; in ocs_hw_queue_next_wq()
989 if (likely(eq != NULL)) { in ocs_hw_queue_next_wq()
990 wq = ocs_varray_iter_next(eq->wq_array); in ocs_hw_queue_next_wq()
996 if (likely(cpuidx < ARRAY_SIZE(hw->wq_cpu_array))) { in ocs_hw_queue_next_wq()
997 wq = ocs_varray_iter_next(hw->wq_cpu_array[cpuidx]); in ocs_hw_queue_next_wq()
1004 wq = hw->hw_wq[0]; in ocs_hw_queue_next_wq()
1013 * The EQ count for in the HWs queue topology (hw->qtop) object is returned
1022 return hw->qtop->entry_counts[QTOP_EQ]; in ocs_hw_qtop_eq_count()
1069 * @brief Declare token sub-types
1173 {"eq", TOK_QUEUE, TOK_SUB_EQ},
1214 tok->type = cmatches[i].type; in tokenize()
1215 tok->subtype = cmatches[i].subtype; in tokenize()
1216 tok->string[0] = *s++; in tokenize()
1223 char *p = tok->string; in tokenize()
1225 tok->type = TOK_NUMBER; in tokenize()
1230 if ((p - tok->string) < (int32_t)sizeof(tok->string)) { in tokenize()
1234 tok->type = TOK_NUMBER_LIST; in tokenize()
1241 char *p = tok->string; in tokenize()
1243 tok->type = TOK_NUMBER; in tokenize()
1245 if ((p - tok->string) < (int32_t)sizeof(tok->string)) { in tokenize()
1249 tok->type = TOK_NUMBER_LIST; in tokenize()
1259 char *p = tok->string; in tokenize()
1262 if ((p - tok->string) < TOKEN_LEN) { in tokenize()
1268 if (tok->string[0] == '$') { in tokenize()
1269 tok->type = TOK_NUMBER_VALUE; in tokenize()
1273 if (strcmp(smatches[i].s, tok->string) == 0) { in tokenize()
1274 tok->type = smatches[i].type; in tokenize()
1275 tok->subtype = smatches[i].subtype; in tokenize()
1311 * @brief convert token sub-type to string
1313 * @param subtype token sub-type
1353 ocs_log_test(hw->os, "Syntax error:\n"); in tok_syntax()
1355 for (i = 0, tok = tokarray->tokens; (i <= tokarray->inuse_count); i++, tok++) { in tok_syntax()
1356 ocs_log_test(hw->os, "%s [%2d] %-16s %-16s %s\n", (i == tokarray->iter_idx) ? ">>>" : " ", i, in tok_syntax()
1357 token_type2s(tok->type), token_subtype2s(tok->subtype), tok->string); in tok_syntax()
1378 switch(tok->type) { in tok_getnumber()
1380 if (ocs_strcmp(tok->string, "$ncpu") == 0) { in tok_getnumber()
1382 } else if (ocs_strcmp(tok->string, "$ncpu1") == 0) { in tok_getnumber()
1383 rval = num_cpus - 1; in tok_getnumber()
1384 } else if (ocs_strcmp(tok->string, "$nwq") == 0) { in tok_getnumber()
1386 rval = hw->config.n_wq; in tok_getnumber()
1388 } else if (ocs_strcmp(tok->string, "$maxmrq") == 0) { in tok_getnumber()
1390 } else if (ocs_strcmp(tok->string, "$nulp") == 0) { in tok_getnumber()
1391 rval = hw->ulp_max - hw->ulp_start + 1; in tok_getnumber()
1392 } else if ((qtop->rptcount_idx > 0) && ocs_strcmp(tok->string, "$rpt0") == 0) { in tok_getnumber()
1393 rval = qtop->rptcount[qtop->rptcount_idx-1]; in tok_getnumber()
1394 } else if ((qtop->rptcount_idx > 1) && ocs_strcmp(tok->string, "$rpt1") == 0) { in tok_getnumber()
1395 rval = qtop->rptcount[qtop->rptcount_idx-2]; in tok_getnumber()
1396 } else if ((qtop->rptcount_idx > 2) && ocs_strcmp(tok->string, "$rpt2") == 0) { in tok_getnumber()
1397 rval = qtop->rptcount[qtop->rptcount_idx-3]; in tok_getnumber()
1398 } else if ((qtop->rptcount_idx > 3) && ocs_strcmp(tok->string, "$rpt3") == 0) { in tok_getnumber()
1399 rval = qtop->rptcount[qtop->rptcount_idx-4]; in tok_getnumber()
1401 rval = ocs_strtoul(tok->string, 0, 0); in tok_getnumber()
1405 rval = ocs_strtoul(tok->string, 0, 0); in tok_getnumber()
1427 ocs_hw_qtop_entry_t *qt = qtop->entries + qtop->inuse_count; in parse_topology()
1430 for (; (tokarray->iter_idx < tokarray->inuse_count) && in parse_topology()
1431 ((tok = &tokarray->tokens[tokarray->iter_idx]) != NULL); ) { in parse_topology()
1432 if (qtop->inuse_count >= qtop->alloc_count) { in parse_topology()
1433 return -1; in parse_topology()
1436 qt = qtop->entries + qtop->inuse_count; in parse_topology()
1441 qt->entry = subtype2qtop(tok[0].subtype); in parse_topology()
1442 qt->set_default = FALSE; in parse_topology()
1443 qt->len = 0; in parse_topology()
1444 qt->class = 0; in parse_topology()
1445 qtop->inuse_count++; in parse_topology()
1447 tokarray->iter_idx++; /* Advance current token index */ in parse_topology()
1450 while ((tokarray->iter_idx + 4) <= tokarray->inuse_count) { in parse_topology()
1451 tok = &tokarray->tokens[tokarray->iter_idx]; in parse_topology()
1460 qt->len = tok_getnumber(hw, qtop, &tok[3]); in parse_topology()
1464 qt->class = tok_getnumber(hw, qtop, &tok[3]); in parse_topology()
1468 qt->ulp = tok_getnumber(hw, qtop, &tok[3]); in parse_topology()
1489 qt->filter_mask = mask; in parse_topology()
1491 qt->filter_mask = (1U << tok_getnumber(hw, qtop, &tok[3])); in parse_topology()
1498 tokarray->iter_idx += 4; in parse_topology()
1503 qtop->entry_counts[qt->entry]++; in parse_topology()
1507 if ( ((tokarray->iter_idx + 5) <= tokarray->inuse_count) && in parse_topology()
1512 qt->entry = subtype2qtop(tok[2].subtype); in parse_topology()
1513 qt->set_default = TRUE; in parse_topology()
1516 qt->len = tok_getnumber(hw, qtop, &tok[4]); in parse_topology()
1519 qt->class = tok_getnumber(hw, qtop, &tok[4]); in parse_topology()
1522 qt->ulp = tok_getnumber(hw, qtop, &tok[4]); in parse_topology()
1527 qtop->inuse_count++; in parse_topology()
1528 tokarray->iter_idx += 5; in parse_topology()
1531 return -1; in parse_topology()
1545 tokarray->iter_idx += 2; in parse_topology()
1548 iter_idx_save = tokarray->iter_idx; in parse_topology()
1551 uint32_t rptcount_idx = qtop->rptcount_idx; in parse_topology()
1553 if (qtop->rptcount_idx < ARRAY_SIZE(qtop->rptcount)) { in parse_topology()
1554 qtop->rptcount[qtop->rptcount_idx++] = i; in parse_topology()
1558 tokarray->iter_idx = iter_idx_save; in parse_topology()
1563 qtop->rptcount_idx = rptcount_idx; in parse_topology()
1570 tokarray->iter_idx++; in parse_topology()
1575 return -1; in parse_topology()
1603 ocs_log_debug(hw->os, "queue topology: %s\n", qtop_string); in ocs_hw_qtop_parse()
1606 …tokarray.tokens = ocs_malloc(hw->os, MAX_TOKENS * sizeof(*tokarray.tokens), OCS_M_ZERO | OCS_M_NOW… in ocs_hw_qtop_parse()
1621 qtop = ocs_malloc(hw->os, sizeof(*qtop), OCS_M_ZERO | OCS_M_NOWAIT); in ocs_hw_qtop_parse()
1623 ocs_free(hw->os, tokarray.tokens, MAX_TOKENS * sizeof(*tokarray.tokens)); in ocs_hw_qtop_parse()
1624 ocs_log_err(hw->os, "malloc qtop failed\n"); in ocs_hw_qtop_parse()
1627 qtop->os = hw->os; in ocs_hw_qtop_parse()
1630 …qtop->entries = ocs_malloc(hw->os, OCS_HW_MAX_QTOP_ENTRIES*sizeof(*qtop->entries), OCS_M_ZERO | OC… in ocs_hw_qtop_parse()
1631 if (qtop->entries == NULL) { in ocs_hw_qtop_parse()
1632 ocs_log_err(hw->os, "malloc qtop entries failed\n"); in ocs_hw_qtop_parse()
1633 ocs_free(hw->os, qtop, sizeof(*qtop)); in ocs_hw_qtop_parse()
1634 ocs_free(hw->os, tokarray.tokens, MAX_TOKENS * sizeof(*tokarray.tokens)); in ocs_hw_qtop_parse()
1637 qtop->alloc_count = OCS_HW_MAX_QTOP_ENTRIES; in ocs_hw_qtop_parse()
1638 qtop->inuse_count = 0; in ocs_hw_qtop_parse()
1643 for (i = 0, qt = qtop->entries; i < qtop->inuse_count; i++, qt++) { in ocs_hw_qtop_parse()
1644 …ocs_log_debug(hw->os, "entry %s set_df %d len %4d class %d ulp %d\n", qtopentry2s(qt->entry), qt->… in ocs_hw_qtop_parse()
1645 qt->class, qt->ulp); in ocs_hw_qtop_parse()
1650 ocs_free(hw->os, tokarray.tokens, MAX_TOKENS * sizeof(*tokarray.tokens)); in ocs_hw_qtop_parse()
1666 if (qtop->entries != NULL) { in ocs_hw_qtop_free()
1667 ocs_free(qtop->os, qtop->entries, qtop->alloc_count*sizeof(*qtop->entries)); in ocs_hw_qtop_free()
1669 ocs_free(qtop->os, qtop, sizeof(*qtop)); in ocs_hw_qtop_free()
1707 rq_status = sli_fc_rqe_rqid_and_index(&hw->sli, cqe, &rq_id, &index); in ocs_hw_rqpair_process_rq()
1715 ocs_log_test(hw->os, "status=%#x: rq_id lookup failed for id=%#x\n", in ocs_hw_rqpair_process_rq()
1725 ocs_log_test(hw->os, "status=%#x, failed to return buffers to RQ\n", in ocs_hw_rqpair_process_rq()
1734 ocs_log_debug(hw->os, "Warning: RCQE status=%#x, \n", rq_status); in ocs_hw_rqpair_process_rq()
1738 return -1; in ocs_hw_rqpair_process_rq()
1743 ocs_log_test(hw->os, "Error: rq_id lookup failed for id=%#x\n", rq_id); in ocs_hw_rqpair_process_rq()
1744 return -1; in ocs_hw_rqpair_process_rq()
1747 …OCS_STAT({ hw_rq_t *rq = hw->hw_rq[hw->hw_rq_lookup[rqindex]]; rq->use_count++; rq->hdr_use_count+… in ocs_hw_rqpair_process_rq()
1748 rq->payload_use_count++;}) in ocs_hw_rqpair_process_rq()
1753 seq->hw = hw; in ocs_hw_rqpair_process_rq()
1754 seq->auto_xrdy = 0; in ocs_hw_rqpair_process_rq()
1755 seq->out_of_xris = 0; in ocs_hw_rqpair_process_rq()
1756 seq->xri = 0; in ocs_hw_rqpair_process_rq()
1757 seq->hio = NULL; in ocs_hw_rqpair_process_rq()
1759 sli_fc_rqe_length(&hw->sli, cqe, &h_len, &p_len); in ocs_hw_rqpair_process_rq()
1760 seq->header->dma.len = h_len; in ocs_hw_rqpair_process_rq()
1761 seq->payload->dma.len = p_len; in ocs_hw_rqpair_process_rq()
1762 seq->fcfi = sli_fc_rqe_fcfi(&hw->sli, cqe); in ocs_hw_rqpair_process_rq()
1763 seq->hw_priv = cq->eq; in ocs_hw_rqpair_process_rq()
1766 if (hw->config.bounce) { in ocs_hw_rqpair_process_rq()
1767 fc_header_t *hdr = seq->header->dma.virt; in ocs_hw_rqpair_process_rq()
1768 uint32_t s_id = fc_be24toh(hdr->s_id); in ocs_hw_rqpair_process_rq()
1769 uint32_t d_id = fc_be24toh(hdr->d_id); in ocs_hw_rqpair_process_rq()
1770 uint32_t ox_id = ocs_be16toh(hdr->ox_id); in ocs_hw_rqpair_process_rq()
1771 if (hw->callback.bounce != NULL) { in ocs_hw_rqpair_process_rq()
1772 (*hw->callback.bounce)(ocs_hw_unsol_process_bounce, seq, s_id, d_id, ox_id); in ocs_hw_rqpair_process_rq()
1775 hw->callback.unsolicited(hw->args.unsolicited, seq); in ocs_hw_rqpair_process_rq()
1782 * @brief Process receive queue completions for RQ Pair mode - Auto xfer rdy
1799 /* Seems silly to call a SLI function to decode - use the structure directly for performance */ in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1814 rq_status = sli_fc_rqe_rqid_and_index(&hw->sli, cqe, &rq_id, &index); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1822 ocs_log_err(hw->os, "status=%#x: rq_id lookup failed for id=%#x\n", in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1832 ocs_log_err(hw->os, "status=%#x, failed to return buffers to RQ\n", in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1840 ocs_log_debug(hw->os, "Warning: RCQE status=%#x, \n", rq_status); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1845 return -1; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1850 ocs_log_err(hw->os, "Error: rq_id lookup failed for id=%#x\n", rq_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1851 return -1; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1854 …OCS_STAT({ hw_rq_t *rq = hw->hw_rq[hw->hw_rq_lookup[rqindex]]; rq->use_count++; rq->hdr_use_count+… in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1855 rq->payload_use_count++;}) in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1860 seq->hw = hw; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1861 seq->auto_xrdy = opt_wr->agxr; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1862 seq->out_of_xris = opt_wr->oox; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1863 seq->xri = opt_wr->xri; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1864 seq->hio = NULL; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1866 sli_fc_rqe_length(&hw->sli, cqe, &h_len, &p_len); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1867 seq->header->dma.len = h_len; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1868 seq->payload->dma.len = p_len; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1869 seq->fcfi = sli_fc_rqe_fcfi(&hw->sli, cqe); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1870 seq->hw_priv = cq->eq; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1872 if (seq->auto_xrdy) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1873 fc_header_t *fc_hdr = seq->header->dma.virt; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1875 seq->hio = ocs_hw_io_lookup(hw, seq->xri); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1876 ocs_lock(&seq->hio->axr_lock); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1880 seq->hio->axr_buf->fcfi = seq->fcfi; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1881 seq->hio->axr_buf->hdr.ox_id = fc_hdr->ox_id; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1882 seq->hio->axr_buf->hdr.s_id = fc_hdr->s_id; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1883 seq->hio->axr_buf->hdr.d_id = fc_hdr->d_id; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1884 seq->hio->axr_buf->cmd_cqe = 1; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1891 fc_hdr->f_ctl &= fc_htobe24(~FC_FCTL_SEQUENCE_INITIATIVE); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1894 if (seq->hio->type == OCS_HW_IO_TARGET_RSP) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1895 seq->hio->axr_buf->call_axr_cmd = 1; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1896 seq->hio->axr_buf->cmd_seq = seq; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1902 if (hw->config.bounce) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1903 fc_header_t *hdr = seq->header->dma.virt; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1904 uint32_t s_id = fc_be24toh(hdr->s_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1905 uint32_t d_id = fc_be24toh(hdr->d_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1906 uint32_t ox_id = ocs_be16toh(hdr->ox_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1907 if (hw->callback.bounce != NULL) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1908 (*hw->callback.bounce)(ocs_hw_unsol_process_bounce, seq, s_id, d_id, ox_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1911 hw->callback.unsolicited(hw->args.unsolicited, seq); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1914 if (seq->auto_xrdy) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1916 if(seq->hio->axr_buf->data_cqe == 1) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1924 if (hw->config.bounce) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1925 fc_header_t *hdr = seq->header->dma.virt; in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1926 uint32_t s_id = fc_be24toh(hdr->s_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1927 uint32_t d_id = fc_be24toh(hdr->d_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1928 uint32_t ox_id = ocs_be16toh(hdr->ox_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1929 if (hw->callback.bounce != NULL) { in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1930 … (*hw->callback.bounce)(ocs_hw_unsol_process_bounce, &seq->hio->axr_buf->seq, s_id, d_id, ox_id); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1933 hw->callback.unsolicited(hw->args.unsolicited, &seq->hio->axr_buf->seq); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1940 ocs_unlock(&seq->hio->axr_lock); in ocs_hw_rqpair_process_auto_xfr_rdy_cmd()
1963 /* Seems silly to call a SLI function to decode - use the structure directly for performance */ in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1973 io = ocs_hw_io_lookup(hw, opt_wr->xri); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1974 ocs_lock(&io->axr_lock); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1975 buf = io->axr_buf; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1976 buf->data_cqe = 1; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1977 seq = &buf->seq; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1978 seq->hw = hw; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1979 seq->auto_xrdy = 1; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1980 seq->out_of_xris = 0; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1981 seq->xri = opt_wr->xri; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1982 seq->hio = io; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1983 seq->header = &buf->header; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1984 seq->payload = &buf->payload; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1986 seq->header->dma.len = sizeof(fc_header_t); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1987 seq->payload->dma.len = opt_wr->total_data_placed; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1988 seq->fcfi = buf->fcfi; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1989 seq->hw_priv = cq->eq; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1991 if (opt_wr->status == SLI4_FC_WCQE_STATUS_SUCCESS) { in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1992 seq->status = OCS_HW_UNSOL_SUCCESS; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1993 } else if (opt_wr->status == SLI4_FC_WCQE_STATUS_REMOTE_STOP) { in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1994 seq->status = OCS_HW_UNSOL_ABTS_RCVD; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
1996 seq->status = OCS_HW_UNSOL_ERROR; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2000 if(io->type == OCS_HW_IO_TARGET_RSP) { in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2001 io->axr_buf->call_axr_data = 1; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2005 if(!buf->cmd_cqe) { in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2017 if (hw->config.bounce) { in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2018 fc_header_t *hdr = seq->header->dma.virt; in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2019 uint32_t s_id = fc_be24toh(hdr->s_id); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2020 uint32_t d_id = fc_be24toh(hdr->d_id); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2021 uint32_t ox_id = ocs_be16toh(hdr->ox_id); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2022 if (hw->callback.bounce != NULL) { in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2023 (*hw->callback.bounce)(ocs_hw_unsol_process_bounce, seq, s_id, d_id, ox_id); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2026 hw->callback.unsolicited(hw->args.unsolicited, seq); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2030 ocs_unlock(&io->axr_lock); in ocs_hw_rqpair_process_auto_xfr_rdy_data()
2049 sli4_queue_t *rq_hdr = &hw->rq[rqindex]; in ocs_hw_rqpair_get()
2050 sli4_queue_t *rq_payload = &hw->rq[rqindex+1]; in ocs_hw_rqpair_get()
2052 hw_rq_t *rq = hw->hw_rq[hw->hw_rq_lookup[rqindex]]; in ocs_hw_rqpair_get()
2055 uint64_t rqbuf_debug_value = 0xdead0000 | ((rq->id & 0xf) << 12) | (bufindex & 0xfff); in ocs_hw_rqpair_get()
2058 if (bufindex >= rq_hdr->length) { in ocs_hw_rqpair_get()
2059 ocs_log_err(hw->os, "RQ index %d bufindex %d exceed ring length %d for id %d\n", in ocs_hw_rqpair_get()
2060 rqindex, bufindex, rq_hdr->length, rq_hdr->id); in ocs_hw_rqpair_get()
2069 _sli_queue_poke(&hw->sli, rq_hdr, bufindex, (uint8_t *)&rqbuf_debug_value); in ocs_hw_rqpair_get()
2070 _sli_queue_poke(&hw->sli, rq_payload, bufindex, (uint8_t *)&rqbuf_debug_value); in ocs_hw_rqpair_get()
2073 seq = rq->rq_tracker[bufindex]; in ocs_hw_rqpair_get()
2074 rq->rq_tracker[bufindex] = NULL; in ocs_hw_rqpair_get()
2077 ocs_log_err(hw->os, "RQ buffer NULL, rqindex %d, bufindex %d, current q index = %d\n", in ocs_hw_rqpair_get()
2078 rqindex, bufindex, rq_hdr->index); in ocs_hw_rqpair_get()
2092 * @return Returns 0 on success, or a non-zero value otherwise.
2097 sli4_queue_t *rq_hdr = &hw->rq[seq->header->rqindex]; in ocs_hw_rqpair_put()
2098 sli4_queue_t *rq_payload = &hw->rq[seq->payload->rqindex]; in ocs_hw_rqpair_put()
2099 uint32_t hw_rq_index = hw->hw_rq_lookup[seq->header->rqindex]; in ocs_hw_rqpair_put()
2100 hw_rq_t *rq = hw->hw_rq[hw_rq_index]; in ocs_hw_rqpair_put()
2107 phys_hdr[0] = ocs_addr32_hi(seq->header->dma.phys); in ocs_hw_rqpair_put()
2108 phys_hdr[1] = ocs_addr32_lo(seq->header->dma.phys); in ocs_hw_rqpair_put()
2109 phys_payload[0] = ocs_addr32_hi(seq->payload->dma.phys); in ocs_hw_rqpair_put()
2110 phys_payload[1] = ocs_addr32_lo(seq->payload->dma.phys); in ocs_hw_rqpair_put()
2120 qindex_payload = _sli_queue_write(&hw->sli, rq_payload, (void *)phys_payload); in ocs_hw_rqpair_put()
2121 qindex_hdr = _sli_queue_write(&hw->sli, rq_hdr, (void *)phys_hdr); in ocs_hw_rqpair_put()
2124 ocs_log_err(hw->os, "RQ_ID=%#x write failed\n", rq_hdr->id); in ocs_hw_rqpair_put()
2134 if (rq->rq_tracker[qindex_hdr] == NULL) { in ocs_hw_rqpair_put()
2135 rq->rq_tracker[qindex_hdr] = seq; in ocs_hw_rqpair_put()
2137 ocs_log_test(hw->os, "expected rq_tracker[%d][%d] buffer to be NULL\n", in ocs_hw_rqpair_put()
2164 if (seq->header->rqindex == OCS_HW_RQ_INDEX_DUMMY_HDR) { in ocs_hw_rqpair_sequence_free()
2173 ocs_log_err(hw->os, "error writing buffers\n"); in ocs_hw_rqpair_sequence_free()
2186 * @return Returns the RQ index, or -1 if not found
2191 return ocs_hw_queue_hash_find(hw->rq_hash, rq_id); in ocs_hw_rqpair_find()
2204 * @return Returns 0 on success, or a non-zero value on failure.
2212 …hw->auto_xfer_rdy_buf_pool = ocs_pool_alloc(hw->os, sizeof(ocs_hw_auto_xfer_rdy_buffer_t), num_buf… in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2213 if (hw->auto_xfer_rdy_buf_pool == NULL) { in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2214 ocs_log_err(hw->os, "Failure to allocate auto xfer ready buffer pool\n"); in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2220 buf = ocs_pool_get_instance(hw->auto_xfer_rdy_buf_pool, i); in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2224 …if (ocs_dma_alloc(hw->os, &buf->payload.dma, hw->config.auto_xfer_rdy_size, OCS_MIN_DMA_ALIGNMENT)… in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2225 ocs_log_err(hw->os, "DMA allocation failed\n"); in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2226 ocs_free(hw->os, buf, sizeof(*buf)); in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2231 buf->hdr.info = FC_RCTL_INFO_SOL_DATA; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2232 buf->hdr.r_ctl = FC_RCTL_FC4_DATA; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2233 buf->hdr.type = FC_TYPE_FCP; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2234 buf->hdr.f_ctl = fc_htobe24(FC_FCTL_EXCHANGE_RESPONDER | in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2241 buf->header.rqindex = OCS_HW_RQ_INDEX_DUMMY_HDR; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2242 buf->header.dma.virt = &buf->hdr; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2243 buf->header.dma.alloc = buf; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2244 buf->header.dma.size = sizeof(buf->hdr); in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2245 buf->header.dma.len = sizeof(buf->hdr); in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2247 buf->payload.rqindex = OCS_HW_RQ_INDEX_DUMMY_DATA; in ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc()
2267 ocs_lock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_dnrx_check()
2269 while (!ocs_list_empty(&hw->io_port_dnrx)) { in ocs_hw_rqpair_auto_xfer_rdy_dnrx_check()
2270 io = ocs_list_remove_head(&hw->io_port_dnrx); in ocs_hw_rqpair_auto_xfer_rdy_dnrx_check()
2277 ocs_unlock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_dnrx_check()
2297 ocs_log_debug(hw->os, "Status 0x%x\n", status); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port_cb()
2300 ocs_free(hw->os, mqe, SLI4_BMBX_SIZE); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port_cb()
2321 if (!sli_get_sgl_preregister(&hw->sli)) { in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2323 ocs_dma_t *psgls = &io->def_sgl; in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2326 /* non-local buffer required for mailbox queue */ in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2327 post_sgl = ocs_malloc(hw->os, SLI4_BMBX_SIZE, OCS_M_NOWAIT); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2329 ocs_log_err(hw->os, "no buffer for command\n"); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2332 if (sli_cmd_fcoe_post_sgl_pages(&hw->sli, post_sgl, SLI4_BMBX_SIZE, in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2333 io->indicator, 1, sgls, NULL, NULL)) { in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2336 ocs_free(hw->os, post_sgl, SLI4_BMBX_SIZE); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2337 ocs_log_err(hw->os, "SGL post failed\n"); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2343 ocs_lock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2344 if (ocs_hw_rqpair_auto_xfer_rdy_buffer_post(hw, io, 0) != 0) { /* DNRX set - no buffer */ in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2345 ocs_unlock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2348 ocs_unlock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_move_to_port()
2364 if (io->axr_buf != NULL) { in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2365 ocs_lock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2367 if (ocs_list_on_list(&io->dnrx_link)) { in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2368 ocs_list_remove(&hw->io_port_dnrx, io); in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2369 io->auto_xfer_rdy_dnrx = 0; in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2375 ocs_pool_put(hw->auto_xfer_rdy_buf_pool, io->axr_buf); in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2376 io->axr_buf = NULL; in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2377 ocs_unlock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_move_to_host()
2404 buf = ocs_pool_get(hw->auto_xfer_rdy_buf_pool); in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2405 io->axr_buf = buf; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2408 data = io->def_sgl.virt; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2420 * Auto-Increment RefTag (Word 3 bit 19) in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2424 * Replacement Ref Tag (Word 1) - In not the LBA in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2426 * Opcode RX (Word 3 bits 27:24) in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2432 if (hw->config.auto_xfer_rdy_p_type) { in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2435 diseed->sge_type = SLI4_SGE_TYPE_DISEED; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2436 diseed->repl_app_tag = hw->config.auto_xfer_rdy_app_tag_value; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2437 diseed->app_tag_cmp = hw->config.auto_xfer_rdy_app_tag_value; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2438 diseed->check_app_tag = hw->config.auto_xfer_rdy_app_tag_valid; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2439 diseed->auto_incr_ref_tag = TRUE; /* Always the LBA */ in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2440 diseed->dif_blk_size = hw->config.auto_xfer_rdy_blk_size_chip; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2447 data[2].buffer_address_high = ocs_addr32_hi(io->axr_buf->payload.dma.phys); in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2448 data[2].buffer_address_low = ocs_addr32_lo(io->axr_buf->payload.dma.phys); in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2449 data[2].buffer_length = io->axr_buf->payload.dma.size; in ocs_hw_rqpair_auto_xfer_rdy_buffer_post()
2471 ocs_hw_auto_xfer_rdy_buffer_t *buf = seq->header->dma.alloc; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2473 buf->data_cqe = 0; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2474 buf->cmd_cqe = 0; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2475 buf->fcfi = 0; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2476 buf->call_axr_cmd = 0; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2477 buf->call_axr_data = 0; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2480 buf->hdr.info = FC_RCTL_INFO_SOL_DATA; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2481 buf->hdr.r_ctl = FC_RCTL_FC4_DATA; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2482 buf->hdr.type = FC_TYPE_FCP; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2483 buf->hdr.f_ctl = fc_htobe24(FC_FCTL_EXCHANGE_RESPONDER | in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2490 buf->header.rqindex = OCS_HW_RQ_INDEX_DUMMY_HDR; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2491 buf->header.dma.virt = &buf->hdr; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2492 buf->header.dma.alloc = buf; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2493 buf->header.dma.size = sizeof(buf->hdr); in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2494 buf->header.dma.len = sizeof(buf->hdr); in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2495 buf->payload.rqindex = OCS_HW_RQ_INDEX_DUMMY_DATA; in ocs_hw_rqpair_auto_xfer_rdy_buffer_sequence_reset()
2511 * @return Returns 0 on success, or a non-zero value on failure.
2519 if (hw->auto_xfer_rdy_buf_pool != NULL) { in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2520 ocs_lock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2521 for (i = 0; i < ocs_pool_get_count(hw->auto_xfer_rdy_buf_pool); i++) { in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2522 buf = ocs_pool_get_instance(hw->auto_xfer_rdy_buf_pool, i); in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2524 ocs_dma_free(hw->os, &buf->payload.dma); in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2527 ocs_unlock(&hw->io_lock); in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2529 ocs_pool_free(hw->auto_xfer_rdy_buf_pool); in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2530 hw->auto_xfer_rdy_buf_pool = NULL; in ocs_hw_rqpair_auto_xfer_rdy_buffer_free()
2543 * @return Returns 0 on success, or a non-zero value on failure.
2551 ocs_log_debug(hw->os, "RQ Pair mode\n"); in ocs_hw_rqpair_init()
2558 if (sli_get_auto_xfer_rdy_capable(&hw->sli) && in ocs_hw_rqpair_init()
2559 hw->config.auto_xfer_rdy_size > 0) { in ocs_hw_rqpair_init()
2560 if (hw->auto_xfer_rdy_buf_pool == NULL) { in ocs_hw_rqpair_init()
2566 rc = ocs_hw_rqpair_auto_xfer_rdy_buffer_alloc(hw, hw->config.auto_xfer_rdy_xri_cnt + 1); in ocs_hw_rqpair_init()
2571 ocs_pool_reset(hw->auto_xfer_rdy_buf_pool); in ocs_hw_rqpair_init()
2575 xris_posted = ocs_hw_xri_move_to_port_owned(hw, hw->config.auto_xfer_rdy_xri_cnt); in ocs_hw_rqpair_init()
2576 if (xris_posted != hw->config.auto_xfer_rdy_xri_cnt) { in ocs_hw_rqpair_init()
2577 ocs_log_err(hw->os, "post_xri failed, only posted %d XRIs\n", xris_posted); in ocs_hw_rqpair_init()