48 #define ELS_IOFMT "[i:%04x t:%04x h:%04x]"
49 #define ELS_IOFMT_ARGS(els) els->init_task_tag, els->tgt_task_tag, els->hw_tag
51 #define node_els_trace() \
53 if (OCS_LOG_ENABLE_ELS_TRACE(ocs)) \
54 ocs_log_info(ocs, "[%s] %-20s\n", node->display_name, __func__); \
57 #define els_io_printf(els, fmt, ...) \
58 ocs_log_debug(els->node->ocs, "[%s]" ELS_IOFMT " %-8s " fmt, els->node->display_name, ELS_IOFMT_ARGS(els), els->display_name, ##__VA_ARGS__);
62 static int32_t
ocs_els_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status,
void *arg);
63 static ocs_io_t *
ocs_bls_send_acc(ocs_io_t *io, uint32_t s_id, uint16_t ox_id, uint16_t rx_id);
64 static ocs_io_t *
ocs_bls_send_rjt(ocs_io_t *io, uint32_t s_id, uint16_t ox_id, uint16_t rx_id);
65 static int32_t
ocs_bls_send_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length,
66 int32_t status, uint32_t ext_status,
void *app);
67 static int32_t
ocs_bls_send_rjt_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length,
68 int32_t status, uint32_t ext_status,
void *app);
118 #define OCS_ELS_RSP_LEN 1024
119 #define OCS_ELS_FDMI_REG_LEN 2048
120 #define OCS_ELS_FDMI_RSP_LEN 4096
121 #define OCS_ELS_GID_FT_RSP_LEN 8096
122 #define OCS_ELS_GID_PT_RSP_LEN 8096
124 #define MAX_FDMI_ATTRIBUTE_SIZE 256
147 ocs_node_t *node = els->node;
171 ocs_node_t *node = els->node;
173 els->els_evtdepth ++;
175 els->els_evtdepth --;
177 if (els->els_evtdepth == 0 && els->els_req_free) {
234 rc = ocs_dma_alloc(ocs, &els_req, reqlen, OCS_MIN_DMA_ALIGNMENT);
236 rc = ocs_dma_alloc(ocs, &els_rsp, rsplen, OCS_MIN_DMA_ALIGNMENT);
238 ocs_log_err(ocs,
"ocs_dma_alloc rsp\n");
239 ocs_dma_free(ocs, &els_req);
243 ocs_log_err(ocs,
"ocs_dma_alloc req\n");
247 ocs_lock(&node->active_ios_lock);
248 if (!node->io_alloc_enabled) {
249 ocs_log_debug(ocs,
"called with io_alloc_enabled = FALSE\n");
250 ocs_unlock(&node->active_ios_lock);
251 goto els_io_alloc_err;
256 ocs_atomic_add_return(&xport->io_alloc_failed_count, 1);
257 ocs_unlock(&node->active_ios_lock);
258 goto els_io_alloc_err;
267 els->cmd_tgt = FALSE;
270 els->cmd_ini = FALSE;
276 if (els->hio != NULL) {
277 ocs_log_err(ocs,
"assertion failed. HIO is not null\n");
279 ocs_unlock(&node->active_ios_lock);
280 goto els_io_alloc_err;
289 els->display_name =
"pending";
293 ocs_memset(&els->els_sm, 0,
sizeof(els->els_sm));
294 els->els_sm.app = els;
298 els->els_evtdepth = 0;
301 els->els_req = els_req;
302 els->els_rsp = els_rsp;
308 ocs_unlock(&node->active_ios_lock);
312 ocs_dma_free(ocs, &els_req);
313 ocs_dma_free(ocs, &els_rsp);
332 ocs_ref_put(&els->ref);
350 ocs_io_t *els = (ocs_io_t *)arg;
353 int send_empty_event = FALSE;
358 ocs = els->node->ocs;
363 ocs_lock(&node->active_ios_lock);
364 if (els->els_active) {
370 send_empty_event = (!node->io_alloc_enabled) &&
ocs_list_empty(&node->els_io_active_list);
372 }
else if (els->els_pend) {
380 ocs_log_err(ocs,
"assertion failed: niether els->els_pend nor els->active set\n");
381 ocs_unlock(&node->active_ios_lock);
385 ocs_unlock(&node->active_ios_lock);
388 ocs_dma_free(ocs, &els->els_rsp);
389 ocs_dma_free(ocs, &els->els_req);
393 if (send_empty_event) {
412 ocs_node_t *node = els->node;
415 ocs_lock(&node->active_ios_lock);
417 if (els->els_active) {
418 ocs_log_err(node->ocs,
"assertion failed: both els->els_pend and els->active set\n");
419 ocs_unlock(&node->active_ios_lock);
433 if (!els->els_active) {
434 ocs_log_err(node->ocs,
"assertion failed: niether els->els_pend nor els->active set\n");
437 ocs_unlock(&node->active_ios_lock);
461 ocs_node_t *node = els->node;
469 els->wire_len = reqlen;
490 ocs_node_t *node = els->node;
493 node->els_cmpl_cnt++;
498 els->wire_len = rsplen;
520 ocs_els_req_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status,
void *arg)
525 ocs_node_cb_t cbdata;
544 els_io_printf(els,
"status x%x ext x%x\n", status, ext_status);
547 els->els_rsp.len = length;
549 cbdata.status = status;
550 cbdata.ext_status = ext_status;
551 cbdata.header = NULL;
555 if (!ocs_ref_get_unless_zero(&sport->ref))
568 if (length > els->els_rsp.size) {
569 ocs_log_warn(ocs,
"ELS response returned len=%d > buflen=%zu\n", length, els->els_rsp.size);
571 goto exit_els_req_cb;
585 switch (ext_status) {
599 ocs_log_warn(ocs,
"els req complete: failed status x%x, ext_status, x%x\n", status, ext_status);
607 ocs_ref_put(&sport->ref);
629 ocs_els_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status,
void *arg)
634 ocs_node_cb_t cbdata;
649 cbdata.status = status;
650 cbdata.ext_status = ext_status;
651 cbdata.header = NULL;
661 ocs_log_warn(ocs,
"[%s] %-8s failed status x%x, ext_status x%x\n",
662 node->display_name, els->display_name, status, ext_status);
663 ocs_log_warn(ocs,
"els acc complete: failed status x%x, ext_status, x%x\n", status, ext_status);
669 if (els->els_callback) {
670 (*els->els_callback)(node, &cbdata, els->els_callback_arg);
697 void (*cb)(ocs_node_t *node, ocs_node_cb_t *cbdata,
void *arg),
void *cbarg)
700 ocs_t *ocs = node->ocs;
702 uint32_t suppress_rsp =
false;
707 ocs_log_err(ocs,
"IO alloc failed\n");
709 els->els_timeout_sec = timeout_sec;
710 els->els_retries_remaining = retries;
711 els->els_callback = cb;
712 els->els_callback_arg = cbarg;
713 els->display_name =
"plogi";
716 plogi = els->els_req.virt;
718 ocs_memcpy(plogi, node->sport->service_params,
sizeof(*plogi));
749 els->iparam.els.timeout = timeout_sec;
789 ocs_log_err(ocs,
"IO alloc failed\n");
791 els->els_timeout_sec = timeout_sec;
792 els->els_retries_remaining = retries;
793 els->els_callback = cb;
794 els->els_callback_arg = cbarg;
795 els->display_name =
"flogi";
798 flogi = els->els_req.virt;
800 ocs_memcpy(flogi, node->sport->service_params,
sizeof(*flogi));
819 els->iparam.els.timeout = timeout_sec;
857 ocs_log_err(ocs,
"IO alloc failed\n");
859 els->els_timeout_sec = timeout_sec;
860 els->els_retries_remaining = retries;
861 els->els_callback = cb;
862 els->els_callback_arg = cbarg;
863 els->display_name =
"fdisc";
866 fdisc = els->els_req.virt;
868 ocs_memcpy(fdisc, node->sport->service_params,
sizeof(*fdisc));
886 els->iparam.els.timeout = timeout_sec;
912 ocs_t *ocs = node->ocs;
920 ocs_log_err(ocs,
"IO alloc failed\n");
922 els->els_timeout_sec = timeout_sec;
923 els->els_retries_remaining = retries;
924 els->els_callback = cb;
925 els->els_callback_arg = cbarg;
926 els->display_name =
"prli";
929 prli = els->els_req.virt;
931 ocs_memset(prli, 0,
sizeof(*prli));
944 els->iparam.els.timeout = timeout_sec;
971 ocs_t *ocs = node->ocs;
979 ocs_log_err(ocs,
"IO alloc failed\n");
981 els->els_timeout_sec = timeout_sec;
982 els->els_retries_remaining = retries;
983 els->els_callback = cb;
984 els->els_callback_arg = cbarg;
985 els->display_name =
"prlo";
988 prlo = els->els_req.virt;
990 ocs_memset(prlo, 0,
sizeof(*prlo));
998 els->iparam.els.timeout = timeout_sec;
1038 ocs_log_err(ocs,
"IO alloc failed\n");
1040 els->els_timeout_sec = timeout_sec;
1041 els->els_retries_remaining = retries;
1042 els->els_callback = cb;
1043 els->els_callback_arg = cbarg;
1044 els->display_name =
"logo";
1048 logo = els->els_req.virt;
1050 ocs_memset(logo, 0,
sizeof(*logo));
1058 els->iparam.els.timeout = timeout_sec;
1088 ocs_sport_t *sport = node->sport;
1098 ocs_log_err(ocs,
"IO alloc failed\n");
1100 els->els_timeout_sec = timeout_sec;
1101 els->els_retries_remaining = retries;
1102 els->els_callback = cb;
1103 els->els_callback_arg = cbarg;
1104 els->display_name =
"adisc";
1108 adisc = els->els_req.virt;
1110 ocs_memset(adisc, 0,
sizeof(*adisc));
1120 els->iparam.els.timeout = timeout_sec;
1147 ocs_t *ocs = node->ocs;
1154 ocs_log_err(ocs,
"IO alloc failed\n");
1156 els->els_timeout_sec = timeout_sec;
1157 els->els_retries_remaining = retries;
1158 els->els_callback = cb;
1159 els->els_callback_arg = cbarg;
1160 els->display_name =
"pdisc";
1162 pdisc = els->els_req.virt;
1164 ocs_memcpy(pdisc, node->sport->service_params,
sizeof(*pdisc));
1173 els->iparam.els.timeout = timeout_sec;
1200 ocs_t *ocs = node->ocs;
1207 ocs_log_err(ocs,
"IO alloc failed\n");
1209 els->els_timeout_sec = timeout_sec;
1210 els->els_retries_remaining = retries;
1211 els->els_callback = cb;
1212 els->els_callback_arg = cbarg;
1213 els->display_name =
"scr";
1215 req = els->els_req.virt;
1217 ocs_memset(req, 0,
sizeof(*req));
1222 els->iparam.els.timeout = timeout_sec;
1249 ocs_t *ocs = node->ocs;
1256 ocs_log_err(ocs,
"IO alloc failed\n");
1258 els->els_timeout_sec = timeout_sec;
1259 els->els_retries_remaining = retries;
1260 els->els_callback = cb;
1261 els->els_callback_arg = cbarg;
1262 els->display_name =
"scr";
1264 req = els->els_req.virt;
1266 ocs_memset(req, 0,
sizeof(*req));
1271 els->iparam.els.timeout = timeout_sec;
1296 void *port_ids, uint32_t port_ids_count,
els_cb_t cb,
void *cbarg)
1299 ocs_t *ocs = node->ocs;
1308 ocs_log_err(ocs,
"IO alloc failed\n");
1310 els->els_timeout_sec = timeout_sec;
1311 els->els_retries_remaining = retries;
1312 els->els_callback = cb;
1313 els->els_callback_arg = cbarg;
1314 els->display_name =
"rscn";
1316 req = els->els_req.virt;
1324 els->iparam.els.timeout = timeout_sec;
1353 ocs_send_ls_rjt(ocs_io_t *io, uint32_t ox_id, uint32_t reason_code, uint32_t reason_code_expl,
1354 uint32_t vendor_unique,
els_cb_t cb,
void *cbarg)
1356 ocs_node_t *node = io->node;
1358 ocs_t *ocs = node->ocs;
1363 io->els_callback = cb;
1364 io->els_callback_arg = cbarg;
1365 io->display_name =
"ls_rjt";
1366 io->init_task_tag = ox_id;
1368 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1369 io->iparam.els.ox_id = ox_id;
1371 rjt = io->els_req.virt;
1372 ocs_memset(rjt, 0,
sizeof(*rjt));
1405 ocs_node_t *node = io->node;
1407 uint32_t suppress_rsp;
1408 ocs_t *ocs = node->ocs;
1414 io->els_callback = cb;
1415 io->els_callback_arg = cbarg;
1416 io->display_name =
"plog_acc";
1417 io->init_task_tag = ox_id;
1419 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1420 io->iparam.els.ox_id = ox_id;
1422 plogi = io->els_req.virt;
1425 ocs_memcpy(plogi, node->sport->service_params,
sizeof(*plogi));
1430 if (suppress_rsp && node->suppress_rsp) {
1444 node->suppress_rsp =
false;
1468 ocs_log_info(ocs,
"ELS PLOGI (0x%x) ACK sent %s; OX_ID: %04x, D_ID: %06x, WWPN: %016" PRIX64
"\n",
1493 ocs_node_t *node = io->node;
1495 ocs_t *ocs = node->ocs;
1500 io->els_callback = cb;
1501 io->els_callback_arg = cbarg;
1502 io->display_name =
"flogi_p2p_acc";
1503 io->init_task_tag = ox_id;
1505 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1506 io->iparam.els_sid.ox_id = ox_id;
1507 io->iparam.els_sid.s_id = s_id;
1509 flogi = io->els_req.virt;
1512 ocs_memcpy(flogi, node->sport->service_params,
sizeof(*flogi));
1536 ocs_node_t *node = io->node;
1538 ocs_t *ocs = node->ocs;
1543 io->els_callback = cb;
1544 io->els_callback_arg = cbarg;
1545 io->display_name =
"flogi_acc";
1546 io->init_task_tag = ox_id;
1548 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1549 io->iparam.els_sid.ox_id = ox_id;
1550 io->iparam.els_sid.s_id = io->node->sport->fc_id;
1552 flogi = io->els_req.virt;
1555 ocs_memcpy(flogi, node->sport->service_params,
sizeof(*flogi));
1585 static inline int32_t
1588 return node->first_burst;
1594 ocs_node_t *node = io->node;
1596 ocs_t *ocs = node->ocs;
1599 prli = io->els_req.virt;
1600 ocs_memset(prli, 0,
sizeof(*prli));
1617 ocs_log_info(ocs,
"ELS NVMe PRLI (0x%x) ACK sent %s; OX_ID: %04x, D_ID: %06x, WWPN: %016" PRIX64
"\n",
1627 ocs_node_t *node = io->node;
1629 int32_t first_burst = 0;
1630 ocs_t *ocs = node->ocs;
1633 prli = io->els_req.virt;
1639 #if defined(OCS_ENABLE_FIRST_BURST)
1645 ocs_log_info(ocs,
"Target negotiated first burst\n");
1661 ocs_log_info(ocs,
"ELS FCP PRLI (0x%x) ACK sent %s; OX_ID: %04x, D_ID: %06x, WWPN: %016" PRIX64
"\n",
1688 ocs_node_t *node = io->node;
1689 ocs_t *ocs = node->ocs;
1693 io->els_callback = cb;
1694 io->els_callback_arg = cbarg;
1695 io->display_name =
"prli_acc";
1696 io->init_task_tag = ox_id;
1698 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1699 io->iparam.els.ox_id = ox_id;
1707 ocs_log_err(ocs,
"prli response failed, invalid protocol type (%#x)\n", fc_type);
1733 ocs_node_t *node = io->node;
1735 ocs_t *ocs = node->ocs;
1740 io->els_callback = cb;
1741 io->els_callback_arg = cbarg;
1742 io->display_name =
"prlo_acc";
1743 io->init_task_tag = ox_id;
1745 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1746 io->iparam.els.ox_id = ox_id;
1748 prlo_acc = io->els_req.virt;
1749 ocs_memset(prlo_acc, 0,
sizeof(*prlo_acc));
1789 ocs_node_t *node = io->node;
1791 ocs_t *ocs = node->ocs;
1796 io->els_callback = cb;
1797 io->els_callback_arg = cbarg;
1798 io->display_name =
"ls_acc";
1799 io->init_task_tag = ox_id;
1801 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1802 io->iparam.els.ox_id = ox_id;
1804 acc = io->els_req.virt;
1805 ocs_memset(acc, 0,
sizeof(*acc));
1836 ocs_node_t *node = io->node;
1838 ocs_t *ocs = node->ocs;
1843 io->els_callback = cb;
1844 io->els_callback_arg = cbarg;
1845 io->display_name =
"logo_acc";
1846 io->init_task_tag = ox_id;
1848 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1849 io->iparam.els.ox_id = ox_id;
1851 logo = io->els_req.virt;
1852 ocs_memset(logo, 0,
sizeof(*logo));
1885 ocs_node_t *node = io->node;
1897 io->els_callback = cb;
1898 io->els_callback_arg = cbarg;
1899 io->display_name =
"adisc_acc";
1900 io->init_task_tag = ox_id;
1903 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
1904 io->iparam.els.ox_id = ox_id;
1907 adisc = io->els_req.virt;
1946 ocs_t *ocs = node->ocs;
1953 ocs_log_err(ocs,
"IO alloc failed\n");
1958 els->iparam.fc_ct.df_ctl = 0;
1959 els->iparam.fc_ct.timeout = timeout_sec;
1961 els->els_callback = cb;
1962 els->els_callback_arg = cbarg;
1963 els->display_name =
"rftid";
1965 rftid = els->els_req.virt;
1967 ocs_memset(rftid, 0,
sizeof(*rftid));
1972 rftid->
port_id = ocs_htobe32(node->rnode.sport->fc_id);
1974 if (ocs->enable_nvme_tgt) {
1978 if (node->sport->enable_ini || node->sport->enable_tgt) {
2009 ocs_t *ocs = node->ocs;
2016 ocs_log_err(ocs,
"IO alloc failed\n");
2021 els->iparam.fc_ct.df_ctl = 0;
2022 els->iparam.fc_ct.timeout = timeout_sec;
2024 els->els_callback = cb;
2025 els->els_callback_arg = cbarg;
2026 els->display_name =
"rffid";
2028 rffid = els->els_req.virt;
2030 ocs_memset(rffid, 0,
sizeof(*rffid));
2035 rffid->
port_id = ocs_htobe32(node->rnode.sport->fc_id);
2038 if (ocs->enable_nvme_tgt) {
2044 if (node->sport->enable_ini) {
2047 if (node->sport->enable_tgt) {
2080 ocs_t *ocs = node->ocs;
2087 ocs_log_err(ocs,
"%s: IO alloc failed\n", __func__);
2092 els->iparam.fc_ct.df_ctl = 0;
2093 els->iparam.fc_ct.timeout = timeout_sec;
2095 els->els_callback = cb;
2096 els->els_callback_arg = cbarg;
2097 els->display_name =
"gidpt";
2099 gidpt = els->els_req.virt;
2101 ocs_memset(gidpt, 0,
sizeof(*gidpt));
2119 uint32_t timeout_sec, uint32_t retries,
2123 ocs_t *ocs = node->ocs;
2125 uint32_t total_size;
2130 if (rx_buf == NULL) {
2131 ocs_log_err(ocs,
"failed to allocate RX buff data\n");
2137 ocs_log_err(ocs,
"%s: IO alloc failed\n", __func__);
2142 els->iparam.fc_ct.df_ctl = 0;
2143 els->iparam.fc_ct.timeout = timeout_sec;
2145 els->els_callback = cb;
2146 els->els_callback_arg = cbarg;
2147 els->els_retries_remaining = retries;
2148 els->display_name =
"loopback_frame";
2150 ptr = els->els_req.virt;
2153 els->loopback_evt_data.is_loopback_frame = 1;
2154 els->loopback_evt_data.loopback_rx_data = rx_buf;
2155 els->loopback_evt_data.loopback_rx_data_len = rx_buf_size;
2156 ocs_sem_init(&els->loopback_evt_data.wait_io_sem, 0,
"loopback_frame_sem");
2158 ocs_memset(fcct_header, 0,
sizeof(*fcct_header));
2161 ocs_memcpy(ptr, buf, size);
2165 ocs_ref_get(&els->ref);
2188 els_cb_t cb,
void *cbarg, uint32_t port_id)
2191 ocs_t *ocs = node->ocs;
2198 ocs_log_err(ocs,
"%s: IO alloc failed\n", __func__);
2203 els->iparam.fc_ct.df_ctl = 0;
2204 els->iparam.fc_ct.timeout = timeout_sec;
2206 els->els_callback = cb;
2207 els->els_callback_arg = cbarg;
2208 els->display_name =
"ganxt";
2210 ganxt = els->els_req.virt;
2212 ocs_memset(ganxt, 0,
sizeof(*ganxt));
2250 ocs_t *ocs = node->ocs;
2258 ocs_log_err(ocs,
"IO alloc failed\n");
2260 uint32_t index = 0, size = 0;
2261 uint32_t num_port_entries = 0, mask = 0;
2267 els->iparam.fc_ct.df_ctl = 0;
2268 els->iparam.fc_ct.timeout = timeout_sec;
2270 els->els_callback = cb;
2271 els->els_callback_arg = cbarg;
2272 els->display_name =
"rhba";
2273 els->els_retries_remaining = retries;
2277 ocs_memset(rhba, 0,
sizeof(*rhba));
2281 size +=
sizeof(rhba->
hdr);
2284 memcpy(&rhba->
hba_identifier, &node->sport->sli_wwpn,
sizeof(node->sport->sli_wwpn));
2286 num_port_entries = 1;
2288 memcpy(&rhba->
port_list.
port_entry[0], &node->sport->sli_wwpn,
sizeof(node->sport->sli_wwpn));
2289 size +=
sizeof(rhba->
port_list) + num_port_entries *
sizeof(node->sport->sli_wwpn);
2296 mask = node->sport->fdmi_hba_mask;
2298 while (func && mask) {
2333 uint32_t retries,
els_cb_t cb,
void *cbarg)
2336 ocs_t *ocs = node->ocs;
2343 ocs_log_err(ocs,
"IO alloc failed\n");
2347 els->iparam.fc_ct.df_ctl = 0;
2348 els->iparam.fc_ct.timeout = timeout_sec;
2350 els->els_callback = cb;
2351 els->els_callback_arg = cbarg;
2353 els->display_name =
"dereg_cmd";
2354 els->els_retries_remaining = retries;
2358 ocs_memset(dereg_req, 0,
sizeof(*dereg_req));
2363 dereg_req->
identifier = node->sport->sli_wwpn;
2389 uint32_t retries,
els_cb_t cb,
void *cbarg)
2392 ocs_t *ocs = node->ocs;
2399 ocs_log_err(ocs,
"IO alloc failed\n");
2401 uint32_t index = 0, size = 0, mask;
2406 els->iparam.fc_ct.df_ctl = 0;
2407 els->iparam.fc_ct.timeout = timeout_sec;
2409 els->els_callback = cb;
2410 els->els_callback_arg = cbarg;
2411 els->els_retries_remaining = retries;
2415 els->display_name =
"rprt";
2417 ocs_memset(rprt, 0,
sizeof(*rprt));
2421 size +=
sizeof(rprt->
hdr);
2424 sizeof(ocs->domain->sport->sli_wwpn));
2425 size +=
sizeof(ocs->domain->sport->sli_wwpn);
2428 memcpy(&rprt->
port_name, &node->sport->sli_wwpn,
2429 sizeof(node->sport->sli_wwpn));
2430 size +=
sizeof(node->sport->sli_wwpn);
2435 els->display_name =
"rpa";
2437 ocs_memset(rpa, 0,
sizeof(*rpa));
2440 size +=
sizeof(rpa->
hdr);
2442 memcpy(&rpa->
port_name[0], &node->sport->sli_wwpn,
2443 sizeof(node->sport->sli_wwpn));
2444 size +=
sizeof(node->sport->sli_wwpn);
2454 mask = node->sport->fdmi_port_mask;
2456 while (func && mask) {
2458 ((uint8_t *)els->els_req.virt + size));
2497 ocs_t *ocs = node->ocs;
2504 ocs_log_err(ocs,
"ELS IO alloc failed\n");
2508 els->iparam.fc_ct.df_ctl = 0;
2509 els->iparam.fc_ct.timeout = timeout_sec;
2511 els->els_callback = cb;
2512 els->els_callback_arg = cbarg;
2513 els->els_retries_remaining = retries;
2524 els->display_name =
"grhl";
2529 els->display_name =
"grpl";
2536 els->display_name =
"ghat";
2543 els->display_name =
"gpat";
2548 ocs_log_err(ocs,
"Unhandled FDMI cmd code: 0x%x\n", req_info->
cmd_code);
2549 ocs_ref_put(&els->ref);
2575 uint16_t ox_id = ocs_be16toh(hdr->
ox_id);
2576 uint16_t rx_id = ocs_be16toh(hdr->
rx_id);
2601 ocs_node_t *node = io->node;
2610 if (node->rnode.sport->fc_id == s_id) {
2621 io->display_name =
"ba_acc";
2623 io->init_task_tag = ox_id;
2626 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
2627 io->iparam.bls_sid.s_id = s_id;
2628 io->iparam.bls_sid.ox_id = ox_id;
2629 io->iparam.bls_sid.rx_id = rx_id;
2631 acc = (
void *)io->iparam.bls_sid.payload;
2633 ocs_memset(io->iparam.bls_sid.payload, 0,
sizeof(io->iparam.bls_sid.payload));
2634 acc->
ox_id = io->iparam.bls_sid.ox_id;
2635 acc->
rx_id = io->iparam.bls_sid.rx_id;
2639 ocs_log_err(ocs,
"ocs_scsi_io_dispatch() failed: %d\n", rc);
2663 ocs_bls_send_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status,
void *app)
2687 uint16_t ox_id = ocs_be16toh(hdr->
ox_id);
2688 uint16_t rx_id = ocs_be16toh(hdr->
rx_id);
2711 ocs_node_t *node = io->node;
2720 if (node->rnode.sport->fc_id == s_id) {
2731 io->display_name =
"ba_rjt";
2733 io->init_task_tag = ox_id;
2736 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
2737 io->iparam.bls.ox_id = ox_id;
2738 io->iparam.bls.rx_id = rx_id;
2740 acc = (
void *)io->iparam.bls.payload;
2742 ocs_memset(io->iparam.bls.payload, 0,
sizeof(io->iparam.bls.payload));
2747 ocs_log_err(ocs,
"%s: ocs_scsi_io_dispatch() failed: %d\n", __func__, rc);
2771 int32_t status, uint32_t ext_status,
void *app)
2799 ocs_els_abort_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status,
void *app)
2802 ocs_io_t *abort_io = NULL;
2807 els = abort_io->io_to_abort;
2811 ocs = els->node->ocs;
2814 ocs_log_warn(ocs,
"status x%x ext x%x\n", status, ext_status);
2826 ocs_ref_put(&els->ref);
2856 ocs_io_t *abort_io = NULL;
2862 ocs = els->node->ocs;
2867 if ((ocs_ref_get_unless_zero(&els->ref) == 0)) {
2869 ocs_log_debug(ocs,
"els no longer active\n");
2875 if (abort_io == NULL) {
2876 ocs_atomic_add_return(&xport->io_alloc_failed_count, 1);
2881 abort_io->ocs = ocs;
2882 abort_io->node = els->node;
2883 abort_io->cmd_ini = TRUE;
2887 abort_io->display_name =
"abort_els";
2888 abort_io->io_to_abort = els;
2889 abort_io->send_abts = send_abts;
2893 ocs_log_err(ocs,
"ocs_scsi_io_dispatch failed: %d\n", rc);
2900 if (abort_io == NULL) {
2901 ocs_ref_put(&els->ref);
2911 #define std_els_state_decl(...) \
2912 ocs_io_t *els = NULL; \
2913 ocs_node_t *node = NULL; \
2914 ocs_t *ocs = NULL; \
2915 ocs_assert(ctx != NULL, NULL); \
2917 ocs_assert(els != NULL, NULL); \
2919 ocs_assert(node != NULL, NULL); \
2921 ocs_assert(ocs != NULL, NULL);
2923 #define els_sm_trace(...) \
2925 if (OCS_LOG_ENABLE_ELS_TRACE(ocs)) \
2926 ocs_log_info(ocs, "[%s] %-8s %-20s %-20s\n", node->display_name, els->display_name, \
2927 __func__, ocs_sm_event_name(evt)); \
2958 if (els->els_callback) {
2959 (*els->els_callback)(els->node, arg, els->els_callback_arg);
2961 els->els_req_free = 1;
2994 ocs_log_warn(els->node->ocs,
"[%s] %-20s %-20s not handled - terminating ELS\n", node->display_name, funcname,
2999 ocs_log_warn(els->node->ocs,
"[%s] %-20s %-20s not handled\n", node->display_name, funcname,
3032 ocs_node_cb_t cbdata;
3033 cbdata.status = cbdata.ext_status = (~0);
3035 ocs_log_err(ocs,
"ocs_els_send failed: %d\n", rc);
3084 els_io_printf(els,
"Timed out, retry (%d tries remaining)\n",
3085 els->els_retries_remaining-1);
3091 ocs_node_cb_t *cbdata = arg;
3092 uint8_t reason_code = (cbdata->ext_status >> 16) & 0xFF;
3093 uint8_t reason_code_expl = (cbdata->ext_status >> 8) & 0xFF;
3097 switch (reason_code) {
3099 els->node->els_req_cnt--;
3100 els_io_printf(els,
"LS_RJT Logical Busy response, delay and retry\n");
3117 els_io_printf(els,
"BBCR disabled until the next link toggle\n");
3131 els->els_retries_remaining = 0;
3134 ocs_log_err(ocs,
"ocs_els_send failed\n");
3178 ocs_node_cb_t node_cbdata;
3179 node_cbdata.status = node_cbdata.ext_status = (~0);
3180 node_cbdata.els = els;
3181 if (els->els_retries_remaining && --els->els_retries_remaining) {
3195 els->node->els_req_cnt--;
3198 ocs_log_err(ocs,
"ocs_els_send failed: %d\n", rc);
3239 ocs_mod_timer(&els->delay_timer, 1);
3243 node->els_req_cnt++;
3281 if (els->hio != NULL) {
3362 ocs_node_cb_t cbdata;
3363 cbdata.status = cbdata.ext_status = 0;
3490 ocs_lock(&node->active_ios_lock);
3492 ocs_unlock(&node->active_ios_lock);
3511 ocs_ct_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status,
void *arg)
3548 io->display_name =
"ct response";
3549 io->init_task_tag = ox_id;
3550 io->wire_len +=
sizeof(*rsp);
3552 ocs_memset(&io->iparam, 0,
sizeof(io->iparam));
3556 io->iparam.fc_ct_rsp.ox_id = ocs_htobe16(ox_id);
3557 io->iparam.fc_ct_rsp.r_ctl = 3;
3559 io->iparam.fc_ct_rsp.df_ctl = 0;
3560 io->iparam.fc_ct_rsp.timeout = 5;
3582 ocs_io_t *els = arg;
3583 ocs_node_t *node = els->node;
#define FC_GS_NAMESERVER_GA_NXT
ocs_io_t * ocs_fdmi_send_rhba(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RHBA CT request.
ocs_io_t * ocs_send_scr(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send an SCR ELS command.
#define std_els_state_decl(...)
int32_t ocs_hal_io_free(ocs_hal_t *hal, ocs_hal_io_t *io)
Free a previously-allocated HAL IO object.
int ocs_fdmi_port_attr_fabric_wwpn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_port_attr_active_fc4type(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_hba_attr_num_ports(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define MAX_FDMI_ATTRIBUTE_SIZE
static void ocs_io_transition(ocs_io_t *els, ocs_sm_function_t state, void *data)
ELS state machine transition wrapper.
ocs_io_t * ocs_send_pdisc(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a PDISC ELS command.
int ocs_fdmi_hba_attr_bios_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_hba_attr_model(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define FC_GS_NAMESERVER_RFT_ID
ocs_io_t * ocs_els_io_alloc(ocs_node_t *node, uint32_t reqlen, ocs_els_role_e role)
Allocate an IO structure for an ELS IO context.
void * __ocs_els_init(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Initial ELS IO state.
#define FC_PRLI_ACC_NVME_PAGE_LENGTH
static int32_t ocs_list_empty(ocs_list_t *list)
Test if a list is empty.
static void ocs_els_make_active(ocs_io_t *els)
Make ELS IO active.
void * __ocs_els_aborting_wait_abort_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for the ELS IO abort request to complete.
#define FC_REASON_LOGICAL_BUSY
#define FC4_FEATURE_TARGET
void * __ocs_els_aborting_wait_req_cmpl(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for the ELS IO abort request to complete.
static int32_t ocs_bls_send_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *app)
Handle the BLS accept completion.
static ocs_io_t * ocs_send_fcp_prli_acc(ocs_io_t *io)
int32_t ocs_scsi_io_dispatch_abort(ocs_io_t *io, void *cb)
Attempt to dispatch an Abort IO.
void ocs_ddump_els(ocs_textbuf_t *textbuf, ocs_io_t *els)
Generate ELS context ddump data.
int ocs_fdmi_port_attr_class(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define FC_GS_TYPE_MANAGEMENT_SERVICE
int(* ocs_fdmi_port_action[])(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define FC_PRLI_TARGET_FUNCTION
#define SLI4_FC_WCQE_STATUS_LOCAL_REJECT
static int32_t ocs_els_req_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *arg)
Handle ELS IO request completions.
#define FC_GS_NAMESERVER_GID_PT
#define FC_GS_TYPE_WORD(type)
int ocs_fdmi_hba_attr_fmw_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void * __ocs_els_common(const char *funcname, ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Common event handler for the ELS IO state machine.
void ocs_node_post_event(ocs_node_t *node, ocs_sm_event_t evt, void *arg)
Post event to node state machine context.
static int32_t ocs_bls_send_rjt_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *app)
Handle the BLS reject completion.
ocs_io_t * ocs_send_plogi_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a PLOGI accept response.
#define OCS_ELS_FDMI_RSP_LEN
#define FC_GS_SUBTYPE_FDMI
ocs_io_t * ocs_send_prli(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a PRLI ELS command.
ocs_io_t * ocs_ns_send_rftid(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RFTID CT request.
ocs_io_t * ocs_send_ls_rjt(ocs_io_t *io, uint32_t ox_id, uint32_t reason_code, uint32_t reason_code_expl, uint32_t vendor_unique, els_cb_t cb, void *cbarg)
Send an LS_RJT ELS response.
int ocs_fdmi_port_attr_nportid(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void ocs_els_post_event(ocs_io_t *els, ocs_sm_event_t evt, void *data)
ELS state machine post event wrapper.
int32_t ocs_scsi_io_dispatch(ocs_io_t *io, void *cb)
Attempt to dispatch a non-abort IO.
#define FC4_FEATURE_INITIATOR
#define SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED
int ocs_fdmi_port_attr_wwpn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_send_prli_acc(ocs_io_t *io, uint32_t ox_id, uint8_t fc_type, els_cb_t cb, void *cbarg)
Send a PRLI accept response.
int ocs_fdmi_port_attr_os_devname(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static int32_t ocs_els_send(ocs_io_t *els, uint32_t reqlen, uint32_t timeout_sec, ocs_hal_srrs_cb_t cb)
Send the ELS command.
ocs_io_t * ocs_send_plogi(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, void(*cb)(ocs_node_t *node, ocs_node_cb_t *cbdata, void *arg), void *cbarg)
Format and send a PLOGI ELS command.
static uint32_t fc_htobe24(uint32_t x)
static ocs_io_t * ocs_bls_send_acc(ocs_io_t *io, uint32_t s_id, uint16_t ox_id, uint16_t rx_id)
Send a BLS BA_ACC response.
ocs_io_t * ocs_bls_send_rjt_hdr(ocs_io_t *io, fc_header_t *hdr)
Send a BA_RJT given the request's FC heade.
void ocs_display_sparams(const char *prelabel, const char *reqlabel, int dest, void *textbuf, void *sparams)
Display service parameters.
int ocs_fdmi_hba_attr_bios_state(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_port_attr_max_frame(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void ocs_ddump_section(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section start data.
void ocs_scsi_io_free(ocs_io_t *io)
Free a SCSI IO context.
int32_t ocs_els_io_list_empty(ocs_node_t *node, ocs_list_t *list)
return TRUE if given ELS list is empty (while taking proper locks)
ocs_io_t * ocs_fdmi_send_dereg_cmd(ocs_node_t *node, uint16_t dereg_code, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a FDMI dereg CT request.
void ocs_els_io_free(ocs_io_t *els)
Free IO structure for an ELS IO context.
#define FC_GS_NAMESERVER_RFF_ID
static int32_t ocs_node_first_burst_enabled(ocs_node_t *node)
static int32_t ocs_node_lock_try(ocs_node_t *node)
ocs_io_t * ocs_els_io_alloc_size(ocs_node_t *node, uint32_t reqlen, uint32_t rsplen, ocs_els_role_e role)
Allocate an IO structure for an ELS IO context.
#define SLI4_FC_WCQE_STATUS_SUCCESS
FC/FCoE Completion Status Codes.
static int32_t ocs_els_abort_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *app)
ELS abort callback.
static void * ocs_list_remove(ocs_list_t *list, void *item)
Remove an item from the list.
static void ocs_els_delay_timer_cb(void *arg)
Handle delay retry timeout.
int(* ocs_fdmi_hba_action[])(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_fdmi_send_get_cmd(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg, ocs_fdmi_get_cmd_req_info_t *req_info)
Send a GHRL CT request.
#define SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT
const char * ocs_sm_event_name(ocs_sm_event_t evt)
void * __ocs_els_retry(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for the ELS IO abort request to complete, and retry the ELS.
#define FC_PLOGI_CSP_W1_VALID_VENDOR_VER_LEVEL
int ocs_fdmi_hba_attr_ct_len(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void(* els_cb_t)(ocs_node_t *node, ocs_node_cb_t *cbdata, void *arg)
void * __ocs_els_wait_resp(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for the ELS request to complete.
static ocs_io_t * ocs_bls_send_rjt(ocs_io_t *io, uint32_t s_id, uint16_t ox_id, uint16_t rx_id)
Send a BLS BA_RJT response.
void * __ocs_els_aborting(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for the ELS IO abort request to complete.
uint32_t fc4_feature_bits
#define FC_PRLI_NVME_DISC_FUNCTION
void *(* ocs_sm_function_t)(ocs_sm_ctx_t *, ocs_sm_event_t, void *)
#define FC_ELX_LOOPBACK_DATA
fc_rscn_affected_port_id_page_t port_list[1]
int ocs_fdmi_hba_attr_symbolic_name(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define OCS_ELS_GID_PT_RSP_LEN
int ocs_fdmi_hba_attr_rom_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_hba_attr_drvr_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_ns_send_gidpt(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a GIDPT CT request.
int ocs_fdmi_hba_attr_fabric_wwnn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_hal_rtn_e ocs_hal_get(ocs_hal_t *hal, ocs_hal_property_e prop, uint32_t *value)
void ocs_els_io_cleanup(ocs_io_t *els, ocs_sm_event_t node_evt, void *arg)
Cleanup an ELS IO.
#define FC_PRLI_WRITE_XRDY_DISABLED
ocs_io_t * ocs_send_rscn(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, void *port_ids, uint32_t port_ids_count, els_cb_t cb, void *cbarg)
Send an RSCN ELS command.
#define FC_PRLI_ESTABLISH_IMAGE_PAIR
#define els_sm_trace(...)
fcct_fdmi_reg_port_list_t port_list
int ocs_fdmi_hba_attr_vendor_info(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static void fcct_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint8_t type, uint8_t gs_subtype, uint16_t max_size)
static ocs_io_t * ocs_send_nvme_prli_acc(ocs_io_t *io)
#define FC_REASON_UNABLE_TO_PERFORM
ocs_io_t * ocs_send_ls_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a generic LS_ACC response without a payload.
ocs_io_t * ocs_ns_send_rffid(ocs_node_t *node, uint8_t fc_type, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RFFID CT request.
void ocs_sm_transition(ocs_sm_ctx_t *ctx, ocs_sm_function_t state, void *data)
Transition to a new state.
uint32_t class3_service_parameters[4]
ocs_io_t * ocs_fdmi_send_reg_port(ocs_node_t *node, int req_code, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a RPRT/RPA CT request.
static void ocs_sport_lock(ocs_sport_t *sport)
#define OCS_ELS_FDMI_REG_LEN
#define FC_PRLI_READ_XRDY_DISABLED
void ocs_ddump_endsection(ocs_textbuf_t *textbuf, const char *name, uint32_t instance)
Generate driver dump section end data.
int32_t ocs_send_ct_rsp(ocs_io_t *io, uint32_t ox_id, fcct_iu_header_t *ct_hdr, uint32_t cmd_rsp_code, uint32_t reason_code, uint32_t reason_code_explanation)
Send CT response.
void * __ocs_els_aborted_delay_retry(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for a retry timer to expire having received an abort request.
uint32_t class2_service_parameters[4]
static int32_t ocs_els_send_rsp(ocs_io_t *els, uint32_t rsplen)
Send the ELS response.
static void fcct_loopback_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint16_t max_size)
#define FC_REASON_LOGICAL_ERROR
int ocs_fdmi_hba_attr_wwnn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_sm_post_event(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *data)
Post an event to a context.
ocs_io_t * ocs_send_rrq(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send an RRQ ELS command.
static void ocs_node_lock(ocs_node_t *node)
static void ocs_list_add_tail(ocs_list_t *list, void *item)
Add an item to the tail of the list.
ocs_io_t * ocs_send_flogi_acc(ocs_io_t *io, uint32_t ox_id, uint32_t is_fport, els_cb_t cb, void *cbarg)
int ocs_fdmi_port_attr_host_name(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define SLI4_FC_WCQE_STATUS_LS_RJT
#define els_io_printf(els, fmt,...)
#define FC_GS_TYPE_BIT(type)
#define FC_PLOGI_CSP_W1_BBSCN_CLEAR_MASK
static int32_t ocs_ct_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *arg)
Handle CT send response completion.
static int32_t ocs_els_acc_cb(ocs_hal_io_t *hio, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *arg)
Handle ELS IO accept/response completions.
#define OCS_FC_ELS_DEFAULT_RETRIES
uint32_t class4_service_parameters[4]
ocs_io_t * ocs_ns_send_loopback_frame(ocs_node_t *node, void *buf, uint32_t size, void *rx_buf, uint32_t rx_buf_size, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
uint32_t vendor_version_level[4]
int ocs_fdmi_port_attr_speed(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void ocs_ddump_io(ocs_textbuf_t *textbuf, ocs_io_t *io)
Generate IO context ddump data.
int ocs_fdmi_hba_attr_sn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
void ocs_scsi_check_pending(ocs_t *ocs)
Check for pending IOs to dispatch.
static bool ocs_bbcr_enabled(ocs_t *ocs)
ocs_io_t * ocs_send_adisc_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send an ADISC accept response.
ocs_io_t * ocs_bls_send_acc_hdr(ocs_io_t *io, fc_header_t *hdr)
Send a BA_ACC given the request's FC header.
#define FC4_FEATURE_NVME_DISC
int ocs_fdmi_hba_attr_description(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_send_adisc(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send an ADISC ELS command.
#define FC_PRLI_REQUEST_EXECUTED
void * __ocs_els_delay_retry(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *arg)
Wait for a retry timer to expire.
ocs_io_t * ocs_send_prlo_acc(ocs_io_t *io, uint32_t ox_id, uint8_t fc_type, els_cb_t cb, void *cbarg)
Send a PRLO accept response.
#define FC_GS_SUBTYPE_NAME_SERVER
int ocs_fdmi_port_attr_wwnn(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
#define FC_PRLO_REQUEST_EXECUTED
int ocs_fdmi_hba_attr_os_ver(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static ocs_io_t * ocs_els_abort_io(ocs_io_t *els, int send_abts)
Abort an ELS IO.
ocs_io_t * ocs_send_fdisc(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Format and send a FDISC ELS command.
static void _ocs_els_io_free(void *arg)
Free IO structure for an ELS IO context.
int ocs_fdmi_hba_attr_vendor_id(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_send_flogi(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Format and send a FLOGI ELS command.
#define ocs_assert(cond,...)
ocs_io_t * ocs_send_prlo(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a PRLO ELS command.
int ocs_fdmi_port_attr_fc4type(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
static void ocs_io_free(ocs_t *ocs, ocs_io_t *io)
#define FC_PRLI_ACC_FCP_PAGE_LENGTH
static uint32_t fc_be24toh(uint32_t x)
int ocs_fdmi_port_attr_support_speed(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_port_attr_symbolic_name(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
ocs_io_t * ocs_send_logo(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg)
Send a LOGO ELS command.
ocs_io_t * ocs_ns_send_ganxt(ocs_node_t *node, uint32_t timeout_sec, uint32_t retries, els_cb_t cb, void *cbarg, uint32_t port_id)
Send a GA_NEXT CT request.
#define FC_EXPL_NO_ADDITIONAL
#define OCS_FC_PLOGI_VENDOR_VERSION_EMLX_ID
uint32_t class1_service_parameters[4]
int32_t(* ocs_hal_srrs_cb_t)(ocs_hal_io_t *io, ocs_remote_node_t *rnode, uint32_t length, int32_t status, uint32_t ext_status, void *arg)
ocs_io_t * ocs_send_flogi_p2p_acc(ocs_io_t *io, uint32_t ox_id, uint32_t s_id, els_cb_t cb, void *cbarg)
Send an FLOGI accept response for point-to-point negotiation.
static void ocs_els_abort_cleanup(ocs_io_t *els)
cleanup ELS after abort
static void ocs_node_unlock(ocs_node_t *node)
ocs_io_t * ocs_send_logo_acc(ocs_io_t *io, uint32_t ox_id, els_cb_t cb, void *cbarg)
Send a LOGO accept response.
void ocs_sm_disable(ocs_sm_ctx_t *ctx)
Disable further state machine processing.
static void ocs_sport_unlock(ocs_sport_t *sport)
#define FC_GS_TYPE_DIRECTORY_SERVICE
static ocs_io_t * ocs_io_alloc(ocs_t *ocs)
void ocs_ddump_value(ocs_textbuf_t *textbuf, const char *name, const char *fmt,...)
Generate driver dump data for a given value.
#define FC_PRLI_INITIATOR_FUNCTION
int ocs_fdmi_hba_attr_manufacturer(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
int ocs_fdmi_port_attr_port_type(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)
uint64_t ocs_node_get_wwpn(ocs_node_t *node)
return nodes' WWPN as a uint64_t
uint32_t common_service_parameters[4]
uint32_t reason_explanation
int ocs_fdmi_port_attr_port_state(ocs_sport_t *sport, ocs_fdmi_attr_def_t *ad)