Lines Matching +full:send +full:- +full:empty
1 /*-
34 * Functions to build and send ELS/CT/BLS commands and responses.
47 #define ELS_IOFMT_ARGS(els) els->init_task_tag, els->tgt_task_tag, els->hw_tag
52 ocs_log_info(ocs, "[%s] %-20s\n", node->display_name, __func__); \
56 …ocs_log_debug(els->node->ocs, "[%s]" ELS_IOFMT " %-8s " fmt, els->node->display_name, ELS_IOFMT_AR…
91 ocs_node_t *node = els->node; in ocs_io_transition()
93 ocs_sm_transition(&els->els_sm, state, data); in ocs_io_transition()
115 ocs_node_t *node = els->node; in ocs_els_post_event()
117 els->els_evtdepth ++; in ocs_els_post_event()
118 ocs_sm_post_event(&els->els_sm, evt, data); in ocs_els_post_event()
119 els->els_evtdepth --; in ocs_els_post_event()
121 if (els->els_evtdepth == 0 && els->els_req_free) { in ocs_els_post_event()
169 ocs_assert(node->ocs, NULL); in ocs_els_io_alloc_size()
170 ocs = node->ocs; in ocs_els_io_alloc_size()
171 ocs_assert(ocs->xport, NULL); in ocs_els_io_alloc_size()
172 xport = ocs->xport; in ocs_els_io_alloc_size()
174 ocs_lock(&node->active_ios_lock); in ocs_els_io_alloc_size()
175 if (!node->io_alloc_enabled) { in ocs_els_io_alloc_size()
177 ocs_unlock(&node->active_ios_lock); in ocs_els_io_alloc_size()
183 ocs_atomic_add_return(&xport->io_alloc_failed_count, 1); in ocs_els_io_alloc_size()
184 ocs_unlock(&node->active_ios_lock); in ocs_els_io_alloc_size()
189 ocs_ref_init(&els->ref, _ocs_els_io_free, els); in ocs_els_io_alloc_size()
193 els->cmd_ini = TRUE; in ocs_els_io_alloc_size()
194 els->cmd_tgt = FALSE; in ocs_els_io_alloc_size()
197 els->cmd_ini = FALSE; in ocs_els_io_alloc_size()
198 els->cmd_tgt = TRUE; in ocs_els_io_alloc_size()
203 if (els->hio != NULL) { in ocs_els_io_alloc_size()
206 ocs_unlock(&node->active_ios_lock); in ocs_els_io_alloc_size()
211 els->ocs = ocs; in ocs_els_io_alloc_size()
212 els->node = node; in ocs_els_io_alloc_size()
214 /* set type and ELS-specific fields */ in ocs_els_io_alloc_size()
215 els->io_type = OCS_IO_TYPE_ELS; in ocs_els_io_alloc_size()
216 els->display_name = "pending"; in ocs_els_io_alloc_size()
221 ocs_unlock(&node->active_ios_lock); in ocs_els_io_alloc_size()
229 ocs_unlock(&node->active_ios_lock); in ocs_els_io_alloc_size()
233 els->els_req.size = reqlen; in ocs_els_io_alloc_size()
234 els->els_rsp.size = rsplen; in ocs_els_io_alloc_size()
237 ocs_memset(&els->els_sm, 0, sizeof(els->els_sm)); in ocs_els_io_alloc_size()
238 els->els_sm.app = els; in ocs_els_io_alloc_size()
241 els->els_retries_remaining = OCS_FC_ELS_DEFAULT_RETRIES; in ocs_els_io_alloc_size()
242 els->els_evtdepth = 0; in ocs_els_io_alloc_size()
243 els->els_pend = 0; in ocs_els_io_alloc_size()
244 els->els_active = 0; in ocs_els_io_alloc_size()
247 ocs_list_add_tail(&node->els_io_pend_list, els); in ocs_els_io_alloc_size()
248 els->els_pend = 1; in ocs_els_io_alloc_size()
250 ocs_unlock(&node->active_ios_lock); in ocs_els_io_alloc_size()
269 ocs_ref_put(&els->ref); in ocs_els_io_free()
293 ocs_assert(els->node); in _ocs_els_io_free()
294 ocs_assert(els->node->ocs); in _ocs_els_io_free()
295 ocs = els->node->ocs; in _ocs_els_io_free()
297 node = els->node; in _ocs_els_io_free()
298 ocs = node->ocs; in _ocs_els_io_free()
300 ocs_lock(&node->active_ios_lock); in _ocs_els_io_free()
301 if (els->els_active) { in _ocs_els_io_free()
302 /* if active, remove from active list and check empty */ in _ocs_els_io_free()
303 ocs_list_remove(&node->els_io_active_list, els); in _ocs_els_io_free()
304 /* Send list empty event if the IO allocator is disabled, and the list is empty in _ocs_els_io_free()
305 * If node->io_alloc_enabled was not checked, the event would be posted continually in _ocs_els_io_free()
307 send_empty_event = (!node->io_alloc_enabled) && ocs_list_empty(&node->els_io_active_list); in _ocs_els_io_free()
308 els->els_active = 0; in _ocs_els_io_free()
309 } else if (els->els_pend) { in _ocs_els_io_free()
312 * need to check if pending list is empty in _ocs_els_io_free()
314 ocs_list_remove(&node->els_io_pend_list, els); in _ocs_els_io_free()
315 els->els_pend = 0; in _ocs_els_io_free()
317 ocs_log_err(ocs, "assertion failed: niether els->els_pend nor els->active set\n"); in _ocs_els_io_free()
318 ocs_unlock(&node->active_ios_lock); in _ocs_els_io_free()
322 ocs_unlock(&node->active_ios_lock); in _ocs_els_io_free()
345 ocs_node_t *node = els->node; in ocs_els_make_active()
348 ocs_lock(&node->active_ios_lock); in ocs_els_make_active()
349 if (els->els_pend) { in ocs_els_make_active()
350 if (els->els_active) { in ocs_els_make_active()
351 ocs_log_err(node->ocs, "assertion failed: both els->els_pend and els->active set\n"); in ocs_els_make_active()
352 ocs_unlock(&node->active_ios_lock); in ocs_els_make_active()
356 ocs_list_remove(&node->els_io_pend_list, els); in ocs_els_make_active()
357 els->els_pend = 0; in ocs_els_make_active()
360 ocs_list_add_tail(&node->els_io_active_list, els); in ocs_els_make_active()
361 els->els_active = 1; in ocs_els_make_active()
365 if (!els->els_active) { in ocs_els_make_active()
366 ocs_log_err(node->ocs, "assertion failed: niether els->els_pend nor els->active set\n"); in ocs_els_make_active()
369 ocs_unlock(&node->active_ios_lock); in ocs_els_make_active()
374 * @brief Send the ELS command.
380 * with the application-specific argument set to the \c els IO context.
383 * @param reqlen Byte count in the payload to send.
384 * @param timeout_sec Command timeout, in seconds (0 -> 2*R_A_TOV).
393 ocs_node_t *node = els->node; in ocs_els_send()
396 node->els_req_cnt++; in ocs_els_send()
401 els->wire_len = reqlen; in ocs_els_send()
407 * @brief Send the ELS response.
414 * @param rsplen Byte count in the payload to send.
422 ocs_node_t *node = els->node; in ocs_els_send_rsp()
425 node->els_cmpl_cnt++; in ocs_els_send_rsp()
430 els->wire_len = rsplen; in ocs_els_send_rsp()
439 * This callback is used for several ELS send operations.
446 * @param arg Application-specific argument (generally a pointer to the ELS IO context).
460 ocs_assert(arg, -1); in ocs_els_req_cb()
463 ocs_assert(els, -1); in ocs_els_req_cb()
464 ocs_assert(els->node, -1); in ocs_els_req_cb()
465 node = els->node; in ocs_els_req_cb()
466 ocs_assert(node->ocs, -1); in ocs_els_req_cb()
467 ocs = node->ocs; in ocs_els_req_cb()
469 ocs_assert(io->hio, -1); in ocs_els_req_cb()
470 ocs_assert(hio == io->hio, -1); in ocs_els_req_cb()
476 /* set the response len element of els->rsp */ in ocs_els_req_cb()
477 els->els_rsp.len = length; in ocs_els_req_cb()
488 if (length > els->els_rsp.size) { in ocs_els_req_cb()
490 length, els->els_rsp.size); in ocs_els_req_cb()
532 * This callback is used for several ELS send operations.
539 * @param arg Application-specific argument (generally a pointer to the ELS IO context).
553 ocs_assert(arg, -1); in ocs_els_acc_cb()
556 ocs_assert(els, -1); in ocs_els_acc_cb()
557 ocs_assert(els->node, -1); in ocs_els_acc_cb()
558 node = els->node; in ocs_els_acc_cb()
559 ocs_assert(node->ocs, -1); in ocs_els_acc_cb()
560 ocs = node->ocs; in ocs_els_acc_cb()
562 ocs_assert(io->hio, -1); in ocs_els_acc_cb()
563 ocs_assert(hio == io->hio, -1); in ocs_els_acc_cb()
577 ocs_log_warn(ocs, "[%s] %-8s failed status x%x, ext_status x%x\n", in ocs_els_acc_cb()
578 node->display_name, els->display_name, status, ext_status); in ocs_els_acc_cb()
585 if (els->els_callback) { in ocs_els_acc_cb()
586 (*els->els_callback)(node, &cbdata, els->els_callback_arg); in ocs_els_acc_cb()
596 * @brief Format and send a PLOGI ELS command.
600 * and send to the \c node.
616 ocs_t *ocs = node->ocs; in ocs_send_plogi()
625 els->els_timeout_sec = timeout_sec; in ocs_send_plogi()
626 els->els_retries_remaining = retries; in ocs_send_plogi()
627 els->els_callback = cb; in ocs_send_plogi()
628 els->els_callback_arg = cbarg; in ocs_send_plogi()
629 els->display_name = "plogi"; in ocs_send_plogi()
632 plogi = els->els_req.virt; in ocs_send_plogi()
634 ocs_memcpy(plogi, node->sport->service_params, sizeof(*plogi)); in ocs_send_plogi()
636 plogi->command_code = FC_ELS_CMD_PLOGI; in ocs_send_plogi()
637 plogi->resv1 = 0; in ocs_send_plogi()
639 …ocs_display_sparams(node->display_name, "plogi send req", 0, NULL, plogi->common_service_parameter… in ocs_send_plogi()
641 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_plogi()
642 els->iparam.els.timeout = timeout_sec; in ocs_send_plogi()
651 * @brief Format and send a FLOGI ELS command.
654 * Construct an FLOGI payload, and send to the \c node.
674 ocs_assert(node->ocs, NULL); in ocs_send_flogi()
675 ocs_assert(node->sport, NULL); in ocs_send_flogi()
676 ocs = node->ocs; in ocs_send_flogi()
684 els->els_timeout_sec = timeout_sec; in ocs_send_flogi()
685 els->els_retries_remaining = retries; in ocs_send_flogi()
686 els->els_callback = cb; in ocs_send_flogi()
687 els->els_callback_arg = cbarg; in ocs_send_flogi()
688 els->display_name = "flogi"; in ocs_send_flogi()
691 flogi = els->els_req.virt; in ocs_send_flogi()
693 ocs_memcpy(flogi, node->sport->service_params, sizeof(*flogi)); in ocs_send_flogi()
694 flogi->command_code = FC_ELS_CMD_FLOGI; in ocs_send_flogi()
695 flogi->resv1 = 0; in ocs_send_flogi()
698 flogi->common_service_parameters[1] |= ocs_htobe32(1U << 23); in ocs_send_flogi()
700 …ocs_display_sparams(node->display_name, "flogi send req", 0, NULL, flogi->common_service_parameter… in ocs_send_flogi()
702 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_flogi()
703 els->iparam.els.timeout = timeout_sec; in ocs_send_flogi()
711 * @brief Format and send a FDISC ELS command.
714 * Construct an FDISC payload, and send to the \c node.
734 ocs_assert(node->ocs, NULL); in ocs_send_fdisc()
735 ocs = node->ocs; in ocs_send_fdisc()
743 els->els_timeout_sec = timeout_sec; in ocs_send_fdisc()
744 els->els_retries_remaining = retries; in ocs_send_fdisc()
745 els->els_callback = cb; in ocs_send_fdisc()
746 els->els_callback_arg = cbarg; in ocs_send_fdisc()
747 els->display_name = "fdisc"; in ocs_send_fdisc()
750 fdisc = els->els_req.virt; in ocs_send_fdisc()
752 ocs_memcpy(fdisc, node->sport->service_params, sizeof(*fdisc)); in ocs_send_fdisc()
753 fdisc->command_code = FC_ELS_CMD_FDISC; in ocs_send_fdisc()
754 fdisc->resv1 = 0; in ocs_send_fdisc()
756 …ocs_display_sparams(node->display_name, "fdisc send req", 0, NULL, fdisc->common_service_parameter… in ocs_send_fdisc()
758 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_fdisc()
759 els->iparam.els.timeout = timeout_sec; in ocs_send_fdisc()
767 * @brief Send a PRLI ELS command.
770 * Construct a PRLI ELS command, and send to the \c node.
785 ocs_t *ocs = node->ocs; in ocs_send_prli()
795 els->els_timeout_sec = timeout_sec; in ocs_send_prli()
796 els->els_retries_remaining = retries; in ocs_send_prli()
797 els->els_callback = cb; in ocs_send_prli()
798 els->els_callback_arg = cbarg; in ocs_send_prli()
799 els->display_name = "prli"; in ocs_send_prli()
802 prli = els->els_req.virt; in ocs_send_prli()
806 prli->command_code = FC_ELS_CMD_PRLI; in ocs_send_prli()
807 prli->page_length = 16; in ocs_send_prli()
808 prli->payload_length = ocs_htobe16(sizeof(fc_prli_payload_t)); in ocs_send_prli()
809 prli->type = FC_TYPE_FCP; in ocs_send_prli()
810 prli->type_ext = 0; in ocs_send_prli()
811 prli->flags = ocs_htobe16(FC_PRLI_ESTABLISH_IMAGE_PAIR); in ocs_send_prli()
812 prli->service_params = ocs_htobe16(FC_PRLI_READ_XRDY_DISABLED | in ocs_send_prli()
813 (node->sport->enable_ini ? FC_PRLI_INITIATOR_FUNCTION : 0) | in ocs_send_prli()
814 (node->sport->enable_tgt ? FC_PRLI_TARGET_FUNCTION : 0)); in ocs_send_prli()
817 prli->service_params |= ocs_htobe16(FC_PRLI_CONFIRMED_COMPLETION | FC_PRLI_RETRY | in ocs_send_prli()
820 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_prli()
821 els->iparam.els.timeout = timeout_sec; in ocs_send_prli()
830 * @brief Send a PRLO ELS command.
833 * Construct a PRLO ELS command, and send to the \c node.
848 ocs_t *ocs = node->ocs; in ocs_send_prlo()
858 els->els_timeout_sec = timeout_sec; in ocs_send_prlo()
859 els->els_retries_remaining = retries; in ocs_send_prlo()
860 els->els_callback = cb; in ocs_send_prlo()
861 els->els_callback_arg = cbarg; in ocs_send_prlo()
862 els->display_name = "prlo"; in ocs_send_prlo()
865 prlo = els->els_req.virt; in ocs_send_prlo()
868 prlo->command_code = FC_ELS_CMD_PRLO; in ocs_send_prlo()
869 prlo->page_length = 16; in ocs_send_prlo()
870 prlo->payload_length = ocs_htobe16(sizeof(fc_prlo_payload_t)); in ocs_send_prlo()
871 prlo->type = FC_TYPE_FCP; in ocs_send_prlo()
872 prlo->type_ext = 0; in ocs_send_prlo()
874 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_prlo()
875 els->iparam.els.timeout = timeout_sec; in ocs_send_prlo()
883 * @brief Send a LOGO ELS command.
886 * Format a LOGO, and send to the \c node.
906 ocs = node->ocs; in ocs_send_logo()
910 sparams = (fc_plogi_payload_t*) node->sport->service_params; in ocs_send_logo()
916 els->els_timeout_sec = timeout_sec; in ocs_send_logo()
917 els->els_retries_remaining = retries; in ocs_send_logo()
918 els->els_callback = cb; in ocs_send_logo()
919 els->els_callback_arg = cbarg; in ocs_send_logo()
920 els->display_name = "logo"; in ocs_send_logo()
924 logo = els->els_req.virt; in ocs_send_logo()
927 logo->command_code = FC_ELS_CMD_LOGO; in ocs_send_logo()
928 logo->resv1 = 0; in ocs_send_logo()
929 logo->port_id = fc_htobe24(node->rnode.sport->fc_id); in ocs_send_logo()
930 logo->port_name_hi = sparams->port_name_hi; in ocs_send_logo()
931 logo->port_name_lo = sparams->port_name_lo; in ocs_send_logo()
933 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_logo()
934 els->iparam.els.timeout = timeout_sec; in ocs_send_logo()
942 * @brief Send an ADISC ELS command.
945 * Construct an ADISC ELS command, and send to the \c node.
964 ocs_sport_t *sport = node->sport; in ocs_send_adisc()
966 ocs = node->ocs; in ocs_send_adisc()
970 sparams = (fc_plogi_payload_t*) node->sport->service_params; in ocs_send_adisc()
976 els->els_timeout_sec = timeout_sec; in ocs_send_adisc()
977 els->els_retries_remaining = retries; in ocs_send_adisc()
978 els->els_callback = cb; in ocs_send_adisc()
979 els->els_callback_arg = cbarg; in ocs_send_adisc()
980 els->display_name = "adisc"; in ocs_send_adisc()
984 adisc = els->els_req.virt; in ocs_send_adisc()
985 sparams = (fc_plogi_payload_t*) node->sport->service_params; in ocs_send_adisc()
988 adisc->command_code = FC_ELS_CMD_ADISC; in ocs_send_adisc()
989 adisc->hard_address = fc_htobe24(sport->fc_id); in ocs_send_adisc()
990 adisc->port_name_hi = sparams->port_name_hi; in ocs_send_adisc()
991 adisc->port_name_lo = sparams->port_name_lo; in ocs_send_adisc()
992 adisc->node_name_hi = sparams->node_name_hi; in ocs_send_adisc()
993 adisc->node_name_lo = sparams->node_name_lo; in ocs_send_adisc()
994 adisc->port_id = fc_htobe24(node->rnode.sport->fc_id); in ocs_send_adisc()
996 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_adisc()
997 els->iparam.els.timeout = timeout_sec; in ocs_send_adisc()
1005 * @brief Send a PDISC ELS command.
1008 * Construct a PDISC ELS command, and send to the \c node.
1024 ocs_t *ocs = node->ocs; in ocs_send_pdisc()
1033 els->els_timeout_sec = timeout_sec; in ocs_send_pdisc()
1034 els->els_retries_remaining = retries; in ocs_send_pdisc()
1035 els->els_callback = cb; in ocs_send_pdisc()
1036 els->els_callback_arg = cbarg; in ocs_send_pdisc()
1037 els->display_name = "pdisc"; in ocs_send_pdisc()
1039 pdisc = els->els_req.virt; in ocs_send_pdisc()
1041 ocs_memcpy(pdisc, node->sport->service_params, sizeof(*pdisc)); in ocs_send_pdisc()
1043 pdisc->command_code = FC_ELS_CMD_PDISC; in ocs_send_pdisc()
1044 pdisc->resv1 = 0; in ocs_send_pdisc()
1046 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_pdisc()
1047 els->iparam.els.timeout = timeout_sec; in ocs_send_pdisc()
1055 * @brief Send an SCR ELS command.
1058 * Format an SCR, and send to the \c node.
1074 ocs_t *ocs = node->ocs; in ocs_send_scr()
1083 els->els_timeout_sec = timeout_sec; in ocs_send_scr()
1084 els->els_retries_remaining = retries; in ocs_send_scr()
1085 els->els_callback = cb; in ocs_send_scr()
1086 els->els_callback_arg = cbarg; in ocs_send_scr()
1087 els->display_name = "scr"; in ocs_send_scr()
1089 req = els->els_req.virt; in ocs_send_scr()
1092 req->command_code = FC_ELS_CMD_SCR; in ocs_send_scr()
1093 req->function = FC_SCR_REG_FULL; in ocs_send_scr()
1095 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_scr()
1096 els->iparam.els.timeout = timeout_sec; in ocs_send_scr()
1104 * @brief Send an RRQ ELS command.
1107 * Format an RRQ, and send to the \c node.
1123 ocs_t *ocs = node->ocs; in ocs_send_rrq()
1132 els->els_timeout_sec = timeout_sec; in ocs_send_rrq()
1133 els->els_retries_remaining = retries; in ocs_send_rrq()
1134 els->els_callback = cb; in ocs_send_rrq()
1135 els->els_callback_arg = cbarg; in ocs_send_rrq()
1136 els->display_name = "scr"; in ocs_send_rrq()
1138 req = els->els_req.virt; in ocs_send_rrq()
1141 req->command_code = FC_ELS_CMD_RRQ; in ocs_send_rrq()
1142 req->function = FC_SCR_REG_FULL; in ocs_send_rrq()
1144 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_rrq()
1145 els->iparam.els.timeout = timeout_sec; in ocs_send_rrq()
1153 * @brief Send an RSCN ELS command.
1156 * Format an RSCN, and send to the \c node.
1173 ocs_t *ocs = node->ocs; in ocs_send_rscn()
1175 uint32_t payload_length = sizeof(fc_rscn_affected_port_id_page_t)*(port_ids_count - 1) + in ocs_send_rscn()
1184 els->els_timeout_sec = timeout_sec; in ocs_send_rscn()
1185 els->els_retries_remaining = retries; in ocs_send_rscn()
1186 els->els_callback = cb; in ocs_send_rscn()
1187 els->els_callback_arg = cbarg; in ocs_send_rscn()
1188 els->display_name = "rscn"; in ocs_send_rscn()
1190 req = els->els_req.virt; in ocs_send_rscn()
1192 req->command_code = FC_ELS_CMD_RSCN; in ocs_send_rscn()
1193 req->page_length = sizeof(fc_rscn_affected_port_id_page_t); in ocs_send_rscn()
1194 req->payload_length = ocs_htobe16(sizeof(*req) + in ocs_send_rscn()
1195 sizeof(fc_rscn_affected_port_id_page_t)*(port_ids_count-1)); in ocs_send_rscn()
1197 els->hio_type = OCS_HW_ELS_REQ; in ocs_send_rscn()
1198 els->iparam.els.timeout = timeout_sec; in ocs_send_rscn()
1201 ocs_memcpy(req->port_list, port_ids, port_ids_count*sizeof(fc_rscn_affected_port_id_page_t)); in ocs_send_rscn()
1210 * @brief Send an LS_RJT ELS response.
1213 * Send an LS_RJT ELS response.
1219 * @param vendor_unique Vendor-unique value for LS_RJT.
1230 ocs_node_t *node = io->node; in ocs_send_ls_rjt()
1232 ocs_t *ocs = node->ocs; in ocs_send_ls_rjt()
1237 io->els_callback = cb; in ocs_send_ls_rjt()
1238 io->els_callback_arg = cbarg; in ocs_send_ls_rjt()
1239 io->display_name = "ls_rjt"; in ocs_send_ls_rjt()
1240 io->init_task_tag = ox_id; in ocs_send_ls_rjt()
1242 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_ls_rjt()
1243 io->iparam.els.ox_id = ox_id; in ocs_send_ls_rjt()
1245 rjt = io->els_req.virt; in ocs_send_ls_rjt()
1248 rjt->command_code = FC_ELS_CMD_RJT; in ocs_send_ls_rjt()
1249 rjt->reason_code = reason_code; in ocs_send_ls_rjt()
1250 rjt->reason_code_exp = reason_code_expl; in ocs_send_ls_rjt()
1252 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_ls_rjt()
1263 * @brief Send a PLOGI accept response.
1266 * Construct a PLOGI LS_ACC, and send to the \c node, using the originator exchange ID
1279 ocs_node_t *node = io->node; in ocs_send_plogi_acc()
1281 ocs_t *ocs = node->ocs; in ocs_send_plogi_acc()
1283 fc_plogi_payload_t *req = (fc_plogi_payload_t *)node->service_params; in ocs_send_plogi_acc()
1287 io->els_callback = cb; in ocs_send_plogi_acc()
1288 io->els_callback_arg = cbarg; in ocs_send_plogi_acc()
1289 io->display_name = "plog_acc"; in ocs_send_plogi_acc()
1290 io->init_task_tag = ox_id; in ocs_send_plogi_acc()
1292 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_plogi_acc()
1293 io->iparam.els.ox_id = ox_id; in ocs_send_plogi_acc()
1295 plogi = io->els_req.virt; in ocs_send_plogi_acc()
1298 ocs_memcpy(plogi, node->sport->service_params, sizeof(*plogi)); in ocs_send_plogi_acc()
1299 plogi->command_code = FC_ELS_CMD_ACC; in ocs_send_plogi_acc()
1300 plogi->resv1 = 0; in ocs_send_plogi_acc()
1303 if (req->common_service_parameters[1] & ocs_htobe32(1U << 24)) { in ocs_send_plogi_acc()
1304 plogi->common_service_parameters[1] |= ocs_htobe32(1U << 24); in ocs_send_plogi_acc()
1308 if (req->common_service_parameters[1] & ocs_htobe32(1U << 23)) { in ocs_send_plogi_acc()
1309 plogi->common_service_parameters[1] |= ocs_htobe32(1U << 23); in ocs_send_plogi_acc()
1312 …ocs_display_sparams(node->display_name, "plogi send resp", 0, NULL, plogi->common_service_paramete… in ocs_send_plogi_acc()
1314 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_plogi_acc()
1324 * @brief Send an FLOGI accept response for point-to-point negotiation.
1327 * Construct an FLOGI accept response, and send to the \c node using the originator
1341 ocs_node_t *node = io->node; in ocs_send_flogi_p2p_acc()
1343 ocs_t *ocs = node->ocs; in ocs_send_flogi_p2p_acc()
1348 io->els_callback = cb; in ocs_send_flogi_p2p_acc()
1349 io->els_callback_arg = cbarg; in ocs_send_flogi_p2p_acc()
1350 io->display_name = "flogi_p2p_acc"; in ocs_send_flogi_p2p_acc()
1351 io->init_task_tag = ox_id; in ocs_send_flogi_p2p_acc()
1353 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_flogi_p2p_acc()
1354 io->iparam.els_sid.ox_id = ox_id; in ocs_send_flogi_p2p_acc()
1355 io->iparam.els_sid.s_id = s_id; in ocs_send_flogi_p2p_acc()
1357 flogi = io->els_req.virt; in ocs_send_flogi_p2p_acc()
1360 ocs_memcpy(flogi, node->sport->service_params, sizeof(*flogi)); in ocs_send_flogi_p2p_acc()
1361 flogi->command_code = FC_ELS_CMD_ACC; in ocs_send_flogi_p2p_acc()
1362 flogi->resv1 = 0; in ocs_send_flogi_p2p_acc()
1363 ocs_memset(flogi->class1_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_p2p_acc()
1364 ocs_memset(flogi->class2_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_p2p_acc()
1365 ocs_memset(flogi->class3_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_p2p_acc()
1366 ocs_memset(flogi->class4_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_p2p_acc()
1368 io->hio_type = OCS_HW_ELS_RSP_SID; in ocs_send_flogi_p2p_acc()
1380 ocs_node_t *node = io->node; in ocs_send_flogi_acc()
1382 ocs_t *ocs = node->ocs; in ocs_send_flogi_acc()
1387 io->els_callback = cb; in ocs_send_flogi_acc()
1388 io->els_callback_arg = cbarg; in ocs_send_flogi_acc()
1389 io->display_name = "flogi_acc"; in ocs_send_flogi_acc()
1390 io->init_task_tag = ox_id; in ocs_send_flogi_acc()
1392 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_flogi_acc()
1393 io->iparam.els_sid.ox_id = ox_id; in ocs_send_flogi_acc()
1394 io->iparam.els_sid.s_id = io->node->sport->fc_id; in ocs_send_flogi_acc()
1396 flogi = io->els_req.virt; in ocs_send_flogi_acc()
1399 ocs_memcpy(flogi, node->sport->service_params, sizeof(*flogi)); in ocs_send_flogi_acc()
1404 flogi->common_service_parameters[1] |= ocs_be32toh(3U << 28); in ocs_send_flogi_acc()
1407 flogi->command_code = FC_ELS_CMD_ACC; in ocs_send_flogi_acc()
1408 flogi->resv1 = 0; in ocs_send_flogi_acc()
1410 …ocs_display_sparams(node->display_name, "flogi send resp", 0, NULL, flogi->common_service_paramete… in ocs_send_flogi_acc()
1412 ocs_memset(flogi->class1_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_acc()
1413 ocs_memset(flogi->class2_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_acc()
1414 ocs_memset(flogi->class3_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_acc()
1415 ocs_memset(flogi->class4_service_parameters, 0, sizeof(flogi->class1_service_parameters)); in ocs_send_flogi_acc()
1417 io->hio_type = OCS_HW_ELS_RSP_SID; in ocs_send_flogi_acc()
1428 * @brief Send a PRLI accept response
1431 * Construct a PRLI LS_ACC response, and send to the \c node, using the originator
1445 ocs_node_t *node = io->node; in ocs_send_prli_acc()
1447 ocs_t *ocs = node->ocs; in ocs_send_prli_acc()
1452 io->els_callback = cb; in ocs_send_prli_acc()
1453 io->els_callback_arg = cbarg; in ocs_send_prli_acc()
1454 io->display_name = "prli_acc"; in ocs_send_prli_acc()
1455 io->init_task_tag = ox_id; in ocs_send_prli_acc()
1457 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_prli_acc()
1458 io->iparam.els.ox_id = ox_id; in ocs_send_prli_acc()
1460 prli = io->els_req.virt; in ocs_send_prli_acc()
1463 prli->command_code = FC_ELS_CMD_ACC; in ocs_send_prli_acc()
1464 prli->page_length = 16; in ocs_send_prli_acc()
1465 prli->payload_length = ocs_htobe16(sizeof(fc_prli_payload_t)); in ocs_send_prli_acc()
1466 prli->type = fc_type; in ocs_send_prli_acc()
1467 prli->type_ext = 0; in ocs_send_prli_acc()
1468 prli->flags = ocs_htobe16(FC_PRLI_ESTABLISH_IMAGE_PAIR | FC_PRLI_REQUEST_EXECUTED); in ocs_send_prli_acc()
1470 prli->service_params = ocs_htobe16(FC_PRLI_READ_XRDY_DISABLED | in ocs_send_prli_acc()
1471 (node->sport->enable_ini ? FC_PRLI_INITIATOR_FUNCTION : 0) | in ocs_send_prli_acc()
1472 (node->sport->enable_tgt ? FC_PRLI_TARGET_FUNCTION : 0)); in ocs_send_prli_acc()
1474 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_prli_acc()
1485 * @brief Send a PRLO accept response.
1488 * Construct a PRLO LS_ACC response, and send to the \c node, using the originator
1502 ocs_node_t *node = io->node; in ocs_send_prlo_acc()
1504 ocs_t *ocs = node->ocs; in ocs_send_prlo_acc()
1509 io->els_callback = cb; in ocs_send_prlo_acc()
1510 io->els_callback_arg = cbarg; in ocs_send_prlo_acc()
1511 io->display_name = "prlo_acc"; in ocs_send_prlo_acc()
1512 io->init_task_tag = ox_id; in ocs_send_prlo_acc()
1514 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_prlo_acc()
1515 io->iparam.els.ox_id = ox_id; in ocs_send_prlo_acc()
1517 prlo_acc = io->els_req.virt; in ocs_send_prlo_acc()
1520 prlo_acc->command_code = FC_ELS_CMD_ACC; in ocs_send_prlo_acc()
1521 prlo_acc->page_length = 16; in ocs_send_prlo_acc()
1522 prlo_acc->payload_length = ocs_htobe16(sizeof(fc_prlo_acc_payload_t)); in ocs_send_prlo_acc()
1523 prlo_acc->type = fc_type; in ocs_send_prlo_acc()
1524 prlo_acc->type_ext = 0; in ocs_send_prlo_acc()
1525 prlo_acc->response_code = FC_PRLO_REQUEST_EXECUTED; in ocs_send_prlo_acc()
1527 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_prlo_acc()
1538 * @brief Send a generic LS_ACC response without a payload.
1554 ocs_node_t *node = io->node; in ocs_send_ls_acc()
1556 ocs_t *ocs = node->ocs; in ocs_send_ls_acc()
1561 io->els_callback = cb; in ocs_send_ls_acc()
1562 io->els_callback_arg = cbarg; in ocs_send_ls_acc()
1563 io->display_name = "ls_acc"; in ocs_send_ls_acc()
1564 io->init_task_tag = ox_id; in ocs_send_ls_acc()
1566 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_ls_acc()
1567 io->iparam.els.ox_id = ox_id; in ocs_send_ls_acc()
1569 acc = io->els_req.virt; in ocs_send_ls_acc()
1572 acc->command_code = FC_ELS_CMD_ACC; in ocs_send_ls_acc()
1574 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_ls_acc()
1585 * @brief Send a LOGO accept response.
1588 * Construct a LOGO LS_ACC response, and send to the \c node, using the originator
1601 ocs_node_t *node = io->node; in ocs_send_logo_acc()
1603 ocs_t *ocs = node->ocs; in ocs_send_logo_acc()
1608 io->els_callback = cb; in ocs_send_logo_acc()
1609 io->els_callback_arg = cbarg; in ocs_send_logo_acc()
1610 io->display_name = "logo_acc"; in ocs_send_logo_acc()
1611 io->init_task_tag = ox_id; in ocs_send_logo_acc()
1613 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_logo_acc()
1614 io->iparam.els.ox_id = ox_id; in ocs_send_logo_acc()
1616 logo = io->els_req.virt; in ocs_send_logo_acc()
1619 logo->command_code = FC_ELS_CMD_ACC; in ocs_send_logo_acc()
1620 logo->resv1 = 0; in ocs_send_logo_acc()
1622 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_logo_acc()
1633 * @brief Send an ADISC accept response.
1636 * Construct an ADISC LS__ACC, and send to the \c node, using the originator
1650 ocs_node_t *node = io->node; in ocs_send_adisc_acc()
1657 ocs_assert(node->ocs, NULL); in ocs_send_adisc_acc()
1658 ocs = node->ocs; in ocs_send_adisc_acc()
1662 io->els_callback = cb; in ocs_send_adisc_acc()
1663 io->els_callback_arg = cbarg; in ocs_send_adisc_acc()
1664 io->display_name = "adisc_acc"; in ocs_send_adisc_acc()
1665 io->init_task_tag = ox_id; in ocs_send_adisc_acc()
1667 /* Go ahead and send the ELS_ACC */ in ocs_send_adisc_acc()
1668 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_adisc_acc()
1669 io->iparam.els.ox_id = ox_id; in ocs_send_adisc_acc()
1671 sparams = (fc_plogi_payload_t*) node->sport->service_params; in ocs_send_adisc_acc()
1672 adisc = io->els_req.virt; in ocs_send_adisc_acc()
1674 adisc->command_code = FC_ELS_CMD_ACC; in ocs_send_adisc_acc()
1675 adisc->hard_address = 0; in ocs_send_adisc_acc()
1676 adisc->port_name_hi = sparams->port_name_hi; in ocs_send_adisc_acc()
1677 adisc->port_name_lo = sparams->port_name_lo; in ocs_send_adisc_acc()
1678 adisc->node_name_hi = sparams->node_name_hi; in ocs_send_adisc_acc()
1679 adisc->node_name_lo = sparams->node_name_lo; in ocs_send_adisc_acc()
1680 adisc->port_id = fc_htobe24(node->rnode.sport->fc_id); in ocs_send_adisc_acc()
1682 io->hio_type = OCS_HW_ELS_RSP; in ocs_send_adisc_acc()
1693 * @brief Send a RFTID CT request.
1696 * Construct an RFTID CT request, and send to the \c node.
1711 ocs_t *ocs = node->ocs; in ocs_ns_send_rftid()
1720 els->iparam.fc_ct.r_ctl = FC_RCTL_ELS; in ocs_ns_send_rftid()
1721 els->iparam.fc_ct.type = FC_TYPE_GS; in ocs_ns_send_rftid()
1722 els->iparam.fc_ct.df_ctl = 0; in ocs_ns_send_rftid()
1723 els->iparam.fc_ct.timeout = timeout_sec; in ocs_ns_send_rftid()
1725 els->els_callback = cb; in ocs_ns_send_rftid()
1726 els->els_callback_arg = cbarg; in ocs_ns_send_rftid()
1727 els->display_name = "rftid"; in ocs_ns_send_rftid()
1729 rftid = els->els_req.virt; in ocs_ns_send_rftid()
1732 …fcct_build_req_header(&rftid->hdr, FC_GS_NAMESERVER_RFT_ID, (OCS_ELS_RSP_LEN - sizeof(rftid->hdr))… in ocs_ns_send_rftid()
1733 rftid->port_id = ocs_htobe32(node->rnode.sport->fc_id); in ocs_ns_send_rftid()
1734 rftid->fc4_types[FC_GS_TYPE_WORD(FC_TYPE_FCP)] = ocs_htobe32(1 << FC_GS_TYPE_BIT(FC_TYPE_FCP)); in ocs_ns_send_rftid()
1736 els->hio_type = OCS_HW_FC_CT; in ocs_ns_send_rftid()
1745 * @brief Send a RFFID CT request.
1748 * Construct an RFFID CT request, and send to the \c node.
1763 ocs_t *ocs = node->ocs; in ocs_ns_send_rffid()
1772 els->iparam.fc_ct.r_ctl = FC_RCTL_ELS; in ocs_ns_send_rffid()
1773 els->iparam.fc_ct.type = FC_TYPE_GS; in ocs_ns_send_rffid()
1774 els->iparam.fc_ct.df_ctl = 0; in ocs_ns_send_rffid()
1775 els->iparam.fc_ct.timeout = timeout_sec; in ocs_ns_send_rffid()
1777 els->els_callback = cb; in ocs_ns_send_rffid()
1778 els->els_callback_arg = cbarg; in ocs_ns_send_rffid()
1779 els->display_name = "rffid"; in ocs_ns_send_rffid()
1781 rffid = els->els_req.virt; in ocs_ns_send_rffid()
1785 …fcct_build_req_header(&rffid->hdr, FC_GS_NAMESERVER_RFF_ID, (OCS_ELS_RSP_LEN - sizeof(rffid->hdr))… in ocs_ns_send_rffid()
1786 rffid->port_id = ocs_htobe32(node->rnode.sport->fc_id); in ocs_ns_send_rffid()
1787 if (node->sport->enable_ini) { in ocs_ns_send_rffid()
1788 rffid->fc4_feature_bits |= FC4_FEATURE_INITIATOR; in ocs_ns_send_rffid()
1790 if (node->sport->enable_tgt) { in ocs_ns_send_rffid()
1791 rffid->fc4_feature_bits |= FC4_FEATURE_TARGET; in ocs_ns_send_rffid()
1793 rffid->type = FC_TYPE_FCP; in ocs_ns_send_rffid()
1795 els->hio_type = OCS_HW_FC_CT; in ocs_ns_send_rffid()
1804 * @brief Send a GIDPT CT request.
1807 * Construct a GIDPT CT request, and send to the \c node.
1823 ocs_t *ocs = node->ocs; in ocs_ns_send_gidpt()
1832 els->iparam.fc_ct.r_ctl = FC_RCTL_ELS; in ocs_ns_send_gidpt()
1833 els->iparam.fc_ct.type = FC_TYPE_GS; in ocs_ns_send_gidpt()
1834 els->iparam.fc_ct.df_ctl = 0; in ocs_ns_send_gidpt()
1835 els->iparam.fc_ct.timeout = timeout_sec; in ocs_ns_send_gidpt()
1837 els->els_callback = cb; in ocs_ns_send_gidpt()
1838 els->els_callback_arg = cbarg; in ocs_ns_send_gidpt()
1839 els->display_name = "gidpt"; in ocs_ns_send_gidpt()
1841 gidpt = els->els_req.virt; in ocs_ns_send_gidpt()
1844 …fcct_build_req_header(&gidpt->hdr, FC_GS_NAMESERVER_GID_PT, (OCS_ELS_GID_PT_RSP_LEN - sizeof(gidpt… in ocs_ns_send_gidpt()
1845 gidpt->domain_id_scope = 0; in ocs_ns_send_gidpt()
1846 gidpt->area_id_scope = 0; in ocs_ns_send_gidpt()
1847 gidpt->port_type = 0x7f; in ocs_ns_send_gidpt()
1849 els->hio_type = OCS_HW_FC_CT; in ocs_ns_send_gidpt()
1858 * @brief Send a BA_ACC given the request's FC header
1872 uint16_t ox_id = ocs_be16toh(hdr->ox_id); in ocs_bls_send_acc_hdr()
1873 uint16_t rx_id = ocs_be16toh(hdr->rx_id); in ocs_bls_send_acc_hdr()
1874 uint32_t d_id = fc_be24toh(hdr->d_id); in ocs_bls_send_acc_hdr()
1881 * @brief Send a BLS BA_ACC response.
1884 * Construct a BLS BA_ACC response, and send to the \c node.
1898 ocs_node_t *node = io->node; in ocs_bls_send_acc()
1904 ocs_assert(node->ocs, NULL); in ocs_bls_send_acc()
1905 ocs = node->ocs; in ocs_bls_send_acc()
1907 if (node->rnode.sport->fc_id == s_id) { in ocs_bls_send_acc()
1912 io->ocs = ocs; in ocs_bls_send_acc()
1913 io->node = node; in ocs_bls_send_acc()
1914 io->cmd_tgt = TRUE; in ocs_bls_send_acc()
1916 /* fill out BLS Response-specific fields */ in ocs_bls_send_acc()
1917 io->io_type = OCS_IO_TYPE_BLS_RESP; in ocs_bls_send_acc()
1918 io->display_name = "ba_acc"; in ocs_bls_send_acc()
1919 io->hio_type = OCS_HW_BLS_ACC_SID; in ocs_bls_send_acc()
1920 io->init_task_tag = ox_id; in ocs_bls_send_acc()
1923 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_bls_send_acc()
1924 io->iparam.bls_sid.s_id = s_id; in ocs_bls_send_acc()
1925 io->iparam.bls_sid.ox_id = ox_id; in ocs_bls_send_acc()
1926 io->iparam.bls_sid.rx_id = rx_id; in ocs_bls_send_acc()
1928 acc = (void *)io->iparam.bls_sid.payload; in ocs_bls_send_acc()
1930 ocs_memset(io->iparam.bls_sid.payload, 0, sizeof(io->iparam.bls_sid.payload)); in ocs_bls_send_acc()
1931 acc->ox_id = io->iparam.bls_sid.ox_id; in ocs_bls_send_acc()
1932 acc->rx_id = io->iparam.bls_sid.rx_id; in ocs_bls_send_acc()
1933 acc->high_seq_cnt = UINT16_MAX; in ocs_bls_send_acc()
1964 ocs_assert(io, -1); in ocs_bls_send_acc_cb()
1993 ocs_assert(app, -1); in ocs_els_abort_cb()
1995 els = abort_io->io_to_abort; in ocs_els_abort_cb()
1996 ocs_assert(els->node, -1); in ocs_els_abort_cb()
1997 ocs_assert(els->node->ocs, -1); in ocs_els_abort_cb()
1999 ocs = els->node->ocs; in ocs_els_abort_cb()
2008 /* send completion event to indicate abort process is complete in ocs_els_abort_cb()
2014 ocs_ref_put(&els->ref); /* ocs_ref_get(): ocs_els_abort_io() */ in ocs_els_abort_cb()
2047 ocs_assert(els->node, NULL); in ocs_els_abort_io()
2048 ocs_assert(els->node->ocs, NULL); in ocs_els_abort_io()
2050 ocs = els->node->ocs; in ocs_els_abort_io()
2051 ocs_assert(ocs->xport, NULL); in ocs_els_abort_io()
2052 xport = ocs->xport; in ocs_els_abort_io()
2055 if ((ocs_ref_get_unless_zero(&els->ref) == 0)) { in ocs_els_abort_io()
2061 /* allocate IO structure to send abort */ in ocs_els_abort_io()
2064 ocs_atomic_add_return(&xport->io_alloc_failed_count, 1); in ocs_els_abort_io()
2066 ocs_assert(abort_io->hio == NULL, NULL); in ocs_els_abort_io()
2069 abort_io->ocs = ocs; in ocs_els_abort_io()
2070 abort_io->node = els->node; in ocs_els_abort_io()
2071 abort_io->cmd_ini = TRUE; in ocs_els_abort_io()
2073 /* set type and ABORT-specific fields */ in ocs_els_abort_io()
2074 abort_io->io_type = OCS_IO_TYPE_ABORT; in ocs_els_abort_io()
2075 abort_io->display_name = "abort_els"; in ocs_els_abort_io()
2076 abort_io->io_to_abort = els; in ocs_els_abort_io()
2077 abort_io->send_abts = send_abts; in ocs_els_abort_io()
2089 ocs_ref_put(&els->ref); /* ocs_ref_get(): same function */ in ocs_els_abort_io()
2103 els = ctx->app; \
2105 node = els->node; \
2107 ocs = node->ocs; \
2113 ocs_log_info(ocs, "[%s] %-8s %-20s %-20s\n", node->display_name, els->display_name, \
2140 ocs_sm_disable(&els->els_sm); in ocs_els_io_cleanup()
2141 ocs_node_post_event(els->node, node_evt, arg); in ocs_els_io_cleanup()
2144 if (els->els_callback) { in ocs_els_io_cleanup()
2145 (*els->els_callback)(els->node, arg, els->els_callback_arg); in ocs_els_io_cleanup()
2147 els->els_req_free = 1; in ocs_els_io_cleanup()
2179 …ocs_log_warn(els->node->ocs, "[%s] %-20s %-20s not handled - terminating ELS\n", node->display_nam… in __ocs_els_common()
2184 ocs_log_warn(els->node->ocs, "[%s] %-20s %-20s not handled\n", node->display_name, funcname, in __ocs_els_common()
2215 rc = ocs_els_send(els, els->els_req.size, els->els_timeout_sec, ocs_els_req_cb); in __ocs_els_init()
2270 els->els_retries_remaining-1); in __ocs_els_wait_resp()
2277 uint32_t reason_code = (cbdata->ext_status >> 16) & 0xff; in __ocs_els_wait_resp()
2282 els->node->els_req_cnt--; in __ocs_els_wait_resp()
2296 els->els_retries_remaining = 0; /* Set retries to zero, we are done */ in __ocs_els_wait_resp()
2346 if (els->els_retries_remaining && --els->els_retries_remaining) { in __ocs_els_retry()
2354 ocs_assert(els->hio, NULL); in __ocs_els_retry()
2355 ocs_hw_io_free(&ocs->hw, els->hio); in __ocs_els_retry()
2356 els->hio = NULL; in __ocs_els_retry()
2359 ocs_assert(els->node->els_req_cnt, NULL); in __ocs_els_retry()
2360 els->node->els_req_cnt--; in __ocs_els_retry()
2361 rc = ocs_els_send(els, els->els_req.size, els->els_timeout_sec, ocs_els_req_cb); in __ocs_els_retry()
2404 ocs_mod_timer(&els->delay_timer, 1); in __ocs_els_aborted_delay_retry()
2408 node->els_req_cnt++; in __ocs_els_aborted_delay_retry()
2440 ocs_setup_timer(ocs, &els->delay_timer, ocs_els_delay_timer_cb, els, 5000); in __ocs_els_delay_retry()
2446 if (els->hio != NULL) { in __ocs_els_delay_retry()
2447 ocs_hw_io_free(&ocs->hw, els->hio); in __ocs_els_delay_retry()
2448 els->hio = NULL; in __ocs_els_delay_retry()
2630 ocs_ddump_section(textbuf, "els", -1); in ocs_ddump_els()
2631 ocs_ddump_value(textbuf, "req_free", "%d", els->els_req_free); in ocs_ddump_els()
2632 ocs_ddump_value(textbuf, "evtdepth", "%d", els->els_evtdepth); in ocs_ddump_els()
2633 ocs_ddump_value(textbuf, "pend", "%d", els->els_pend); in ocs_ddump_els()
2634 ocs_ddump_value(textbuf, "active", "%d", els->els_active); in ocs_ddump_els()
2636 ocs_ddump_endsection(textbuf, "els", -1); in ocs_ddump_els()
2640 * @brief return TRUE if given ELS list is empty (while taking proper locks)
2642 * Test if given ELS list is empty while holding the node->active_ios_lock.
2647 * @return TRUE if els_io_list is empty
2653 int empty; in ocs_els_io_list_empty() local
2654 ocs_lock(&node->active_ios_lock); in ocs_els_io_list_empty()
2655 empty = ocs_list_empty(list); in ocs_els_io_list_empty()
2656 ocs_unlock(&node->active_ios_lock); in ocs_els_io_list_empty()
2657 return empty; in ocs_els_io_list_empty()
2661 * @brief Handle CT send response completion
2670 * @param arg Application-specific argument (generally a pointer to the ELS IO context).
2685 * @brief Send CT response
2701 fcct_iu_header_t *rsp = io->els_rsp.virt; in ocs_send_ct_rsp()
2703 io->io_type = OCS_IO_TYPE_CT_RESP; in ocs_send_ct_rsp()
2708 rsp->reason_code = reason_code; in ocs_send_ct_rsp()
2709 rsp->reason_code_explanation = reason_code_explanation; in ocs_send_ct_rsp()
2711 io->display_name = "ct response"; in ocs_send_ct_rsp()
2712 io->init_task_tag = ox_id; in ocs_send_ct_rsp()
2713 io->wire_len += sizeof(*rsp); in ocs_send_ct_rsp()
2715 ocs_memset(&io->iparam, 0, sizeof(io->iparam)); in ocs_send_ct_rsp()
2717 io->io_type = OCS_IO_TYPE_CT_RESP; in ocs_send_ct_rsp()
2718 io->hio_type = OCS_HW_FC_CT_RSP; in ocs_send_ct_rsp()
2719 io->iparam.fc_ct_rsp.ox_id = ocs_htobe16(ox_id); in ocs_send_ct_rsp()
2720 io->iparam.fc_ct_rsp.r_ctl = 3; in ocs_send_ct_rsp()
2721 io->iparam.fc_ct_rsp.type = FC_TYPE_GS; in ocs_send_ct_rsp()
2722 io->iparam.fc_ct_rsp.df_ctl = 0; in ocs_send_ct_rsp()
2723 io->iparam.fc_ct_rsp.timeout = 5; in ocs_send_ct_rsp()
2727 return -1; in ocs_send_ct_rsp()
2745 ocs_node_t *node = els->node; in ocs_els_delay_timer_cb()
2759 ocs_setup_timer(els->ocs, &els->delay_timer, ocs_els_delay_timer_cb, els, 1); in ocs_els_delay_timer_cb()