Lines Matching +full:timeout +full:- +full:ulp +full:- +full:ms
1 /*-
33 * @defgroup sli SLI-4 Base APIs
38 * All common (i.e. transport-independent) SLI-4 functions are implemented
48 #define SLI4_BMBX_DELAY_US 1000 /* 1 ms */
49 #define SLI4_INIT_PORT_DELAY_US 10000 /* 10 ms */
113 * Although SLI-4 specification defines a common set of registers, their locations
260 const sli4_reg_t *r = &(regmap[reg][sli->if_type]); in sli_reg_read()
262 if ((UINT32_MAX == r->rset) || (UINT32_MAX == r->off)) { in sli_reg_read()
263 ocs_log_err(sli->os, "regname %d not defined for if_type %d\n", reg, sli->if_type); in sli_reg_read()
267 return ocs_reg_read32(sli->os, r->rset, r->off); in sli_reg_read()
282 const sli4_reg_t *r = &(regmap[reg][sli->if_type]); in sli_reg_write()
284 if ((UINT32_MAX == r->rset) || (UINT32_MAX == r->off)) { in sli_reg_write()
285 ocs_log_err(sli->os, "regname %d not defined for if_type %d\n", reg, sli->if_type); in sli_reg_write()
289 ocs_reg_write32(sli->os, r->rset, r->off, val); in sli_reg_write()
295 * @param val 32-bit SLI_INTF register value.
297 * @return Returns 0 on success, or a non-zero value on failure.
308 * @param val 32-bit SLI_INTF register value.
327 * @param val 32-bit SLI_INTF register value.
340 * @param val 32-bit PCI CLASS_REVISION register value.
353 * @param val 32-bit SLI_ASIC_ID register value
369 * @return Returns 0 if BMBX is ready, or non-zero otherwise (i.e. time out occurred).
379 msec--; in sli_bmbx_wait()
390 * @return Returns 0 if command succeeded, or non-zero otherwise.
398 ocs_dma_sync(&sli4->bmbx, OCS_DMASYNC_PREWRITE); in sli_bmbx_write()
399 val = SLI4_BMBX_WRITE_HI(sli4->bmbx.phys); in sli_bmbx_write()
403 ocs_log_crit(sli4->os, "BMBX WRITE_HI failed\n"); in sli_bmbx_write()
404 return -1; in sli_bmbx_write()
406 val = SLI4_BMBX_WRITE_LO(sli4->bmbx.phys); in sli_bmbx_write()
424 * the one-command-at-a-time nature of the BMBX to be able to
425 * display non-embedded SLI_CONFIG commands. This will not work
426 * for mailbox commands on the MQ. Luckily, all current non-emb
448 if (hdr->command == SLI4_MBOX_COMMAND_SLI_CONFIG) { in sli_dump_bmbx_command()
451 if (sli_config->emb) { in sli_dump_bmbx_command()
455 sli_config_hdr = (sli4_req_hdr_t *)sli_config->payload.embed; in sli_dump_bmbx_command()
456 size = sizeof(*sli_config) - sizeof(sli_config->payload) + in sli_dump_bmbx_command()
457 sli_config_hdr->request_length + (4*sizeof(uint32_t)); in sli_dump_bmbx_command()
458 ocs_dump32(OCS_DEBUG_ENABLE_MQ_DUMP, sli4->os, label, in sli_dump_bmbx_command()
459 (uint8_t *)sli4->bmbx.virt, size); in sli_dump_bmbx_command()
462 ocs_snprintf(label, sizeof(label), "%s (non-emb hdr)", prefix); in sli_dump_bmbx_command()
464 /* if non-embedded, break up into two parts: SLI_CONFIG hdr in sli_dump_bmbx_command()
466 size = sizeof(*sli_config) - sizeof(sli_config->payload) + (12 * sli_config->pmd_count); in sli_dump_bmbx_command()
467 ocs_dump32(OCS_DEBUG_ENABLE_MQ_DUMP, sli4->os, label, in sli_dump_bmbx_command()
468 (uint8_t *)sli4->bmbx.virt, size); in sli_dump_bmbx_command()
471 pmd = &sli_config->payload.mem; in sli_dump_bmbx_command()
472 if ((pmd->address_high == ocs_addr32_hi(sli4->bmbx_non_emb_pmd->phys)) && in sli_dump_bmbx_command()
473 (pmd->address_low == ocs_addr32_lo(sli4->bmbx_non_emb_pmd->phys))) { in sli_dump_bmbx_command()
474 for (i = 0; i < sli_config->pmd_count; i++, pmd++) { in sli_dump_bmbx_command()
475 sli_config_hdr = sli4->bmbx_non_emb_pmd->virt; in sli_dump_bmbx_command()
476 ocs_snprintf(label, sizeof(label), "%s (non-emb pay[%d])", in sli_dump_bmbx_command()
478 ocs_dump32(OCS_DEBUG_ENABLE_MQ_DUMP, sli4->os, label, in sli_dump_bmbx_command()
479 (uint8_t *)sli4->bmbx_non_emb_pmd->virt, in sli_dump_bmbx_command()
480 sli_config_hdr->request_length + (4*sizeof(uint32_t))); in sli_dump_bmbx_command()
483 ocs_log_debug(sli4->os, "pmd addr does not match pmd:%x %x (%x %x)\n", in sli_dump_bmbx_command()
484 pmd->address_high, pmd->address_low, in sli_dump_bmbx_command()
485 ocs_addr32_hi(sli4->bmbx_non_emb_pmd->phys), in sli_dump_bmbx_command()
486 ocs_addr32_lo(sli4->bmbx_non_emb_pmd->phys)); in sli_dump_bmbx_command()
493 ocs_dump32(OCS_DEBUG_ENABLE_MQ_DUMP, sli4->os, prefix, in sli_dump_bmbx_command()
505 * @return Returns 0 on success, or a non-zero value on failure.
510 void *cqe = (uint8_t *)sli4->bmbx.virt + SLI4_BMBX_SIZE; in sli_bmbx_command()
513 sli_dump_bmbx_command(sli4, sli4->bmbx.virt, "bmbx cmd"); in sli_bmbx_command()
517 ocs_log_crit(sli4->os, "Chip is in an error state - Mailbox " in sli_bmbx_command()
522 return -1; in sli_bmbx_command()
526 ocs_log_crit(sli4->os, "bootstrap mailbox write fail phys=%p reg=%#x\n", in sli_bmbx_command()
527 (void*)sli4->bmbx.phys, in sli_bmbx_command()
529 return -1; in sli_bmbx_command()
533 ocs_dma_sync(&sli4->bmbx, OCS_DMASYNC_POSTREAD); in sli_bmbx_command()
534 if (((sli4_mcqe_t *)cqe)->val) { in sli_bmbx_command()
536 sli_dump_bmbx_command(sli4, sli4->bmbx.virt, "bmbx cmpl"); in sli_bmbx_command()
537 ocs_dump32(OCS_DEBUG_ENABLE_CQ_DUMP, sli4->os, "bmbx cqe", cqe, sizeof(sli4_mcqe_t)); in sli_bmbx_command()
541 ocs_log_err(sli4->os, "invalid or wrong type\n"); in sli_bmbx_command()
542 return -1; in sli_bmbx_command()
567 config_link->hdr.command = SLI4_MBOX_COMMAND_CONFIG_LINK; in sli_cmd_config_link()
591 hdr->command = SLI4_MBOX_COMMAND_DOWN_LINK; in sli_cmd_down_link()
616 cmd->hdr.command = SLI4_MBOX_COMMAND_DUMP; in sli_cmd_dump_type4()
617 cmd->type = 4; in sli_cmd_dump_type4()
618 cmd->wki_selection = wki; in sli_cmd_dump_type4()
649 payload_size = dma->size; in sli_cmd_common_read_transceiver_data()
652 if (sli4->port_type == SLI4_PORT_TYPE_FC) { in sli_cmd_common_read_transceiver_data()
659 req = (sli4_req_common_read_transceiver_data_t *)dma->virt; in sli_cmd_common_read_transceiver_data()
660 ocs_memset(req, 0, dma->size); in sli_cmd_common_read_transceiver_data()
663 req->hdr.opcode = SLI4_OPC_COMMON_READ_TRANSCEIVER_DATA; in sli_cmd_common_read_transceiver_data()
664 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_read_transceiver_data()
665 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_read_transceiver_data()
667 req->page_number = page_num; in sli_cmd_common_read_transceiver_data()
668 req->port = sli4->physical_port; in sli_cmd_common_read_transceiver_data()
696 cmd->hdr.command = SLI4_MBOX_COMMAND_READ_LNK_STAT; in sli_cmd_read_link_stats()
697 cmd->rec = req_ext_counters; in sli_cmd_read_link_stats()
698 cmd->clrc = clear_all_counters; in sli_cmd_read_link_stats()
699 cmd->clof = clear_overflow_flags; in sli_cmd_read_link_stats()
722 cmd->hdr.command = SLI4_MBOX_COMMAND_READ_STATUS; in sli_cmd_read_status()
723 cmd->cc = clear_counters; in sli_cmd_read_status()
772 * @return Returns 0 on success, -1 on failure
778 switch (sli4->config.topology) { in sli4_set_link_flags_config_topo()
780 // Attempt P2P but failover to FC-AL in sli4_set_link_flags_config_topo()
781 init_link->link_flags.enable_topology_failover = TRUE; in sli4_set_link_flags_config_topo()
782 init_link->link_flags.topology = SLI4_INIT_LINK_F_P2P_FAIL_OVER; in sli4_set_link_flags_config_topo()
785 init_link->link_flags.topology = SLI4_INIT_LINK_F_FCAL_ONLY; in sli4_set_link_flags_config_topo()
786 return (!sli_fcal_is_speed_supported(init_link->link_speed_selection_code)); in sli4_set_link_flags_config_topo()
789 init_link->link_flags.topology = FC_TOPOLOGY_P2P; in sli4_set_link_flags_config_topo()
792 ocs_log_err(sli4->os, "unsupported topology %#x\n", sli4->config.topology); in sli4_set_link_flags_config_topo()
793 return -1; in sli4_set_link_flags_config_topo()
807 * @return Returns 0 on success, -1 on failure
812 if ((sli4->config.pt == SLI4_INIT_LINK_F_FCAL_ONLY) && in sli4_set_link_flags_persistent_topo()
813 (!sli_fcal_is_speed_supported(init_link->link_speed_selection_code))) in sli4_set_link_flags_persistent_topo()
814 return -1; in sli4_set_link_flags_persistent_topo()
816 init_link->link_flags.enable_topology_failover = sli4->config.tf; in sli4_set_link_flags_persistent_topo()
817 init_link->link_flags.topology = sli4->config.pt; in sli4_set_link_flags_persistent_topo()
842 init_link->hdr.command = SLI4_MBOX_COMMAND_INIT_LINK; in sli_cmd_init_link()
845 if (sli4->config.topology != SLI4_READ_CFG_TOPO_FCOE) { in sli_cmd_init_link()
846 init_link->selective_reset_al_pa = reset_alpa; in sli_cmd_init_link()
847 init_link->link_flags.loopback = FALSE; in sli_cmd_init_link()
849 init_link->link_speed_selection_code = speed; in sli_cmd_init_link()
857 init_link->link_flags.fixed_speed = TRUE; in sli_cmd_init_link()
860 ocs_log_test(sli4->os, "unsupported FC speed %d\n", speed); in sli_cmd_init_link()
864 init_link->link_flags.unfair = FALSE; in sli_cmd_init_link()
865 init_link->link_flags.skip_lirp_lilp = FALSE; in sli_cmd_init_link()
866 init_link->link_flags.gen_loop_validity_check = FALSE; in sli_cmd_init_link()
867 init_link->link_flags.skip_lisa = FALSE; in sli_cmd_init_link()
868 init_link->link_flags.select_hightest_al_pa = FALSE; in sli_cmd_init_link()
871 ocs_log_info(sli4->os, "bring up link with topology: %d, PTV: %d, TF: %d, PT: %d \n", in sli_cmd_init_link()
872 sli4->config.topology, sli4->config.ptv, sli4->config.tf, sli4->config.pt); in sli_cmd_init_link()
873 if (sli4->config.ptv) in sli_cmd_init_link()
892 * @param vpi VPI (Set to -1 if unused.)
904 init_vfi->hdr.command = SLI4_MBOX_COMMAND_INIT_VFI; in sli_cmd_init_vfi()
906 init_vfi->vfi = vfi; in sli_cmd_init_vfi()
907 init_vfi->fcfi = fcfi; in sli_cmd_init_vfi()
914 init_vfi->vp = TRUE; in sli_cmd_init_vfi()
915 init_vfi->vpi = vpi; in sli_cmd_init_vfi()
940 init_vpi->hdr.command = SLI4_MBOX_COMMAND_INIT_VPI; in sli_cmd_init_vpi()
941 init_vpi->vpi = vpi; in sli_cmd_init_vpi()
942 init_vpi->vfi = vfi; in sli_cmd_init_vpi()
966 post_xri->hdr.command = SLI4_MBOX_COMMAND_POST_XRI; in sli_cmd_post_xri()
967 post_xri->xri_base = xri_base; in sli_cmd_post_xri()
968 post_xri->xri_count = xri_count; in sli_cmd_post_xri()
970 if (sli4->config.auto_xfer_rdy == 0) { in sli_cmd_post_xri()
971 post_xri->enx = TRUE; in sli_cmd_post_xri()
972 post_xri->val = TRUE; in sli_cmd_post_xri()
996 release_xri->hdr.command = SLI4_MBOX_COMMAND_RELEASE_XRI; in sli_cmd_release_xri()
997 release_xri->xri_count = num_xri; in sli_cmd_release_xri()
1018 read_config->hdr.command = SLI4_MBOX_COMMAND_READ_CONFIG; in sli_cmd_read_config()
1039 read_nvparms->hdr.command = SLI4_MBOX_COMMAND_READ_NVPARMS; in sli_cmd_read_nvparms()
1050 * @param wwpn WWPN to write - pointer to array of 8 uint8_t.
1051 * @param wwnn WWNN to write - pointer to array of 8 uint8_t.
1065 write_nvparms->hdr.command = SLI4_MBOX_COMMAND_WRITE_NVPARMS; in sli_cmd_write_nvparms()
1066 ocs_memcpy(write_nvparms->wwpn, wwpn, 8); in sli_cmd_write_nvparms()
1067 ocs_memcpy(write_nvparms->wwnn, wwnn, 8); in sli_cmd_write_nvparms()
1068 write_nvparms->hard_alpa = hard_alpa; in sli_cmd_write_nvparms()
1069 write_nvparms->preferred_d_id = preferred_d_id; in sli_cmd_write_nvparms()
1091 read_rev->hdr.command = SLI4_MBOX_COMMAND_READ_REV; in sli_cmd_read_rev()
1093 if (vpd && vpd->size) { in sli_cmd_read_rev()
1094 read_rev->vpd = TRUE; in sli_cmd_read_rev()
1096 read_rev->available_length = vpd->size; in sli_cmd_read_rev()
1098 read_rev->physical_address_low = ocs_addr32_lo(vpd->phys); in sli_cmd_read_rev()
1099 read_rev->physical_address_high = ocs_addr32_hi(vpd->phys); in sli_cmd_read_rev()
1126 ocs_log_test(sli4->os, "special VPI not supported!!!\n"); in sli_cmd_read_sparm64()
1127 return -1; in sli_cmd_read_sparm64()
1130 if (!dma || !dma->phys) { in sli_cmd_read_sparm64()
1131 ocs_log_test(sli4->os, "bad DMA buffer\n"); in sli_cmd_read_sparm64()
1132 return -1; in sli_cmd_read_sparm64()
1135 read_sparm64->hdr.command = SLI4_MBOX_COMMAND_READ_SPARM64; in sli_cmd_read_sparm64()
1137 read_sparm64->bde_64.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_cmd_read_sparm64()
1138 read_sparm64->bde_64.buffer_length = dma->size; in sli_cmd_read_sparm64()
1139 read_sparm64->bde_64.u.data.buffer_address_low = ocs_addr32_lo(dma->phys); in sli_cmd_read_sparm64()
1140 read_sparm64->bde_64.u.data.buffer_address_high = ocs_addr32_hi(dma->phys); in sli_cmd_read_sparm64()
1142 read_sparm64->vpi = vpi; in sli_cmd_read_sparm64()
1165 read_topo->hdr.command = SLI4_MBOX_COMMAND_READ_TOPOLOGY; in sli_cmd_read_topology()
1167 if (dma && dma->size) { in sli_cmd_read_topology()
1168 if (dma->size < SLI4_MIN_LOOP_MAP_BYTES) { in sli_cmd_read_topology()
1169 ocs_log_test(sli4->os, "loop map buffer too small %jd\n", in sli_cmd_read_topology()
1170 dma->size); in sli_cmd_read_topology()
1174 ocs_memset(dma->virt, 0, dma->size); in sli_cmd_read_topology()
1176 read_topo->bde_loop_map.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_cmd_read_topology()
1177 read_topo->bde_loop_map.buffer_length = dma->size; in sli_cmd_read_topology()
1178 read_topo->bde_loop_map.u.data.buffer_address_low = ocs_addr32_lo(dma->phys); in sli_cmd_read_topology()
1179 read_topo->bde_loop_map.u.data.buffer_address_high = ocs_addr32_hi(dma->phys); in sli_cmd_read_topology()
1206 reg_fcfi->hdr.command = SLI4_MBOX_COMMAND_REG_FCFI; in sli_cmd_reg_fcfi()
1208 reg_fcfi->fcf_index = index; in sli_cmd_reg_fcfi()
1212 case 0: reg_fcfi->rq_id_0 = rq_cfg[0].rq_id; break; in sli_cmd_reg_fcfi()
1213 case 1: reg_fcfi->rq_id_1 = rq_cfg[1].rq_id; break; in sli_cmd_reg_fcfi()
1214 case 2: reg_fcfi->rq_id_2 = rq_cfg[2].rq_id; break; in sli_cmd_reg_fcfi()
1215 case 3: reg_fcfi->rq_id_3 = rq_cfg[3].rq_id; break; in sli_cmd_reg_fcfi()
1217 reg_fcfi->rq_cfg[i].r_ctl_mask = rq_cfg[i].r_ctl_mask; in sli_cmd_reg_fcfi()
1218 reg_fcfi->rq_cfg[i].r_ctl_match = rq_cfg[i].r_ctl_match; in sli_cmd_reg_fcfi()
1219 reg_fcfi->rq_cfg[i].type_mask = rq_cfg[i].type_mask; in sli_cmd_reg_fcfi()
1220 reg_fcfi->rq_cfg[i].type_match = rq_cfg[i].type_match; in sli_cmd_reg_fcfi()
1224 reg_fcfi->vv = TRUE; in sli_cmd_reg_fcfi()
1225 reg_fcfi->vlan_tag = vlan_id; in sli_cmd_reg_fcfi()
1258 reg_fcfi_mrq->hdr.command = SLI4_MBOX_COMMAND_REG_FCFI_MRQ; in sli_cmd_reg_fcfi_mrq()
1260 reg_fcfi_mrq->fcf_index = fcf_index; in sli_cmd_reg_fcfi_mrq()
1262 reg_fcfi_mrq->vv = TRUE; in sli_cmd_reg_fcfi_mrq()
1263 reg_fcfi_mrq->vlan_tag = vlan_id; in sli_cmd_reg_fcfi_mrq()
1268 reg_fcfi_mrq->mode = mode; in sli_cmd_reg_fcfi_mrq()
1270 reg_fcfi_mrq->rq_cfg[i].r_ctl_mask = rq_cfg[i].r_ctl_mask; in sli_cmd_reg_fcfi_mrq()
1271 reg_fcfi_mrq->rq_cfg[i].r_ctl_match = rq_cfg[i].r_ctl_match; in sli_cmd_reg_fcfi_mrq()
1272 reg_fcfi_mrq->rq_cfg[i].type_mask = rq_cfg[i].type_mask; in sli_cmd_reg_fcfi_mrq()
1273 reg_fcfi_mrq->rq_cfg[i].type_match = rq_cfg[i].type_match; in sli_cmd_reg_fcfi_mrq()
1276 case 3: reg_fcfi_mrq->rq_id_3 = rq_cfg[i].rq_id; break; in sli_cmd_reg_fcfi_mrq()
1277 case 2: reg_fcfi_mrq->rq_id_2 = rq_cfg[i].rq_id; break; in sli_cmd_reg_fcfi_mrq()
1278 case 1: reg_fcfi_mrq->rq_id_1 = rq_cfg[i].rq_id; break; in sli_cmd_reg_fcfi_mrq()
1279 case 0: reg_fcfi_mrq->rq_id_0 = rq_cfg[i].rq_id; break; in sli_cmd_reg_fcfi_mrq()
1283 reg_fcfi_mrq->rq_selection_policy = rq_selection_policy; in sli_cmd_reg_fcfi_mrq()
1284 reg_fcfi_mrq->mrq_filter_bitmask = mrq_bit_mask; in sli_cmd_reg_fcfi_mrq()
1285 reg_fcfi_mrq->num_mrq_pairs = num_mrqs; in sli_cmd_reg_fcfi_mrq()
1298 * @param rpi Previously-allocated Remote Port Indicator.
1299 * @param vpi Previously-allocated Virtual Port Indicator.
1314 reg_rpi->hdr.command = SLI4_MBOX_COMMAND_REG_RPI; in sli_cmd_reg_rpi()
1316 reg_rpi->rpi = rpi; in sli_cmd_reg_rpi()
1317 reg_rpi->remote_n_port_id = nport_id; in sli_cmd_reg_rpi()
1318 reg_rpi->upd = update; in sli_cmd_reg_rpi()
1319 reg_rpi->etow = enable_t10_pi; in sli_cmd_reg_rpi()
1321 reg_rpi->bde_64.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_cmd_reg_rpi()
1322 reg_rpi->bde_64.buffer_length = SLI4_REG_RPI_BUF_LEN; in sli_cmd_reg_rpi()
1323 reg_rpi->bde_64.u.data.buffer_address_low = ocs_addr32_lo(dma->phys); in sli_cmd_reg_rpi()
1324 reg_rpi->bde_64.u.data.buffer_address_high = ocs_addr32_hi(dma->phys); in sli_cmd_reg_rpi()
1326 reg_rpi->vpi = vpi; in sli_cmd_reg_rpi()
1353 reg_vfi->hdr.command = SLI4_MBOX_COMMAND_REG_VFI; in sli_cmd_reg_vfi()
1355 reg_vfi->vfi = domain->indicator; in sli_cmd_reg_vfi()
1357 reg_vfi->fcfi = domain->fcf_indicator; in sli_cmd_reg_vfi()
1359 /* TODO contents of domain->dma only valid if topo == FABRIC */ in sli_cmd_reg_vfi()
1360 reg_vfi->sparm.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_cmd_reg_vfi()
1361 reg_vfi->sparm.buffer_length = 0x70; in sli_cmd_reg_vfi()
1362 reg_vfi->sparm.u.data.buffer_address_low = ocs_addr32_lo(domain->dma.phys); in sli_cmd_reg_vfi()
1363 reg_vfi->sparm.u.data.buffer_address_high = ocs_addr32_hi(domain->dma.phys); in sli_cmd_reg_vfi()
1365 reg_vfi->e_d_tov = sli4->config.e_d_tov; in sli_cmd_reg_vfi()
1366 reg_vfi->r_a_tov = sli4->config.r_a_tov; in sli_cmd_reg_vfi()
1368 reg_vfi->vp = TRUE; in sli_cmd_reg_vfi()
1369 reg_vfi->vpi = domain->sport->indicator; in sli_cmd_reg_vfi()
1370 ocs_memcpy(reg_vfi->wwpn, &domain->sport->sli_wwpn, sizeof(reg_vfi->wwpn)); in sli_cmd_reg_vfi()
1371 reg_vfi->local_n_port_id = domain->sport->fc_id; in sli_cmd_reg_vfi()
1400 reg_vpi->hdr.command = SLI4_MBOX_COMMAND_REG_VPI; in sli_cmd_reg_vpi()
1402 reg_vpi->local_n_port_id = sport->fc_id; in sli_cmd_reg_vpi()
1403 reg_vpi->upd = update != 0; in sli_cmd_reg_vpi()
1404 ocs_memcpy(reg_vpi->wwpn, &sport->sli_wwpn, sizeof(reg_vpi->wwpn)); in sli_cmd_reg_vpi()
1405 reg_vpi->vpi = sport->indicator; in sli_cmd_reg_vpi()
1406 reg_vpi->vfi = sport->domain->indicator; in sli_cmd_reg_vpi()
1429 features->hdr.command = SLI4_MBOX_COMMAND_REQUEST_FEATURES; in sli_cmd_request_features()
1432 features->qry = TRUE; in sli_cmd_request_features()
1434 features->command.dword = mask.dword; in sli_cmd_request_features()
1447 * @param dma DMA buffer for non-embedded commands.
1456 if ((length > sizeof(sli_config->payload.embed)) && (dma == NULL)) { in sli_cmd_sli_config()
1457 ocs_log_test(sli4->os, "length(%d) > payload(%ld)\n", in sli_cmd_sli_config()
1458 length, sizeof(sli_config->payload.embed)); in sli_cmd_sli_config()
1459 return -1; in sli_cmd_sli_config()
1466 sli_config->hdr.command = SLI4_MBOX_COMMAND_SLI_CONFIG; in sli_cmd_sli_config()
1468 sli_config->emb = TRUE; in sli_cmd_sli_config()
1469 sli_config->payload_length = length; in sli_cmd_sli_config()
1471 sli_config->emb = FALSE; in sli_cmd_sli_config()
1473 sli_config->pmd_count = 1; in sli_cmd_sli_config()
1475 sli_config->payload.mem.address_low = ocs_addr32_lo(dma->phys); in sli_cmd_sli_config()
1476 sli_config->payload.mem.address_high = ocs_addr32_hi(dma->phys); in sli_cmd_sli_config()
1477 sli_config->payload.mem.length = dma->size; in sli_cmd_sli_config()
1478 sli_config->payload_length = dma->size; in sli_cmd_sli_config()
1481 sli4->bmbx_non_emb_pmd = dma; in sli_cmd_sli_config()
1503 rc = -1; in sli_sliport_control()
1517 ocs_log_crit(sli4->os, "port failed to become ready after initialization\n"); in sli_sliport_control()
1545 unreg_fcfi->hdr.command = SLI4_MBOX_COMMAND_UNREG_FCFI; in sli_cmd_unreg_fcfi()
1547 unreg_fcfi->fcfi = indicator; in sli_cmd_unreg_fcfi()
1578 unreg_rpi->hdr.command = SLI4_MBOX_COMMAND_UNREG_RPI; in sli_cmd_unreg_rpi()
1584 unreg_rpi->dp = TRUE; in sli_cmd_unreg_rpi()
1585 unreg_rpi->destination_n_port_id = fc_id & 0x00ffffff; in sli_cmd_unreg_rpi()
1598 ocs_log_test(sli4->os, "unknown type %#x\n", which); in sli_cmd_unreg_rpi()
1602 unreg_rpi->ii = index_indicator; in sli_cmd_unreg_rpi()
1603 unreg_rpi->index = indicator; in sli_cmd_unreg_rpi()
1631 unreg_vfi->hdr.command = SLI4_MBOX_COMMAND_UNREG_VFI; in sli_cmd_unreg_vfi()
1634 unreg_vfi->index = domain->indicator; in sli_cmd_unreg_vfi()
1637 unreg_vfi->index = domain->fcf_indicator; in sli_cmd_unreg_vfi()
1640 unreg_vfi->index = UINT16_MAX; in sli_cmd_unreg_vfi()
1647 unreg_vfi->ii = SLI4_UNREG_VFI_II_FCFI; in sli_cmd_unreg_vfi()
1676 unreg_vpi->hdr.command = SLI4_MBOX_COMMAND_UNREG_VPI; in sli_cmd_unreg_vpi()
1677 unreg_vpi->index = indicator; in sli_cmd_unreg_vpi()
1680 unreg_vpi->ii = SLI4_UNREG_VPI_II_VPI; in sli_cmd_unreg_vpi()
1683 unreg_vpi->ii = SLI4_UNREG_VPI_II_VFI; in sli_cmd_unreg_vpi()
1686 unreg_vpi->ii = SLI4_UNREG_VPI_II_FCFI; in sli_cmd_unreg_vpi()
1689 unreg_vpi->index = UINT16_MAX; /* override indicator */ in sli_cmd_unreg_vpi()
1690 unreg_vpi->ii = SLI4_UNREG_VPI_II_FCFI; in sli_cmd_unreg_vpi()
1722 req->hdr.command = SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY; in sli_cmd_config_auto_xfer_rdy()
1723 req->max_burst_len = max_burst_len; in sli_cmd_config_auto_xfer_rdy()
1754 req->hdr.command = SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY_HP; in sli_cmd_config_auto_xfer_rdy_hp()
1755 req->max_burst_len = max_burst_len; in sli_cmd_config_auto_xfer_rdy_hp()
1756 req->esoc = esoc; in sli_cmd_config_auto_xfer_rdy_hp()
1757 req->block_size = block_size; in sli_cmd_config_auto_xfer_rdy_hp()
1776 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_function_reset()
1788 reset->hdr.opcode = SLI4_OPC_COMMON_FUNCTION_RESET; in sli_cmd_common_function_reset()
1789 reset->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_function_reset()
1802 * @param ignored This parameter carries the ULP which is only used for WQ and RQs
1817 uint32_t if_type = sli4->if_type; in sli_cmd_common_create_cq()
1829 num_pages = sli_page_count(qmem->size, page_bytes); in sli_cmd_common_create_cq()
1834 n_cqe = qmem->size / SLI4_CQE_BYTES; in sli_cmd_common_create_cq()
1849 num_pages = sli_page_count(qmem->size, page_bytes); in sli_cmd_common_create_cq()
1853 ocs_log_test(sli4->os, "unsupported IF_TYPE %d\n", if_type); in sli_cmd_common_create_cq()
1854 return -1; in sli_cmd_common_create_cq()
1858 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_create_cq()
1872 cqv0->hdr.opcode = SLI4_OPC_COMMON_CREATE_CQ; in sli_cmd_common_create_cq()
1873 cqv0->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_create_cq()
1874 cqv0->hdr.version = 0; in sli_cmd_common_create_cq()
1875 cqv0->hdr.request_length = cmd_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_create_cq()
1878 cqv0->num_pages = num_pages; in sli_cmd_common_create_cq()
1879 switch (cqv0->num_pages) { in sli_cmd_common_create_cq()
1881 cqv0->cqecnt = SLI4_CQ_CNT_256; in sli_cmd_common_create_cq()
1884 cqv0->cqecnt = SLI4_CQ_CNT_512; in sli_cmd_common_create_cq()
1887 cqv0->cqecnt = SLI4_CQ_CNT_1024; in sli_cmd_common_create_cq()
1890 ocs_log_test(sli4->os, "num_pages %d not valid\n", cqv0->num_pages); in sli_cmd_common_create_cq()
1891 return -1; in sli_cmd_common_create_cq()
1893 cqv0->evt = TRUE; in sli_cmd_common_create_cq()
1894 cqv0->valid = TRUE; in sli_cmd_common_create_cq()
1895 /* TODO cq->nodelay = ???; */ in sli_cmd_common_create_cq()
1896 /* TODO cq->clswm = ???; */ in sli_cmd_common_create_cq()
1897 cqv0->arm = FALSE; in sli_cmd_common_create_cq()
1898 cqv0->eq_id = eq_id; in sli_cmd_common_create_cq()
1900 for (p = 0, addr = qmem->phys; in sli_cmd_common_create_cq()
1901 p < cqv0->num_pages; in sli_cmd_common_create_cq()
1903 cqv0->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_common_create_cq()
1904 cqv0->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_common_create_cq()
1912 cqv2->hdr.opcode = SLI4_OPC_COMMON_CREATE_CQ; in sli_cmd_common_create_cq()
1913 cqv2->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_create_cq()
1914 cqv2->hdr.version = 2; in sli_cmd_common_create_cq()
1915 cqv2->hdr.request_length = cmd_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_create_cq()
1918 cqv2->autovalid = TRUE; in sli_cmd_common_create_cq()
1920 cqv2->page_size = page_size; in sli_cmd_common_create_cq()
1923 cqv2->num_pages = num_pages; in sli_cmd_common_create_cq()
1924 if (!cqv2->num_pages || (cqv2->num_pages > SLI4_COMMON_CREATE_CQ_V2_MAX_PAGES)) { in sli_cmd_common_create_cq()
1928 switch (cqv2->num_pages) { in sli_cmd_common_create_cq()
1930 cqv2->cqecnt = SLI4_CQ_CNT_256; in sli_cmd_common_create_cq()
1933 cqv2->cqecnt = SLI4_CQ_CNT_512; in sli_cmd_common_create_cq()
1936 cqv2->cqecnt = SLI4_CQ_CNT_1024; in sli_cmd_common_create_cq()
1939 cqv2->cqecnt = SLI4_CQ_CNT_LARGE; in sli_cmd_common_create_cq()
1940 cqv2->cqe_count = n_cqe; in sli_cmd_common_create_cq()
1943 ocs_log_test(sli4->os, "num_pages %d not valid\n", cqv2->num_pages); in sli_cmd_common_create_cq()
1944 return -1; in sli_cmd_common_create_cq()
1947 cqv2->evt = TRUE; in sli_cmd_common_create_cq()
1948 cqv2->valid = TRUE; in sli_cmd_common_create_cq()
1949 /* TODO cq->nodelay = ???; */ in sli_cmd_common_create_cq()
1950 /* TODO cq->clswm = ???; */ in sli_cmd_common_create_cq()
1951 cqv2->arm = FALSE; in sli_cmd_common_create_cq()
1952 cqv2->eq_id = eq_id; in sli_cmd_common_create_cq()
1954 for (p = 0, addr = qmem->phys; in sli_cmd_common_create_cq()
1955 p < cqv2->num_pages; in sli_cmd_common_create_cq()
1957 cqv2->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_common_create_cq()
1958 cqv2->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_common_create_cq()
1985 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_destroy_cq()
1994 cq->hdr.opcode = SLI4_OPC_COMMON_DESTROY_CQ; in sli_cmd_common_destroy_cq()
1995 cq->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_destroy_cq()
1996 cq->hdr.request_length = sizeof(sli4_req_common_destroy_cq_t) - in sli_cmd_common_destroy_cq()
1998 cq->cq_id = cq_id; in sli_cmd_common_destroy_cq()
2024 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_modify_eq_delay()
2033 modify_delay->hdr.opcode = SLI4_OPC_COMMON_MODIFY_EQ_DELAY; in sli_cmd_common_modify_eq_delay()
2034 modify_delay->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_modify_eq_delay()
2035 modify_delay->hdr.request_length = sizeof(sli4_req_common_modify_eq_delay_t) - in sli_cmd_common_modify_eq_delay()
2038 modify_delay->num_eq = num_q; in sli_cmd_common_modify_eq_delay()
2041 modify_delay->eq_delay_record[i].eq_id = q[i].id; in sli_cmd_common_modify_eq_delay()
2042 modify_delay->eq_delay_record[i].phase = shift; in sli_cmd_common_modify_eq_delay()
2043 modify_delay->eq_delay_record[i].delay_multiplier = delay_mult; in sli_cmd_common_modify_eq_delay()
2060 * the associated Q_ID and ULP. EQ doesn't have an associated queue or ULP,
2076 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_create_eq()
2088 eq->hdr.opcode = SLI4_OPC_COMMON_CREATE_EQ; in sli_cmd_common_create_eq()
2089 eq->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_create_eq()
2090 eq->hdr.request_length = sizeof(sli4_req_common_create_eq_t) - in sli_cmd_common_create_eq()
2092 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) { in sli_cmd_common_create_eq()
2093 eq->hdr.version = 2; in sli_cmd_common_create_eq()
2094 eq->autovalid = TRUE; in sli_cmd_common_create_eq()
2097 eq->num_pages = qmem->size / SLI_PAGE_SIZE; in sli_cmd_common_create_eq()
2098 switch (eq->num_pages) { in sli_cmd_common_create_eq()
2100 eq->eqesz = SLI4_EQE_SIZE_4; in sli_cmd_common_create_eq()
2101 eq->count = SLI4_EQ_CNT_1024; in sli_cmd_common_create_eq()
2104 eq->eqesz = SLI4_EQE_SIZE_4; in sli_cmd_common_create_eq()
2105 eq->count = SLI4_EQ_CNT_2048; in sli_cmd_common_create_eq()
2108 eq->eqesz = SLI4_EQE_SIZE_4; in sli_cmd_common_create_eq()
2109 eq->count = SLI4_EQ_CNT_4096; in sli_cmd_common_create_eq()
2112 ocs_log_test(sli4->os, "num_pages %d not valid\n", eq->num_pages); in sli_cmd_common_create_eq()
2113 return -1; in sli_cmd_common_create_eq()
2115 eq->valid = TRUE; in sli_cmd_common_create_eq()
2116 eq->arm = FALSE; in sli_cmd_common_create_eq()
2117 eq->delay_multiplier = 32; in sli_cmd_common_create_eq()
2119 for (p = 0, addr = qmem->phys; in sli_cmd_common_create_eq()
2120 p < eq->num_pages; in sli_cmd_common_create_eq()
2122 eq->page_address[p].low = ocs_addr32_lo(addr); in sli_cmd_common_create_eq()
2123 eq->page_address[p].high = ocs_addr32_hi(addr); in sli_cmd_common_create_eq()
2151 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_destroy_eq()
2160 eq->hdr.opcode = SLI4_OPC_COMMON_DESTROY_EQ; in sli_cmd_common_destroy_eq()
2161 eq->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_destroy_eq()
2162 eq->hdr.request_length = sizeof(sli4_req_common_destroy_eq_t) - in sli_cmd_common_destroy_eq()
2165 eq->eq_id = eq_id; in sli_cmd_common_destroy_eq()
2176 * @param timeout watchdog timer timeout in seconds
2181 sli4_cmd_lowlevel_set_watchdog(sli4_t *sli4, void *buf, size_t size, uint16_t timeout) in sli4_cmd_lowlevel_set_watchdog() argument
2187 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli4_cmd_lowlevel_set_watchdog()
2196 req->hdr.opcode = SLI4_OPC_LOWLEVEL_SET_WATCHDOG; in sli4_cmd_lowlevel_set_watchdog()
2197 req->hdr.subsystem = SLI4_SUBSYSTEM_LOWLEVEL; in sli4_cmd_lowlevel_set_watchdog()
2198 req->hdr.request_length = sizeof(sli4_req_lowlevel_set_watchdog_t) - sizeof(sli4_req_hdr_t); in sli4_cmd_lowlevel_set_watchdog()
2199 req->watchdog_timeout = timeout; in sli4_cmd_lowlevel_set_watchdog()
2210 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_cntl_attributes()
2220 ocs_memset(dma->virt, 0, dma->size); in sli_cmd_common_get_cntl_attributes()
2222 hdr = dma->virt; in sli_cmd_common_get_cntl_attributes()
2224 hdr->opcode = SLI4_OPC_COMMON_GET_CNTL_ATTRIBUTES; in sli_cmd_common_get_cntl_attributes()
2225 hdr->subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_cntl_attributes()
2226 hdr->request_length = dma->size; in sli_cmd_common_get_cntl_attributes()
2249 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_cntl_addl_attributes()
2257 ocs_memset(dma->virt, 0, dma->size); in sli_cmd_common_get_cntl_addl_attributes()
2259 hdr = dma->virt; in sli_cmd_common_get_cntl_addl_attributes()
2261 hdr->opcode = SLI4_OPC_COMMON_GET_CNTL_ADDL_ATTRIBUTES; in sli_cmd_common_get_cntl_addl_attributes()
2262 hdr->subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_cntl_addl_attributes()
2263 hdr->request_length = dma->size; in sli_cmd_common_get_cntl_addl_attributes()
2276 * @param ignored This parameter carries the ULP which is only used for WQ and RQs
2291 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_create_mq_ext()
2303 mq->hdr.opcode = SLI4_OPC_COMMON_CREATE_MQ_EXT; in sli_cmd_common_create_mq_ext()
2304 mq->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_create_mq_ext()
2305 mq->hdr.request_length = sizeof(sli4_req_common_create_mq_ext_t) - in sli_cmd_common_create_mq_ext()
2308 mq->num_pages = qmem->size / SLI_PAGE_SIZE; in sli_cmd_common_create_mq_ext()
2309 switch (mq->num_pages) { in sli_cmd_common_create_mq_ext()
2311 mq->ring_size = SLI4_MQE_SIZE_16; in sli_cmd_common_create_mq_ext()
2314 mq->ring_size = SLI4_MQE_SIZE_32; in sli_cmd_common_create_mq_ext()
2317 mq->ring_size = SLI4_MQE_SIZE_64; in sli_cmd_common_create_mq_ext()
2320 mq->ring_size = SLI4_MQE_SIZE_128; in sli_cmd_common_create_mq_ext()
2323 ocs_log_test(sli4->os, "num_pages %d not valid\n", mq->num_pages); in sli_cmd_common_create_mq_ext()
2324 return -1; in sli_cmd_common_create_mq_ext()
2327 /* TODO break this down by sli4->config.topology */ in sli_cmd_common_create_mq_ext()
2328 mq->async_event_bitmap = SLI4_ASYNC_EVT_FC_FCOE; in sli_cmd_common_create_mq_ext()
2330 if (sli4->config.mq_create_version) { in sli_cmd_common_create_mq_ext()
2331 mq->cq_id_v1 = cq_id; in sli_cmd_common_create_mq_ext()
2332 mq->hdr.version = 1; in sli_cmd_common_create_mq_ext()
2335 mq->cq_id_v0 = cq_id; in sli_cmd_common_create_mq_ext()
2337 mq->val = TRUE; in sli_cmd_common_create_mq_ext()
2339 for (p = 0, addr = qmem->phys; in sli_cmd_common_create_mq_ext()
2340 p < mq->num_pages; in sli_cmd_common_create_mq_ext()
2342 mq->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_common_create_mq_ext()
2343 mq->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_common_create_mq_ext()
2367 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_destroy_mq()
2376 mq->hdr.opcode = SLI4_OPC_COMMON_DESTROY_MQ; in sli_cmd_common_destroy_mq()
2377 mq->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_destroy_mq()
2378 mq->hdr.request_length = sizeof(sli4_req_common_destroy_mq_t) - in sli_cmd_common_destroy_mq()
2381 mq->mq_id = mq_id; in sli_cmd_common_destroy_mq()
2403 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_nop()
2412 nop->hdr.opcode = SLI4_OPC_COMMON_NOP; in sli_cmd_common_nop()
2413 nop->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_nop()
2414 nop->hdr.request_length = 8; in sli_cmd_common_nop()
2416 ocs_memcpy(&nop->context, &context, sizeof(context)); in sli_cmd_common_nop()
2438 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_resource_extent_info()
2446 extent->hdr.opcode = SLI4_OPC_COMMON_GET_RESOURCE_EXTENT_INFO; in sli_cmd_common_get_resource_extent_info()
2447 extent->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_resource_extent_info()
2448 extent->hdr.request_length = 4; in sli_cmd_common_get_resource_extent_info()
2450 extent->resource_type = rtype; in sli_cmd_common_get_resource_extent_info()
2471 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_sli4_parameters()
2479 hdr->opcode = SLI4_OPC_COMMON_GET_SLI4_PARAMETERS; in sli_cmd_common_get_sli4_parameters()
2480 hdr->subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_sli4_parameters()
2481 hdr->request_length = 0x50; in sli_cmd_common_get_sli4_parameters()
2506 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_query_fw_config()
2513 fw_config->hdr.opcode = SLI4_OPC_COMMON_QUERY_FW_CONFIG; in sli_cmd_common_query_fw_config()
2514 fw_config->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_query_fw_config()
2515 fw_config->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_query_fw_config()
2541 switch (sli4->if_type) { in sli_cmd_common_get_port_name()
2552 ocs_log_test(sli4->os, "unsupported IF_TYPE %d\n", sli4->if_type); in sli_cmd_common_get_port_name()
2560 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_port_name()
2570 port_name->hdr.opcode = SLI4_OPC_COMMON_GET_PORT_NAME; in sli_cmd_common_get_port_name()
2571 port_name->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_port_name()
2572 port_name->hdr.request_length = sizeof(sli4_req_hdr_t) + (version * sizeof(uint32_t)); in sli_cmd_common_get_port_name()
2573 port_name->hdr.version = version; in sli_cmd_common_get_port_name()
2577 port_name->pt = pt; in sli_cmd_common_get_port_name()
2580 return sli_config_off + port_name->hdr.request_length; in sli_cmd_common_get_port_name()
2610 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_write_object()
2618 wr_obj->hdr.opcode = SLI4_OPC_COMMON_WRITE_OBJECT; in sli_cmd_common_write_object()
2619 wr_obj->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_write_object()
2620 wr_obj->hdr.request_length = sizeof(*wr_obj) - 4*sizeof(uint32_t) + sizeof(sli4_bde_t); in sli_cmd_common_write_object()
2621 wr_obj->hdr.timeout = 0; in sli_cmd_common_write_object()
2622 wr_obj->hdr.version = 0; in sli_cmd_common_write_object()
2624 wr_obj->noc = noc; in sli_cmd_common_write_object()
2625 wr_obj->eof = eof; in sli_cmd_common_write_object()
2626 wr_obj->desired_write_length = desired_write_length; in sli_cmd_common_write_object()
2627 wr_obj->write_offset = offset; in sli_cmd_common_write_object()
2628 ocs_strncpy(wr_obj->object_name, object_name, sizeof(wr_obj->object_name)); in sli_cmd_common_write_object()
2629 wr_obj->host_buffer_descriptor_count = 1; in sli_cmd_common_write_object()
2631 host_buffer = (sli4_bde_t *)wr_obj->host_buffer_descriptor; in sli_cmd_common_write_object()
2634 host_buffer->bde_type = SLI4_BDE_TYPE_BDE_64; in sli_cmd_common_write_object()
2635 host_buffer->buffer_length = desired_write_length; in sli_cmd_common_write_object()
2636 host_buffer->u.data.buffer_address_low = ocs_addr32_lo(dma->phys); in sli_cmd_common_write_object()
2637 host_buffer->u.data.buffer_address_high = ocs_addr32_hi(dma->phys); in sli_cmd_common_write_object()
2660 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_delete_object()
2668 del_obj->hdr.opcode = SLI4_OPC_COMMON_DELETE_OBJECT; in sli_cmd_common_delete_object()
2669 del_obj->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_delete_object()
2670 del_obj->hdr.request_length = sizeof(*del_obj); in sli_cmd_common_delete_object()
2671 del_obj->hdr.timeout = 0; in sli_cmd_common_delete_object()
2672 del_obj->hdr.version = 0; in sli_cmd_common_delete_object()
2674 ocs_strncpy(del_obj->object_name, object_name, sizeof(del_obj->object_name)); in sli_cmd_common_delete_object()
2703 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_read_object()
2711 rd_obj->hdr.opcode = SLI4_OPC_COMMON_READ_OBJECT; in sli_cmd_common_read_object()
2712 rd_obj->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_read_object()
2713 rd_obj->hdr.request_length = sizeof(*rd_obj) - 4*sizeof(uint32_t) + sizeof(sli4_bde_t); in sli_cmd_common_read_object()
2714 rd_obj->hdr.timeout = 0; in sli_cmd_common_read_object()
2715 rd_obj->hdr.version = 0; in sli_cmd_common_read_object()
2717 rd_obj->desired_read_length = desired_read_length; in sli_cmd_common_read_object()
2718 rd_obj->read_offset = offset; in sli_cmd_common_read_object()
2719 ocs_strncpy(rd_obj->object_name, object_name, sizeof(rd_obj->object_name)); in sli_cmd_common_read_object()
2720 rd_obj->host_buffer_descriptor_count = 1; in sli_cmd_common_read_object()
2722 host_buffer = (sli4_bde_t *)rd_obj->host_buffer_descriptor; in sli_cmd_common_read_object()
2725 host_buffer->bde_type = SLI4_BDE_TYPE_BDE_64; in sli_cmd_common_read_object()
2726 host_buffer->buffer_length = desired_read_length; in sli_cmd_common_read_object()
2728 host_buffer->u.data.buffer_address_low = ocs_addr32_lo(dma->phys); in sli_cmd_common_read_object()
2729 host_buffer->u.data.buffer_address_high = ocs_addr32_hi(dma->phys); in sli_cmd_common_read_object()
2731 host_buffer->u.data.buffer_address_low = 0; in sli_cmd_common_read_object()
2732 host_buffer->u.data.buffer_address_high = 0; in sli_cmd_common_read_object()
2758 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_dmtf_exec_clp_cmd()
2766 clp_cmd->hdr.opcode = SLI4_OPC_DMTF_EXEC_CLP_CMD; in sli_cmd_dmtf_exec_clp_cmd()
2767 clp_cmd->hdr.subsystem = SLI4_SUBSYSTEM_DMTF; in sli_cmd_dmtf_exec_clp_cmd()
2768 clp_cmd->hdr.request_length = sizeof(sli4_req_dmtf_exec_clp_cmd_t) - in sli_cmd_dmtf_exec_clp_cmd()
2770 clp_cmd->hdr.timeout = 0; in sli_cmd_dmtf_exec_clp_cmd()
2771 clp_cmd->hdr.version = 0; in sli_cmd_dmtf_exec_clp_cmd()
2772 clp_cmd->cmd_buf_length = cmd->size; in sli_cmd_dmtf_exec_clp_cmd()
2773 clp_cmd->cmd_buf_addr_low = ocs_addr32_lo(cmd->phys); in sli_cmd_dmtf_exec_clp_cmd()
2774 clp_cmd->cmd_buf_addr_high = ocs_addr32_hi(cmd->phys); in sli_cmd_dmtf_exec_clp_cmd()
2775 clp_cmd->resp_buf_length = resp->size; in sli_cmd_dmtf_exec_clp_cmd()
2776 clp_cmd->resp_buf_addr_low = ocs_addr32_lo(resp->phys); in sli_cmd_dmtf_exec_clp_cmd()
2777 clp_cmd->resp_buf_addr_high = ocs_addr32_hi(resp->phys); in sli_cmd_dmtf_exec_clp_cmd()
2789 * @param query Zero to set dump location, non-zero to query dump size
2804 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_set_dump_location()
2812 set_dump_loc->hdr.opcode = SLI4_OPC_COMMON_SET_DUMP_LOCATION; in sli_cmd_common_set_dump_location()
2813 set_dump_loc->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_set_dump_location()
2814 …set_dump_loc->hdr.request_length = sizeof(sli4_req_common_set_dump_location_t) - sizeof(sli4_req_h… in sli_cmd_common_set_dump_location()
2815 set_dump_loc->hdr.timeout = 0; in sli_cmd_common_set_dump_location()
2816 set_dump_loc->hdr.version = 0; in sli_cmd_common_set_dump_location()
2818 set_dump_loc->blp = is_buffer_list; in sli_cmd_common_set_dump_location()
2819 set_dump_loc->qry = query; in sli_cmd_common_set_dump_location()
2820 set_dump_loc->fdb = fdb; in sli_cmd_common_set_dump_location()
2823 set_dump_loc->buf_addr_low = ocs_addr32_lo(buffer->phys); in sli_cmd_common_set_dump_location()
2824 set_dump_loc->buf_addr_high = ocs_addr32_hi(buffer->phys); in sli_cmd_common_set_dump_location()
2825 set_dump_loc->buffer_length = buffer->len; in sli_cmd_common_set_dump_location()
2827 set_dump_loc->buf_addr_low = 0; in sli_cmd_common_set_dump_location()
2828 set_dump_loc->buf_addr_high = 0; in sli_cmd_common_set_dump_location()
2829 set_dump_loc->buffer_length = 0; in sli_cmd_common_set_dump_location()
2857 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_set_features()
2865 cmd->hdr.opcode = SLI4_OPC_COMMON_SET_FEATURES; in sli_cmd_common_set_features()
2866 cmd->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_set_features()
2867 cmd->hdr.request_length = sizeof(sli4_req_common_set_features_t) - sizeof(sli4_req_hdr_t); in sli_cmd_common_set_features()
2868 cmd->hdr.timeout = 0; in sli_cmd_common_set_features()
2869 cmd->hdr.version = 0; in sli_cmd_common_set_features()
2871 cmd->feature = feature; in sli_cmd_common_set_features()
2872 cmd->param_len = param_len; in sli_cmd_common_set_features()
2873 ocs_memcpy(cmd->params, parameter, param_len); in sli_cmd_common_set_features()
2896 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_profile_config()
2903 req = dma->virt; in sli_cmd_common_get_profile_config()
2904 ocs_memset(req, 0, dma->size); in sli_cmd_common_get_profile_config()
2905 payload_size = dma->size; in sli_cmd_common_get_profile_config()
2911 req->hdr.opcode = SLI4_OPC_COMMON_GET_PROFILE_CONFIG; in sli_cmd_common_get_profile_config()
2912 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_profile_config()
2913 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_get_profile_config()
2914 req->hdr.version = 1; in sli_cmd_common_get_profile_config()
2941 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_set_profile_config()
2948 req = dma->virt; in sli_cmd_common_set_profile_config()
2949 ocs_memset(req, 0, dma->size); in sli_cmd_common_set_profile_config()
2950 payload_size = dma->size; in sli_cmd_common_set_profile_config()
2956 req->hdr.opcode = SLI4_OPC_COMMON_SET_PROFILE_CONFIG; in sli_cmd_common_set_profile_config()
2957 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_set_profile_config()
2958 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_set_profile_config()
2959 req->hdr.version = 1; in sli_cmd_common_set_profile_config()
2960 req->profile_id = profile_id; in sli_cmd_common_set_profile_config()
2961 req->desc_count = descriptor_count; in sli_cmd_common_set_profile_config()
2962 req->isap = isap; in sli_cmd_common_set_profile_config()
2987 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_profile_list()
2994 req = dma->virt; in sli_cmd_common_get_profile_list()
2995 ocs_memset(req, 0, dma->size); in sli_cmd_common_get_profile_list()
2996 payload_size = dma->size; in sli_cmd_common_get_profile_list()
3002 req->hdr.opcode = SLI4_OPC_COMMON_GET_PROFILE_LIST; in sli_cmd_common_get_profile_list()
3003 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_profile_list()
3004 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_get_profile_list()
3005 req->hdr.version = 0; in sli_cmd_common_get_profile_list()
3007 req->start_profile_index = start_profile_index; in sli_cmd_common_get_profile_list()
3033 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_active_profile()
3042 req->hdr.opcode = SLI4_OPC_COMMON_GET_ACTIVE_PROFILE; in sli_cmd_common_get_active_profile()
3043 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_active_profile()
3044 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_get_active_profile()
3045 req->hdr.version = 0; in sli_cmd_common_get_active_profile()
3057 * @param fd If non-zero, set profile to factory default.
3074 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_set_active_profile()
3083 req->hdr.opcode = SLI4_OPC_COMMON_SET_ACTIVE_PROFILE; in sli_cmd_common_set_active_profile()
3084 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_set_active_profile()
3085 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_set_active_profile()
3086 req->hdr.version = 0; in sli_cmd_common_set_active_profile()
3087 req->fd = fd; in sli_cmd_common_set_active_profile()
3088 req->active_profile_id = active_profile_id; in sli_cmd_common_set_active_profile()
3115 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_get_reconfig_link_info()
3122 req = dma->virt; in sli_cmd_common_get_reconfig_link_info()
3123 ocs_memset(req, 0, dma->size); in sli_cmd_common_get_reconfig_link_info()
3124 payload_size = dma->size; in sli_cmd_common_get_reconfig_link_info()
3130 req->hdr.opcode = SLI4_OPC_COMMON_GET_RECONFIG_LINK_INFO; in sli_cmd_common_get_reconfig_link_info()
3131 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_get_reconfig_link_info()
3132 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_get_reconfig_link_info()
3133 req->hdr.version = 0; in sli_cmd_common_get_reconfig_link_info()
3145 * @param fd If non-zero, set link config to factory default.
3163 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_common_set_reconfig_link_id()
3170 req = dma->virt; in sli_cmd_common_set_reconfig_link_id()
3171 ocs_memset(req, 0, dma->size); in sli_cmd_common_set_reconfig_link_id()
3172 payload_size = dma->size; in sli_cmd_common_set_reconfig_link_id()
3178 req->hdr.opcode = SLI4_OPC_COMMON_SET_RECONFIG_LINK_ID; in sli_cmd_common_set_reconfig_link_id()
3179 req->hdr.subsystem = SLI4_SUBSYSTEM_COMMON; in sli_cmd_common_set_reconfig_link_id()
3180 req->hdr.request_length = payload_size - sizeof(sli4_req_hdr_t); in sli_cmd_common_set_reconfig_link_id()
3181 req->hdr.version = 0; in sli_cmd_common_set_reconfig_link_id()
3182 req->fd = fd; in sli_cmd_common_set_reconfig_link_id()
3183 req->next_link_config_id = active_link_config_id; in sli_cmd_common_set_reconfig_link_id()
3194 * @return Returns 0 on success, or a non-zero value on failure.
3206 if (!mcqe->cmp) { in sli_cqe_mq()
3207 return -2; in sli_cqe_mq()
3210 if (mcqe->completion_status) { in sli_cqe_mq()
3212 mcqe->completion_status, in sli_cqe_mq()
3213 mcqe->extended_status, in sli_cqe_mq()
3214 mcqe->con, in sli_cqe_mq()
3215 mcqe->cmp, in sli_cqe_mq()
3216 mcqe->ae, in sli_cqe_mq()
3217 mcqe->val); in sli_cqe_mq()
3220 return mcqe->completion_status; in sli_cqe_mq()
3230 * @return Returns 0 on success, or a non-zero value on failure.
3236 int32_t rc = -1; in sli_cqe_async()
3240 return -1; in sli_cqe_async()
3243 switch (acqe->event_code) { in sli_cqe_async()
3251 /*TODO*/ocs_log_debug(sli4->os, "ACQE GRP5\n"); in sli_cqe_async()
3254 ocs_log_debug(sli4->os,"ACQE SLI Port, type=0x%x, data1,2=0x%08x,0x%08x\n", in sli_cqe_async()
3255 acqe->event_type, acqe->event_data[0], acqe->event_data[1]); in sli_cqe_async()
3257 ocs_dump32(OCS_DEBUG_ALWAYS, sli4->os, "acq", acqe, sizeof(*acqe)); in sli_cqe_async()
3264 /*TODO*/ocs_log_test(sli4->os, "ACQE unknown=%#x\n", acqe->event_code); in sli_cqe_async()
3278 * @return Returns 0 on success, or a non-zero value on failure.
3285 if (!buf || (SLI4_MBOX_COMMAND_SLI_CONFIG != sli_config->hdr.command)) { in sli_res_sli_config()
3287 buf ? sli_config->hdr.command : -1); in sli_res_sli_config()
3288 return -1; in sli_res_sli_config()
3291 if (sli_config->hdr.status) { in sli_res_sli_config()
3292 return sli_config->hdr.status; in sli_res_sli_config()
3295 if (sli_config->emb) { in sli_res_sli_config()
3296 return sli_config->payload.embed[4]; in sli_res_sli_config()
3299 return -1; in sli_res_sli_config()
3308 * @return Returns 0 on success, or a non-zero value on failure.
3314 if (sli_cmd_common_function_reset(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_common_function_reset()
3316 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (COM_FUNC_RESET)\n"); in sli_common_function_reset()
3317 return -1; in sli_common_function_reset()
3319 if (sli_res_sli_config(sli4->bmbx.virt)) { in sli_common_function_reset()
3320 ocs_log_err(sli4->os, "bad status COM_FUNC_RESET\n"); in sli_common_function_reset()
3321 return -1; in sli_common_function_reset()
3324 ocs_log_err(sli4->os, "bad COM_FUNC_RESET write\n"); in sli_common_function_reset()
3325 return -1; in sli_common_function_reset()
3335 * Based on <i>SLI-4 Architecture Specification, Revision 4.x0-13 (2012).</i>.
3350 iter--; in sli_wait_for_fw_ready()
3364 * Based on <i>SLI-4 Architecture Specification, Revision 4.x0-13 (2012).</i>.
3368 * @return Returns 0 on success, or a non-zero value on failure.
3381 ocs_log_crit(sli4->os, "FW status is NOT ready\n"); in sli_fw_init()
3382 return -1; in sli_fw_init()
3388 switch (sli4->if_type) { in sli_fw_init()
3393 ocs_log_crit(sli4->os, "bootstrap mailbox not ready\n"); in sli_fw_init()
3394 return -1; in sli_fw_init()
3397 if (sli_cmd_fw_initialize(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_fw_init()
3399 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (FW_INIT)\n"); in sli_fw_init()
3400 return -1; in sli_fw_init()
3403 ocs_log_crit(sli4->os, "bad FW_INIT write\n"); in sli_fw_init()
3404 return -1; in sli_fw_init()
3408 ocs_log_err(sli4->os, "bad COM_FUNC_RESET write\n"); in sli_fw_init()
3409 return -1; in sli_fw_init()
3421 return -1; in sli_fw_init()
3424 ocs_log_test(sli4->os, "if_type %d not supported\n", sli4->if_type); in sli_fw_init()
3425 return -1; in sli_fw_init()
3436 * @return Returns 0 on success, or a non-zero value on failure.
3443 if (sli4->if_type == SLI4_IF_TYPE_BE3_SKH_PF || in sli_fw_term()
3444 sli4->if_type == SLI4_IF_TYPE_BE3_SKH_VF) { in sli_fw_term()
3447 ocs_log_crit(sli4->os, "bootstrap mailbox not ready\n"); in sli_fw_term()
3448 return -1; in sli_fw_term()
3452 ocs_log_err(sli4->os, "bad COM_FUNC_RESET write\n"); in sli_fw_term()
3453 return -1; in sli_fw_term()
3456 if (sli_cmd_fw_deinitialize(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_fw_term()
3458 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (FW_DEINIT)\n"); in sli_fw_term()
3459 return -1; in sli_fw_term()
3462 ocs_log_test(sli4->os, "bad FW_DEINIT write\n"); in sli_fw_term()
3463 return -1; in sli_fw_term()
3483 * @return Returns 0 on success, or a non-zero value on failure.
3490 switch (q->type) { in sli_queue_doorbell()
3492 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) in sli_queue_doorbell()
3493 val = sli_iftype6_eq_doorbell(q->n_posted, q->id, FALSE); in sli_queue_doorbell()
3495 val = sli_eq_doorbell(q->n_posted, q->id, FALSE); in sli_queue_doorbell()
3496 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_doorbell()
3499 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) in sli_queue_doorbell()
3500 val = sli_iftype6_cq_doorbell(q->n_posted, q->id, FALSE); in sli_queue_doorbell()
3502 val = sli_cq_doorbell(q->n_posted, q->id, FALSE); in sli_queue_doorbell()
3503 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_doorbell()
3506 val = SLI4_MQ_DOORBELL(q->n_posted, q->id); in sli_queue_doorbell()
3507 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_doorbell()
3511 uint32_t n_posted = q->n_posted; in sli_queue_doorbell()
3514 * should only update the doorbell of the RQ-pair containing in sli_queue_doorbell()
3518 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_queue_doorbell()
3520 * In RQ-pair, an RQ either contains the FC header in sli_queue_doorbell()
3525 if (!q->u.flag.is_hdr) { in sli_queue_doorbell()
3533 if (q->u.flag.rq_batch) { in sli_queue_doorbell()
3534 if (((q->index + q->n_posted) % SLI4_QUEUE_RQ_BATCH)) { in sli_queue_doorbell()
3541 val = SLI4_RQ_DOORBELL(n_posted, q->id); in sli_queue_doorbell()
3542 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_doorbell()
3546 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) { in sli_queue_doorbell()
3547 val = SLI4_WQ_DOORBELL(q->n_posted, 0, q->id); in sli_queue_doorbell()
3549 /* For iftype = 2 and 3, q->index value is ignored */ in sli_queue_doorbell()
3550 val = SLI4_WQ_DOORBELL(q->n_posted, q->index, q->id); in sli_queue_doorbell()
3553 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_doorbell()
3556 ocs_log_test(sli4->os, "bad queue type %d\n", q->type); in sli_queue_doorbell()
3557 return -1; in sli_queue_doorbell()
3567 if (sli_cmd_request_features(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, in sli_request_features()
3569 sli4_cmd_request_features_t *req_features = sli4->bmbx.virt; in sli_request_features()
3572 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (REQUEST_FEATURES)\n"); in sli_request_features()
3573 return -1; in sli_request_features()
3575 if (req_features->hdr.status) { in sli_request_features()
3576 ocs_log_err(sli4->os, "REQUEST_FEATURES bad status %#x\n", in sli_request_features()
3577 req_features->hdr.status); in sli_request_features()
3578 return -1; in sli_request_features()
3580 features->dword = req_features->response.dword; in sli_request_features()
3582 ocs_log_err(sli4->os, "bad REQUEST_FEATURES write\n"); in sli_request_features()
3583 return -1; in sli_request_features()
3594 * @return Returns 0 on success, or a non-zero value on failure.
3603 sli4->config.max_qentries[q] = sli_convert_mask_to_count(sli4->config.count_method[q], in sli_calc_max_qentries()
3604 sli4->config.count_mask[q]); in sli_calc_max_qentries()
3612 qentries = sli4->config.max_qentries[q]; in sli_calc_max_qentries()
3615 if (alloc_size > ocs_max_dma_alloc(sli4->os, SLI_PAGE_SIZE)) { in sli_calc_max_qentries()
3616 while (alloc_size > ocs_max_dma_alloc(sli4->os, SLI_PAGE_SIZE)) { in sli_calc_max_qentries()
3621 ocs_log_debug(sli4->os, "[%s]: max_qentries from %d to %d (max dma %d)\n", in sli_calc_max_qentries()
3622 SLI_QNAME[q], sli4->config.max_qentries[q], in sli_calc_max_qentries()
3623 qentries, ocs_max_dma_alloc(sli4->os, SLI_PAGE_SIZE)); in sli_calc_max_qentries()
3624 sli4->config.max_qentries[q] = qentries; in sli_calc_max_qentries()
3634 * @return Returns 0 on success, or a non-zero value on failure.
3644 if (sli_cmd_common_query_fw_config(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_query_fw_config()
3647 (((uint8_t *)sli4->bmbx.virt) + offsetof(sli4_cmd_sli_config_t, payload.embed)); in sli_query_fw_config()
3650 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (QUERY_FW_CONFIG)\n"); in sli_query_fw_config()
3651 return -1; in sli_query_fw_config()
3653 if (fw_config->hdr.status) { in sli_query_fw_config()
3654 ocs_log_err(sli4->os, "COMMON_QUERY_FW_CONFIG bad status %#x\n", in sli_query_fw_config()
3655 fw_config->hdr.status); in sli_query_fw_config()
3656 return -1; in sli_query_fw_config()
3659 sli4->physical_port = fw_config->physical_port; in sli_query_fw_config()
3660 …sli4->config.dual_ulp_capable = ((fw_config->function_mode & SLI4_FUNCTION_MODE_DUA_MODE) == 0 ? 0… in sli_query_fw_config()
3661 sli4->config.is_ulp_fc[0] = ((fw_config->ulp0_mode & in sli_query_fw_config()
3664 sli4->config.is_ulp_fc[1] = ((fw_config->ulp1_mode & in sli_query_fw_config()
3668 if (sli4->config.dual_ulp_capable) { in sli_query_fw_config()
3673 if (sli4->config.is_ulp_fc[0] && in sli_query_fw_config()
3674 sli4->config.is_ulp_fc[1]) { in sli_query_fw_config()
3675 …sli4->config.max_qcount[SLI_QTYPE_WQ] = fw_config->ulp0_toe_wq_total + fw_config->ulp1_toe_wq_tota… in sli_query_fw_config()
3676 …sli4->config.max_qcount[SLI_QTYPE_RQ] = fw_config->ulp0_toe_defrq_total + fw_config->ulp1_toe_defr… in sli_query_fw_config()
3677 } else if (sli4->config.is_ulp_fc[0]) { in sli_query_fw_config()
3678 sli4->config.max_qcount[SLI_QTYPE_WQ] = fw_config->ulp0_toe_wq_total; in sli_query_fw_config()
3679 sli4->config.max_qcount[SLI_QTYPE_RQ] = fw_config->ulp0_toe_defrq_total; in sli_query_fw_config()
3681 sli4->config.max_qcount[SLI_QTYPE_WQ] = fw_config->ulp1_toe_wq_total; in sli_query_fw_config()
3682 sli4->config.max_qcount[SLI_QTYPE_RQ] = fw_config->ulp1_toe_defrq_total; in sli_query_fw_config()
3686 ocs_log_err(sli4->os, "bad QUERY_FW_CONFIG write\n"); in sli_query_fw_config()
3687 return -1; in sli_query_fw_config()
3700 if (sli_cmd_read_config(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_get_config()
3701 sli4_res_read_config_t *read_config = sli4->bmbx.virt; in sli_get_config()
3706 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (READ_CONFIG)\n"); in sli_get_config()
3707 return -1; in sli_get_config()
3709 if (read_config->hdr.status) { in sli_get_config()
3710 ocs_log_err(sli4->os, "READ_CONFIG bad status %#x\n", in sli_get_config()
3711 read_config->hdr.status); in sli_get_config()
3712 return -1; in sli_get_config()
3715 sli4->config.has_extents = read_config->ext; in sli_get_config()
3716 if (FALSE == sli4->config.has_extents) { in sli_get_config()
3718 uint32_t *base = sli4->config.extent[0].base; in sli_get_config()
3721 if (NULL == (base = ocs_malloc(sli4->os, SLI_RSRC_MAX * sizeof(uint32_t), in sli_get_config()
3723 ocs_log_err(sli4->os, "memory allocation failed for sli4_resource_t\n"); in sli_get_config()
3724 return -1; in sli_get_config()
3729 sli4->config.extent[i].number = 1; in sli_get_config()
3730 sli4->config.extent[i].n_alloc = 0; in sli_get_config()
3731 sli4->config.extent[i].base = &base[i]; in sli_get_config()
3734 sli4->config.extent[SLI_RSRC_FCOE_VFI].base[0] = read_config->vfi_base; in sli_get_config()
3735 sli4->config.extent[SLI_RSRC_FCOE_VFI].size = read_config->vfi_count; in sli_get_config()
3737 sli4->config.extent[SLI_RSRC_FCOE_VPI].base[0] = read_config->vpi_base; in sli_get_config()
3738 sli4->config.extent[SLI_RSRC_FCOE_VPI].size = read_config->vpi_count; in sli_get_config()
3740 sli4->config.extent[SLI_RSRC_FCOE_RPI].base[0] = read_config->rpi_base; in sli_get_config()
3741 sli4->config.extent[SLI_RSRC_FCOE_RPI].size = read_config->rpi_count; in sli_get_config()
3743 sli4->config.extent[SLI_RSRC_FCOE_XRI].base[0] = read_config->xri_base; in sli_get_config()
3744 sli4->config.extent[SLI_RSRC_FCOE_XRI].size = OCS_MIN(255,read_config->xri_count); in sli_get_config()
3746 sli4->config.extent[SLI_RSRC_FCOE_FCFI].base[0] = 0; in sli_get_config()
3747 sli4->config.extent[SLI_RSRC_FCOE_FCFI].size = read_config->fcfi_count; in sli_get_config()
3754 total = sli4->config.extent[i].number * sli4->config.extent[i].size; in sli_get_config()
3755 sli4->config.extent[i].use_map = ocs_bitmap_alloc(total); in sli_get_config()
3756 if (NULL == sli4->config.extent[i].use_map) { in sli_get_config()
3757 ocs_log_err(sli4->os, "bitmap memory allocation failed " in sli_get_config()
3759 return -1; in sli_get_config()
3761 sli4->config.extent[i].map_size = total; in sli_get_config()
3764 sli4->config.topology = read_config->topology; in sli_get_config()
3765 sli4->config.ptv = read_config->ptv; in sli_get_config()
3766 if (sli4->config.ptv){ in sli_get_config()
3767 sli4->config.tf = read_config->tf; in sli_get_config()
3768 sli4->config.pt = read_config->pt; in sli_get_config()
3770 ocs_log_info(sli4->os, "Persistent Topology: PTV: %d, TF: %d, PT: %d \n", in sli_get_config()
3771 sli4->config.topology, sli4->config.ptv, sli4->config.tf, sli4->config.pt); in sli_get_config()
3773 switch (sli4->config.topology) { in sli_get_config()
3775 ocs_log_debug(sli4->os, "FCoE\n"); in sli_get_config()
3778 ocs_log_debug(sli4->os, "FC (unknown)\n"); in sli_get_config()
3781 ocs_log_debug(sli4->os, "FC (direct attach)\n"); in sli_get_config()
3784 ocs_log_debug(sli4->os, "FC (arbitrated loop)\n"); in sli_get_config()
3787 ocs_log_test(sli4->os, "bad topology %#x\n", sli4->config.topology); in sli_get_config()
3790 sli4->config.e_d_tov = read_config->e_d_tov; in sli_get_config()
3791 sli4->config.r_a_tov = read_config->r_a_tov; in sli_get_config()
3793 sli4->config.link_module_type = read_config->lmt; in sli_get_config()
3795 sli4->config.max_qcount[SLI_QTYPE_EQ] = read_config->eq_count; in sli_get_config()
3796 sli4->config.max_qcount[SLI_QTYPE_CQ] = read_config->cq_count; in sli_get_config()
3797 sli4->config.max_qcount[SLI_QTYPE_WQ] = read_config->wq_count; in sli_get_config()
3798 sli4->config.max_qcount[SLI_QTYPE_RQ] = read_config->rq_count; in sli_get_config()
3805 sli4->config.max_qcount[SLI_QTYPE_MQ] = SLI_USER_MQ_COUNT; in sli_get_config()
3807 ocs_log_err(sli4->os, "bad READ_CONFIG write\n"); in sli_get_config()
3808 return -1; in sli_get_config()
3811 if (sli_cmd_common_get_sli4_parameters(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_get_config()
3813 (((uint8_t *)sli4->bmbx.virt) + offsetof(sli4_cmd_sli_config_t, payload.embed)); in sli_get_config()
3816 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (COMMON_GET_SLI4_PARAMETERS)\n"); in sli_get_config()
3817 return -1; in sli_get_config()
3818 } else if (parms->hdr.status) { in sli_get_config()
3819 ocs_log_err(sli4->os, "COMMON_GET_SLI4_PARAMETERS bad status %#x att'l %#x\n", in sli_get_config()
3820 parms->hdr.status, parms->hdr.additional_status); in sli_get_config()
3821 return -1; in sli_get_config()
3824 sli4->config.auto_reg = parms->areg; in sli_get_config()
3825 sli4->config.auto_xfer_rdy = parms->agxf; in sli_get_config()
3826 sli4->config.hdr_template_req = parms->hdrr; in sli_get_config()
3827 sli4->config.t10_dif_inline_capable = parms->timm; in sli_get_config()
3828 sli4->config.t10_dif_separate_capable = parms->tsmm; in sli_get_config()
3830 sli4->config.mq_create_version = parms->mqv; in sli_get_config()
3831 sli4->config.cq_create_version = parms->cqv; in sli_get_config()
3832 sli4->config.rq_min_buf_size = parms->min_rq_buffer_size; in sli_get_config()
3833 sli4->config.rq_max_buf_size = parms->max_rq_buffer_size; in sli_get_config()
3835 sli4->config.qpage_count[SLI_QTYPE_EQ] = parms->eq_page_cnt; in sli_get_config()
3836 sli4->config.qpage_count[SLI_QTYPE_CQ] = parms->cq_page_cnt; in sli_get_config()
3837 sli4->config.qpage_count[SLI_QTYPE_MQ] = parms->mq_page_cnt; in sli_get_config()
3838 sli4->config.qpage_count[SLI_QTYPE_WQ] = parms->wq_page_cnt; in sli_get_config()
3839 sli4->config.qpage_count[SLI_QTYPE_RQ] = parms->rq_page_cnt; in sli_get_config()
3842 sli4->config.count_mask[SLI_QTYPE_EQ] = parms->eqe_count_mask; in sli_get_config()
3843 sli4->config.count_method[SLI_QTYPE_EQ] = parms->eqe_count_method; in sli_get_config()
3844 sli4->config.count_mask[SLI_QTYPE_CQ] = parms->cqe_count_mask; in sli_get_config()
3845 sli4->config.count_method[SLI_QTYPE_CQ] = parms->cqe_count_method; in sli_get_config()
3846 sli4->config.count_mask[SLI_QTYPE_MQ] = parms->mqe_count_mask; in sli_get_config()
3847 sli4->config.count_method[SLI_QTYPE_MQ] = parms->mqe_count_method; in sli_get_config()
3848 sli4->config.count_mask[SLI_QTYPE_WQ] = parms->wqe_count_mask; in sli_get_config()
3849 sli4->config.count_method[SLI_QTYPE_WQ] = parms->wqe_count_method; in sli_get_config()
3850 sli4->config.count_mask[SLI_QTYPE_RQ] = parms->rqe_count_mask; in sli_get_config()
3851 sli4->config.count_method[SLI_QTYPE_RQ] = parms->rqe_count_method; in sli_get_config()
3856 sli4->config.max_sgl_pages = parms->sgl_page_cnt; /* max # of pages */ in sli_get_config()
3857 sli4->config.sgl_page_sizes = parms->sgl_page_sizes; /* bit map of available sizes */ in sli_get_config()
3860 sli4->config.sge_supported_length = parms->sge_supported_length; in sli_get_config()
3861 if (sli4->config.sge_supported_length > OCS_MAX_SGE_SIZE) in sli_get_config()
3862 sli4->config.sge_supported_length = OCS_MAX_SGE_SIZE; in sli_get_config()
3864 sli4->config.sgl_pre_registration_required = parms->sglr; in sli_get_config()
3865 /* default to using pre-registered SGL's */ in sli_get_config()
3866 sli4->config.sgl_pre_registered = TRUE; in sli_get_config()
3868 sli4->config.perf_hint = parms->phon; in sli_get_config()
3869 sli4->config.perf_wq_id_association = parms->phwq; in sli_get_config()
3871 sli4->config.rq_batch = parms->rq_db_window; in sli_get_config()
3874 sli4->config.sgl_chaining_params.chaining_capable = in sli_get_config()
3875 (parms->sglc == 1); in sli_get_config()
3876 sli4->config.sgl_chaining_params.frag_num_field_offset = in sli_get_config()
3877 parms->frag_num_field_offset; in sli_get_config()
3878 sli4->config.sgl_chaining_params.frag_num_field_mask = in sli_get_config()
3879 (1ull << parms->frag_num_field_size) - 1; in sli_get_config()
3880 sli4->config.sgl_chaining_params.sgl_index_field_offset = in sli_get_config()
3881 parms->sgl_index_field_offset; in sli_get_config()
3882 sli4->config.sgl_chaining_params.sgl_index_field_mask = in sli_get_config()
3883 (1ull << parms->sgl_index_field_size) - 1; in sli_get_config()
3884 sli4->config.sgl_chaining_params.chain_sge_initial_value_lo = in sli_get_config()
3885 parms->chain_sge_initial_value_lo; in sli_get_config()
3886 sli4->config.sgl_chaining_params.chain_sge_initial_value_hi = in sli_get_config()
3887 parms->chain_sge_initial_value_hi; in sli_get_config()
3890 if (parms->wqe_sizes & SLI4_128BYTE_WQE_SUPPORT) { in sli_get_config()
3891 sli4->config.wqe_size = SLI4_WQE_EXT_BYTES; in sli_get_config()
3893 sli4->config.wqe_size = SLI4_WQE_BYTES; in sli_get_config()
3898 ocs_log_err(sli4->os, "Error sending QUERY_FW_CONFIG\n"); in sli_get_config()
3899 return -1; in sli_get_config()
3902 sli4->config.port_number = 0; in sli_get_config()
3909 if (sli_cmd_common_get_cntl_attributes(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, &sli4->vpd.data)) { in sli_get_config()
3910 sli4_res_common_get_cntl_attributes_t *attr = sli4->vpd.data.virt; in sli_get_config()
3913 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (COMMON_GET_CNTL_ATTRIBUTES)\n"); in sli_get_config()
3914 return -1; in sli_get_config()
3915 } else if (attr->hdr.status) { in sli_get_config()
3916 ocs_log_err(sli4->os, "COMMON_GET_CNTL_ATTRIBUTES bad status %#x att'l %#x\n", in sli_get_config()
3917 attr->hdr.status, attr->hdr.additional_status); in sli_get_config()
3918 return -1; in sli_get_config()
3921 sli4->config.port_number = attr->port_number; in sli_get_config()
3923 ocs_memcpy(sli4->config.bios_version_string, attr->bios_version_string, in sli_get_config()
3924 sizeof(sli4->config.bios_version_string)); in sli_get_config()
3926 ocs_log_err(sli4->os, "bad COMMON_GET_CNTL_ATTRIBUTES write\n"); in sli_get_config()
3927 return -1; in sli_get_config()
3930 …if (ocs_dma_alloc(sli4->os, &get_cntl_addl_data, sizeof(sli4_res_common_get_cntl_addl_attributes_t… in sli_get_config()
3932 ocs_log_err(sli4->os, "Failed to allocate memory for GET_CNTL_ADDL_ATTR data\n"); in sli_get_config()
3934 if (sli_cmd_common_get_cntl_addl_attributes(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, in sli_get_config()
3939 ocs_log_crit(sli4->os, in sli_get_config()
3941 ocs_dma_free(sli4->os, &get_cntl_addl_data); in sli_get_config()
3942 return -1; in sli_get_config()
3944 if (attr->hdr.status) { in sli_get_config()
3945 ocs_log_err(sli4->os, "COMMON_GET_CNTL_ADDL_ATTRIBUTES bad status %#x\n", in sli_get_config()
3946 attr->hdr.status); in sli_get_config()
3947 ocs_dma_free(sli4->os, &get_cntl_addl_data); in sli_get_config()
3948 return -1; in sli_get_config()
3951 ocs_memcpy(sli4->config.ipl_name, attr->ipl_file_name, sizeof(sli4->config.ipl_name)); in sli_get_config()
3953 ocs_log_debug(sli4->os, "IPL:%s \n", (char*)sli4->config.ipl_name); in sli_get_config()
3955 ocs_log_err(sli4->os, "bad COMMON_GET_CNTL_ADDL_ATTRIBUTES write\n"); in sli_get_config()
3956 ocs_dma_free(sli4->os, &get_cntl_addl_data); in sli_get_config()
3957 return -1; in sli_get_config()
3960 ocs_dma_free(sli4->os, &get_cntl_addl_data); in sli_get_config()
3963 if (sli_cmd_common_get_port_name(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_get_config()
3964 …mon_get_port_name_t *port_name = (sli4_res_common_get_port_name_t *)(((uint8_t *)sli4->bmbx.virt) + in sli_get_config()
3968 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (COMMON_GET_PORT_NAME)\n"); in sli_get_config()
3969 return -1; in sli_get_config()
3972 sli4->config.port_name[0] = port_name->port_name[sli4->config.port_number]; in sli_get_config()
3974 sli4->config.port_name[1] = '\0'; in sli_get_config()
3976 if (sli_cmd_read_rev(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, &sli4->vpd.data)) { in sli_get_config()
3977 sli4_cmd_read_rev_t *read_rev = sli4->bmbx.virt; in sli_get_config()
3980 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (READ_REV)\n"); in sli_get_config()
3981 return -1; in sli_get_config()
3983 if (read_rev->hdr.status) { in sli_get_config()
3984 ocs_log_err(sli4->os, "READ_REV bad status %#x\n", in sli_get_config()
3985 read_rev->hdr.status); in sli_get_config()
3986 return -1; in sli_get_config()
3989 sli4->config.fw_rev[0] = read_rev->first_fw_id; in sli_get_config()
3990 ocs_memcpy(sli4->config.fw_name[0],read_rev->first_fw_name, sizeof(sli4->config.fw_name[0])); in sli_get_config()
3992 sli4->config.fw_rev[1] = read_rev->second_fw_id; in sli_get_config()
3993 ocs_memcpy(sli4->config.fw_name[1],read_rev->second_fw_name, sizeof(sli4->config.fw_name[1])); in sli_get_config()
3995 sli4->config.hw_rev[0] = read_rev->first_hw_revision; in sli_get_config()
3996 sli4->config.hw_rev[1] = read_rev->second_hw_revision; in sli_get_config()
3997 sli4->config.hw_rev[2] = read_rev->third_hw_revision; in sli_get_config()
3999 ocs_log_debug(sli4->os, "FW1:%s (%08x) / FW2:%s (%08x)\n", in sli_get_config()
4000 read_rev->first_fw_name, read_rev->first_fw_id, in sli_get_config()
4001 read_rev->second_fw_name, read_rev->second_fw_id); in sli_get_config()
4003 ocs_log_debug(sli4->os, "HW1: %08x / HW2: %08x\n", read_rev->first_hw_revision, in sli_get_config()
4004 read_rev->second_hw_revision); in sli_get_config()
4007 if (read_rev->returned_vpd_length != read_rev->actual_vpd_length) { in sli_get_config()
4008 ocs_log_test(sli4->os, "VPD length: available=%d returned=%d actual=%d\n", in sli_get_config()
4009 read_rev->available_length, in sli_get_config()
4010 read_rev->returned_vpd_length, in sli_get_config()
4011 read_rev->actual_vpd_length); in sli_get_config()
4013 sli4->vpd.length = read_rev->returned_vpd_length; in sli_get_config()
4015 ocs_log_err(sli4->os, "bad READ_REV write\n"); in sli_get_config()
4016 return -1; in sli_get_config()
4019 if (sli_cmd_read_nvparms(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE)) { in sli_get_config()
4020 sli4_cmd_read_nvparms_t *read_nvparms = sli4->bmbx.virt; in sli_get_config()
4023 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (READ_NVPARMS)\n"); in sli_get_config()
4024 return -1; in sli_get_config()
4026 if (read_nvparms->hdr.status) { in sli_get_config()
4027 ocs_log_err(sli4->os, "READ_NVPARMS bad status %#x\n", in sli_get_config()
4028 read_nvparms->hdr.status); in sli_get_config()
4029 return -1; in sli_get_config()
4032 ocs_memcpy(sli4->config.wwpn, read_nvparms->wwpn, sizeof(sli4->config.wwpn)); in sli_get_config()
4033 ocs_memcpy(sli4->config.wwnn, read_nvparms->wwnn, sizeof(sli4->config.wwnn)); in sli_get_config()
4035 ocs_log_debug(sli4->os, "WWPN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", in sli_get_config()
4036 sli4->config.wwpn[0], in sli_get_config()
4037 sli4->config.wwpn[1], in sli_get_config()
4038 sli4->config.wwpn[2], in sli_get_config()
4039 sli4->config.wwpn[3], in sli_get_config()
4040 sli4->config.wwpn[4], in sli_get_config()
4041 sli4->config.wwpn[5], in sli_get_config()
4042 sli4->config.wwpn[6], in sli_get_config()
4043 sli4->config.wwpn[7]); in sli_get_config()
4044 ocs_log_debug(sli4->os, "WWNN %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", in sli_get_config()
4045 sli4->config.wwnn[0], in sli_get_config()
4046 sli4->config.wwnn[1], in sli_get_config()
4047 sli4->config.wwnn[2], in sli_get_config()
4048 sli4->config.wwnn[3], in sli_get_config()
4049 sli4->config.wwnn[4], in sli_get_config()
4050 sli4->config.wwnn[5], in sli_get_config()
4051 sli4->config.wwnn[6], in sli_get_config()
4052 sli4->config.wwnn[7]); in sli_get_config()
4054 ocs_log_err(sli4->os, "bad READ_NVPARMS write\n"); in sli_get_config()
4055 return -1; in sli_get_config()
4073 * @return Returns 0 on success, or a non-zero value on failure.
4087 sli4->os = os; in sli_setup()
4088 sli4->port_type = port_type; in sli_setup()
4098 return -1; in sli_setup()
4101 /* driver only support SLI-4 */ in sli_setup()
4102 sli4->sli_rev = sli_intf_sli_revision(sli_intf); in sli_setup()
4103 if (4 != sli4->sli_rev) { in sli_setup()
4106 return -1; in sli_setup()
4109 sli4->sli_family = sli_intf_sli_family(sli_intf); in sli_setup()
4111 sli4->if_type = sli_intf_if_type(sli_intf); in sli_setup()
4113 if ((SLI4_IF_TYPE_LANCER_FC_ETH == sli4->if_type) || in sli_setup()
4114 (SLI4_IF_TYPE_LANCER_G7 == sli4->if_type)) { in sli_setup()
4126 family = sli4->sli_family; in sli_setup()
4133 if ((rev_id == asic->rev_id) && (family == asic->family)) { in sli_setup()
4134 sli4->asic_type = asic->type; in sli_setup()
4135 sli4->asic_rev = asic->rev; in sli_setup()
4140 if( (sli4->asic_type == 0) || (sli4->asic_rev == 0)) { in sli_setup()
4142 return -1; in sli_setup()
4151 if (ocs_dma_alloc(sli4->os, &sli4->bmbx, SLI4_BMBX_SIZE + in sli_setup()
4154 return -1; in sli_setup()
4157 if (sli4->bmbx.phys & SLI4_BMBX_MASK_LO) { in sli_setup()
4159 return -1; in sli_setup()
4162 ocs_log_debug(os, "bmbx v=%p p=0x%x %08x s=%zd\n", sli4->bmbx.virt, in sli_setup()
4163 ocs_addr32_hi(sli4->bmbx.phys), in sli_setup()
4164 ocs_addr32_lo(sli4->bmbx.phys), in sli_setup()
4165 sli4->bmbx.size); in sli_setup()
4168 if (ocs_dma_alloc(sli4->os, &sli4->vpd.data, 4096/*TODO*/, 4096)) { in sli_setup()
4170 sli4->vpd.data.size = 0; in sli_setup()
4175 ocs_log_err(sli4->os, "FW initialization failed\n"); in sli_setup()
4176 return -1; in sli_setup()
4183 sli4->config.features.flag.iaab = TRUE; in sli_setup()
4184 sli4->config.features.flag.npiv = TRUE; in sli_setup()
4185 sli4->config.features.flag.dif = TRUE; in sli_setup()
4186 sli4->config.features.flag.vf = TRUE; in sli_setup()
4187 sli4->config.features.flag.fcpc = TRUE; in sli_setup()
4188 sli4->config.features.flag.iaar = TRUE; in sli_setup()
4189 sli4->config.features.flag.hlm = TRUE; in sli_setup()
4190 sli4->config.features.flag.perfh = TRUE; in sli_setup()
4191 sli4->config.features.flag.rxseq = TRUE; in sli_setup()
4192 sli4->config.features.flag.rxri = TRUE; in sli_setup()
4193 sli4->config.features.flag.mrqp = TRUE; in sli_setup()
4196 if (sli4->config.perf_hint) { in sli_setup()
4197 sli4->config.features.flag.perfh = TRUE; in sli_setup()
4200 if (sli_request_features(sli4, &sli4->config.features, TRUE)) { in sli_setup()
4201 return -1; in sli_setup()
4205 return -1; in sli_setup()
4214 return (sli4->config.ptv); in sli_persist_topology_enabled()
4221 if (sli4->config.has_extents) { in sli_init()
4223 ocs_log_test(sli4->os, "XXX need to implement extent allocation\n"); in sli_init()
4224 return -1; in sli_init()
4227 sli4->config.features.flag.hlm = sli4->config.high_login_mode; in sli_init()
4228 sli4->config.features.flag.rxseq = FALSE; in sli_init()
4229 sli4->config.features.flag.rxri = FALSE; in sli_init()
4231 if (sli_request_features(sli4, &sli4->config.features, FALSE)) { in sli_init()
4232 return -1; in sli_init()
4244 ocs_log_crit(sli4->os, "FW initialization failed\n"); in sli_reset()
4245 return -1; in sli_reset()
4248 if (sli4->config.extent[0].base) { in sli_reset()
4249 ocs_free(sli4->os, sli4->config.extent[0].base, SLI_RSRC_MAX * sizeof(uint32_t)); in sli_reset()
4250 sli4->config.extent[0].base = NULL; in sli_reset()
4254 if (sli4->config.extent[i].use_map) { in sli_reset()
4255 ocs_bitmap_free(sli4->config.extent[i].use_map); in sli_reset()
4256 sli4->config.extent[i].use_map = NULL; in sli_reset()
4258 sli4->config.extent[i].base = NULL; in sli_reset()
4262 return -1; in sli_reset()
4281 * @return Returns 0 on success, or -1 otherwise.
4295 ocs_log_crit(sli4->os, "FW status is NOT ready\n"); in sli_fw_reset()
4296 return -1; in sli_fw_reset()
4298 switch(sli4->if_type) { in sli_fw_reset()
4301 val = ocs_config_read32(sli4->os, SLI4_PCI_SOFT_RESET_CSR); in sli_fw_reset()
4303 ocs_config_write32(sli4->os, SLI4_PCI_SOFT_RESET_CSR, val); in sli_fw_reset()
4312 ocs_log_test(sli4->os, "Unexpected iftype %d\n", sli4->if_type); in sli_fw_reset()
4313 return -1; in sli_fw_reset()
4320 ocs_log_crit(sli4->os, "Failed to become ready after firmware reset\n"); in sli_fw_reset()
4321 return -1; in sli_fw_reset()
4332 * @return Returns 0 on success, or non-zero otherwise.
4339 if (sli4->config.extent[0].base) { in sli_teardown()
4340 ocs_free(sli4->os, sli4->config.extent[0].base, SLI_RSRC_MAX * sizeof(uint32_t)); in sli_teardown()
4341 sli4->config.extent[0].base = NULL; in sli_teardown()
4345 if (sli4->config.has_extents) { in sli_teardown()
4349 sli4->config.extent[i].base = NULL; in sli_teardown()
4351 ocs_bitmap_free(sli4->config.extent[i].use_map); in sli_teardown()
4352 sli4->config.extent[i].use_map = NULL; in sli_teardown()
4356 ocs_log_err(sli4->os, "FW deinitialization failed\n"); in sli_teardown()
4359 ocs_dma_free(sli4->os, &sli4->vpd.data); in sli_teardown()
4360 ocs_dma_free(sli4->os, &sli4->bmbx); in sli_teardown()
4374 * @return Returns 0 on success, or non-zero otherwise.
4383 return -1; in sli_callback()
4388 sli4->link = func; in sli_callback()
4389 sli4->link_arg = arg; in sli_callback()
4392 sli4->fip = func; in sli_callback()
4393 sli4->fip_arg = arg; in sli_callback()
4396 ocs_log_test(sli4->os, "unknown callback %#x\n", which); in sli_callback()
4397 return -1; in sli_callback()
4419 * it frees the existing memory and re-allocates.
4421 * @return Returns 0 on success, or non-zero otherwise.
4428 if ((q->dma.virt == NULL) || (size != q->size) || (n_entries != q->length)) { in __sli_queue_init()
4429 if (q->dma.size) { in __sli_queue_init()
4430 ocs_dma_free(sli4->os, &q->dma); in __sli_queue_init()
4435 if (ocs_dma_alloc(sli4->os, &q->dma, size * n_entries, align)) { in __sli_queue_init()
4436 ocs_log_err(sli4->os, "%s allocation failed\n", SLI_QNAME[qtype]); in __sli_queue_init()
4437 return -1; in __sli_queue_init()
4440 ocs_memset(q->dma.virt, 0, size * n_entries); in __sli_queue_init()
4442 ocs_lock_init(sli4->os, &q->lock, "%s lock[%d:%p]", in __sli_queue_init()
4443 SLI_QNAME[qtype], ocs_instance(sli4->os), &q->lock); in __sli_queue_init()
4445 q->type = qtype; in __sli_queue_init()
4446 q->size = size; in __sli_queue_init()
4447 q->length = n_entries; in __sli_queue_init()
4450 q->proc_limit = n_entries / 2; in __sli_queue_init()
4452 if ( (q->type == SLI_QTYPE_EQ) || (q->type == SLI_QTYPE_CQ) ) { in __sli_queue_init()
4454 q->phase = 1; in __sli_queue_init()
4457 switch(q->type) { in __sli_queue_init()
4459 q->posted_limit = q->length / 2; in __sli_queue_init()
4462 if ((sli4->if_type == SLI4_IF_TYPE_BE3_SKH_PF) || in __sli_queue_init()
4463 (sli4->if_type == SLI4_IF_TYPE_BE3_SKH_VF)) { in __sli_queue_init()
4465 q->posted_limit = 8; in __sli_queue_init()
4467 q->posted_limit = 64; in __sli_queue_init()
4483 * @return Returns 0 on success, or non-zero otherwise.
4491 ocs_log_crit(sli4->os, "bootstrap mailbox write fail %s\n", in __sli_create_queue()
4492 SLI_QNAME[q->type]); in __sli_create_queue()
4493 ocs_dma_free(sli4->os, &q->dma); in __sli_create_queue()
4494 return -1; in __sli_create_queue()
4496 if (sli_res_sli_config(sli4->bmbx.virt)) { in __sli_create_queue()
4497 ocs_log_err(sli4->os, "bad status create %s\n", SLI_QNAME[q->type]); in __sli_create_queue()
4498 ocs_dma_free(sli4->os, &q->dma); in __sli_create_queue()
4499 return -1; in __sli_create_queue()
4501 res_q = (void *)((uint8_t *)sli4->bmbx.virt + in __sli_create_queue()
4504 if (res_q->hdr.status) { in __sli_create_queue()
4505 ocs_log_err(sli4->os, "bad create %s status=%#x addl=%#x\n", in __sli_create_queue()
4506 SLI_QNAME[q->type], in __sli_create_queue()
4507 res_q->hdr.status, res_q->hdr.additional_status); in __sli_create_queue()
4508 ocs_dma_free(sli4->os, &q->dma); in __sli_create_queue()
4509 return -1; in __sli_create_queue()
4511 q->id = res_q->q_id; in __sli_create_queue()
4512 q->doorbell_offset = res_q->db_offset; in __sli_create_queue()
4513 q->doorbell_rset = res_q->db_rs; in __sli_create_queue()
4515 switch (q->type) { in __sli_create_queue()
4518 q->doorbell_offset = regmap[SLI4_REG_EQ_DOORBELL][sli4->if_type].off; in __sli_create_queue()
4519 q->doorbell_rset = regmap[SLI4_REG_EQ_DOORBELL][sli4->if_type].rset; in __sli_create_queue()
4523 q->doorbell_offset = regmap[SLI4_REG_CQ_DOORBELL][sli4->if_type].off; in __sli_create_queue()
4524 q->doorbell_rset = regmap[SLI4_REG_CQ_DOORBELL][sli4->if_type].rset; in __sli_create_queue()
4528 q->doorbell_offset = regmap[SLI4_REG_MQ_DOORBELL][sli4->if_type].off; in __sli_create_queue()
4529 q->doorbell_rset = regmap[SLI4_REG_MQ_DOORBELL][sli4->if_type].rset; in __sli_create_queue()
4532 /* set the doorbell for non-skyhawks */ in __sli_create_queue()
4533 if (!sli4->config.dual_ulp_capable) { in __sli_create_queue()
4534 q->doorbell_offset = regmap[SLI4_REG_FCOE_RQ_DOORBELL][sli4->if_type].off; in __sli_create_queue()
4535 q->doorbell_rset = regmap[SLI4_REG_FCOE_RQ_DOORBELL][sli4->if_type].rset; in __sli_create_queue()
4539 /* set the doorbell for non-skyhawks */ in __sli_create_queue()
4540 if (!sli4->config.dual_ulp_capable) { in __sli_create_queue()
4541 q->doorbell_offset = regmap[SLI4_REG_IO_WQ_DOORBELL][sli4->if_type].off; in __sli_create_queue()
4542 q->doorbell_rset = regmap[SLI4_REG_IO_WQ_DOORBELL][sli4->if_type].rset; in __sli_create_queue()
4571 return -1; in sli_get_queue_entry_size()
4585 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_get_queue_entry_size()
4586 size = sli4->config.wqe_size; in sli_get_queue_entry_size()
4589 ocs_log_test(sli4->os, "unsupported queue entry size\n"); in sli_get_queue_entry_size()
4590 return -1; in sli_get_queue_entry_size()
4597 ocs_log_test(sli4->os, "unknown queue type %d\n", qtype); in sli_get_queue_entry_size()
4598 return -1; in sli_get_queue_entry_size()
4613 * @return Returns 0 on success, or -1 otherwise.
4619 …sli_cmd_common_modify_eq_delay(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, eq, num_eq, shift, delay_mul… in sli_eq_modify_delay()
4622 ocs_log_crit(sli4->os, "bootstrap mailbox write fail (MODIFY EQ DELAY)\n"); in sli_eq_modify_delay()
4623 return -1; in sli_eq_modify_delay()
4625 if (sli_res_sli_config(sli4->bmbx.virt)) { in sli_eq_modify_delay()
4626 ocs_log_err(sli4->os, "bad status MODIFY EQ DELAY\n"); in sli_eq_modify_delay()
4627 return -1; in sli_eq_modify_delay()
4645 * @param ulp The ULP to bind, which is only used for WQ and RQs
4647 * @return Returns 0 on success, or -1 otherwise.
4651 sli4_queue_t *assoc, uint16_t ulp) in sli_queue_alloc() argument
4659 return -1; in sli_queue_alloc()
4665 return -1; in sli_queue_alloc()
4684 ocs_log_test(sli4->os, "illegal n_entries value %d for MQ\n", n_entries); in sli_queue_alloc()
4685 return -1; in sli_queue_alloc()
4687 assoc->u.flag.is_mq = TRUE; in sli_queue_alloc()
4691 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_queue_alloc()
4692 if (sli4->if_type == SLI4_IF_TYPE_BE3_SKH_PF) { in sli_queue_alloc()
4699 ocs_log_test(sli4->os, "unsupported WQ create\n"); in sli_queue_alloc()
4700 return -1; in sli_queue_alloc()
4704 ocs_log_test(sli4->os, "unknown queue type %d\n", qtype); in sli_queue_alloc()
4705 return -1; in sli_queue_alloc()
4709 ocs_log_err(sli4->os, "%s allocation failed\n", SLI_QNAME[qtype]); in sli_queue_alloc()
4710 return -1; in sli_queue_alloc()
4713 if (create(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, &q->dma, assoc ? assoc->id : 0, ulp)) { in sli_queue_alloc()
4715 ocs_log_err(sli4->os, "create %s failed\n", SLI_QNAME[qtype]); in sli_queue_alloc()
4716 return -1; in sli_queue_alloc()
4718 q->ulp = ulp; in sli_queue_alloc()
4720 ocs_log_err(sli4->os, "cannot create %s\n", SLI_QNAME[qtype]); in sli_queue_alloc()
4721 return -1; in sli_queue_alloc()
4737 * @return Returns 0 on success, or -1 otherwise.
4752 return -1; in sli_cq_alloc_set()
4761 ocs_log_err(sli4->os, "Queue init failed.\n"); in sli_cq_alloc_set()
4766 n_cqe = qs[0]->dma.size / SLI4_CQE_BYTES; in sli_cq_alloc_set()
4778 return -1; in sli_cq_alloc_set()
4782 num_pages_cq = sli_page_count(qs[0]->dma.size, page_bytes); in sli_cq_alloc_set()
4786 if (ocs_dma_alloc(sli4->os, &dma, payload_size, SLI_PAGE_SIZE)) { in sli_cq_alloc_set()
4787 ocs_log_err(sli4->os, "DMA allocation failed\n"); in sli_cq_alloc_set()
4792 if (sli_cmd_sli_config(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, in sli_cq_alloc_set()
4793 payload_size, &dma) == -1) { in sli_cq_alloc_set()
4800 req->hdr.opcode = SLI4_OPC_COMMON_CREATE_CQ_SET; in sli_cq_alloc_set()
4801 req->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cq_alloc_set()
4802 req->hdr.version = 0; in sli_cq_alloc_set()
4803 req->hdr.request_length = cmd_size - sizeof(sli4_req_hdr_t); in sli_cq_alloc_set()
4804 req->page_size = page_size; in sli_cq_alloc_set()
4806 req->num_pages = num_pages_cq; in sli_cq_alloc_set()
4807 switch (req->num_pages) { in sli_cq_alloc_set()
4809 req->cqecnt = SLI4_CQ_CNT_256; in sli_cq_alloc_set()
4812 req->cqecnt = SLI4_CQ_CNT_512; in sli_cq_alloc_set()
4815 req->cqecnt = SLI4_CQ_CNT_1024; in sli_cq_alloc_set()
4818 req->cqecnt = SLI4_CQ_CNT_LARGE; in sli_cq_alloc_set()
4819 req->cqe_count = n_cqe; in sli_cq_alloc_set()
4822 ocs_log_test(sli4->os, "num_pages %d not valid\n", req->num_pages); in sli_cq_alloc_set()
4826 req->evt = TRUE; in sli_cq_alloc_set()
4827 req->valid = TRUE; in sli_cq_alloc_set()
4828 req->arm = FALSE; in sli_cq_alloc_set()
4829 req->num_cq_req = num_cqs; in sli_cq_alloc_set()
4831 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) in sli_cq_alloc_set()
4832 req->autovalid = TRUE; in sli_cq_alloc_set()
4836 req->eq_id[i] = eqs[i]->id; in sli_cq_alloc_set()
4837 for (p = 0, addr = qs[i]->dma.phys; p < req->num_pages; p++, addr += page_bytes) { in sli_cq_alloc_set()
4838 req->page_physical_address[offset].low = ocs_addr32_lo(addr); in sli_cq_alloc_set()
4839 req->page_physical_address[offset].high = ocs_addr32_hi(addr); in sli_cq_alloc_set()
4845 ocs_log_crit(sli4->os, "bootstrap mailbox write fail CQSet\n"); in sli_cq_alloc_set()
4850 if (res->hdr.status) { in sli_cq_alloc_set()
4851 ocs_log_err(sli4->os, "bad create CQSet status=%#x addl=%#x\n", in sli_cq_alloc_set()
4852 res->hdr.status, res->hdr.additional_status); in sli_cq_alloc_set()
4856 if (res->num_q_allocated != num_cqs) { in sli_cq_alloc_set()
4857 ocs_log_crit(sli4->os, "Requested count CQs doesnt match.\n"); in sli_cq_alloc_set()
4863 qs[i]->id = res->q_id + i; in sli_cq_alloc_set()
4864 qs[i]->doorbell_offset = regmap[SLI4_REG_CQ_DOORBELL][sli4->if_type].off; in sli_cq_alloc_set()
4865 qs[i]->doorbell_rset = regmap[SLI4_REG_CQ_DOORBELL][sli4->if_type].rset; in sli_cq_alloc_set()
4869 ocs_dma_free(sli4->os, &dma); in sli_cq_alloc_set()
4875 if (qs[i]->dma.size) { in sli_cq_alloc_set()
4876 ocs_dma_free(sli4->os, &qs[i]->dma); in sli_cq_alloc_set()
4881 ocs_dma_free(sli4->os, &dma); in sli_cq_alloc_set()
4884 return -1; in sli_cq_alloc_set()
4892 * Frees DMA memory and de-registers the requested queue.
4896 * @param destroy_queues Non-zero if the mailbox commands should be sent to destroy the queues.
4897 * @param free_memory Non-zero if the DMA memory associated with the queue should be freed.
4899 * @return Returns 0 on success, or -1 otherwise.
4905 int32_t rc = -1; in sli_queue_free()
4909 return -1; in sli_queue_free()
4913 switch (q->type) { in sli_queue_free()
4924 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_queue_free()
4928 ocs_log_test(sli4->os, "unsupported WQ destroy\n"); in sli_queue_free()
4929 return -1; in sli_queue_free()
4933 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_queue_free()
4937 ocs_log_test(sli4->os, "unsupported RQ destroy\n"); in sli_queue_free()
4938 return -1; in sli_queue_free()
4942 ocs_log_test(sli4->os, "bad queue type %d\n", in sli_queue_free()
4943 q->type); in sli_queue_free()
4944 return -1; in sli_queue_free()
4952 if (SLI4_IF_TYPE_BE3_SKH_PF == sli4->if_type) { in sli_queue_free()
4957 if (destroy && destroy(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, q->id)) { in sli_queue_free()
4961 ocs_log_crit(sli4->os, "bootstrap mailbox write fail destroy %s\n", in sli_queue_free()
4962 SLI_QNAME[q->type]); in sli_queue_free()
4963 } else if (sli_res_sli_config(sli4->bmbx.virt)) { in sli_queue_free()
4964 ocs_log_err(sli4->os, "bad status destroy %s\n", SLI_QNAME[q->type]); in sli_queue_free()
4966 res = (void *)((uint8_t *)sli4->bmbx.virt + in sli_queue_free()
4969 if (res->status) { in sli_queue_free()
4970 ocs_log_err(sli4->os, "bad destroy %s status=%#x addl=%#x\n", in sli_queue_free()
4971 SLI_QNAME[q->type], in sli_queue_free()
4972 res->status, res->additional_status); in sli_queue_free()
4981 ocs_lock_free(&q->lock); in sli_queue_free()
4983 if (ocs_dma_free(sli4->os, &q->dma)) { in sli_queue_free()
4984 ocs_log_err(sli4->os, "%s queue ID %d free failed\n", in sli_queue_free()
4985 SLI_QNAME[q->type], q->id); in sli_queue_free()
4986 rc = -1; in sli_queue_free()
4997 ocs_lock(&q->lock); in sli_queue_reset()
4999 q->index = 0; in sli_queue_reset()
5000 q->n_posted = 0; in sli_queue_reset()
5002 if (SLI_QTYPE_MQ == q->type) { in sli_queue_reset()
5003 q->u.r_idx = 0; in sli_queue_reset()
5006 if (q->dma.virt != NULL) { in sli_queue_reset()
5007 ocs_memset(q->dma.virt, 0, (q->size * (uint64_t)q->length)); in sli_queue_reset()
5010 ocs_unlock(&q->lock); in sli_queue_reset()
5031 uint8_t *qe = q->dma.virt; in sli_queue_is_empty()
5033 ocs_lock(&q->lock); in sli_queue_is_empty()
5035 ocs_dma_sync(&q->dma, OCS_DMASYNC_POSTREAD); in sli_queue_is_empty()
5037 qe += q->index * q->size; in sli_queue_is_empty()
5041 ocs_unlock(&q->lock); in sli_queue_is_empty()
5054 * @return Returns 0 on success, or non-zero otherwise.
5061 ocs_lock(&q->lock); in sli_queue_eq_arm()
5062 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) in sli_queue_eq_arm()
5063 val = sli_iftype6_eq_doorbell(q->n_posted, q->id, arm); in sli_queue_eq_arm()
5065 val = sli_eq_doorbell(q->n_posted, q->id, arm); in sli_queue_eq_arm()
5067 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_eq_arm()
5068 q->n_posted = 0; in sli_queue_eq_arm()
5069 ocs_unlock(&q->lock); in sli_queue_eq_arm()
5082 * @return Returns 0 on success, or non-zero otherwise.
5089 ocs_lock(&q->lock); in sli_queue_arm()
5091 switch (q->type) { in sli_queue_arm()
5093 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) in sli_queue_arm()
5094 val = sli_iftype6_eq_doorbell(q->n_posted, q->id, arm); in sli_queue_arm()
5096 val = sli_eq_doorbell(q->n_posted, q->id, arm); in sli_queue_arm()
5097 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_arm()
5098 q->n_posted = 0; in sli_queue_arm()
5101 if (sli4->if_type == SLI4_IF_TYPE_LANCER_G7) in sli_queue_arm()
5102 val = sli_iftype6_cq_doorbell(q->n_posted, q->id, arm); in sli_queue_arm()
5104 val = sli_cq_doorbell(q->n_posted, q->id, arm); in sli_queue_arm()
5105 ocs_reg_write32(sli4->os, q->doorbell_rset, q->doorbell_offset, val); in sli_queue_arm()
5106 q->n_posted = 0; in sli_queue_arm()
5109 ocs_log_test(sli4->os, "should only be used for EQ/CQ, not %s\n", in sli_queue_arm()
5110 SLI_QNAME[q->type]); in sli_queue_arm()
5113 ocs_unlock(&q->lock); in sli_queue_arm()
5122 * Note: Assumes the q->lock will be locked and released by the caller.
5134 uint8_t *qe = q->dma.virt; in _sli_queue_write()
5137 qindex = q->index; in _sli_queue_write()
5138 qe += q->index * q->size; in _sli_queue_write()
5141 if ((SLI_QTYPE_WQ == q->type) && sli4->config.perf_wq_id_association) { in _sli_queue_write()
5142 sli_set_wq_id_association(entry, q->id); in _sli_queue_write()
5145 switch (q->type) { in _sli_queue_write()
5147 ocs_dump32(OCS_DEBUG_ENABLE_WQ_DUMP, sli4->os, "wqe", entry, q->size); in _sli_queue_write()
5153 ocs_dump32(OCS_DEBUG_ENABLE_MQ_DUMP, sli4->os, "mqe outbound", entry, 64); in _sli_queue_write()
5160 ocs_memcpy(qe, entry, q->size); in _sli_queue_write()
5161 q->n_posted = 1; in _sli_queue_write()
5164 ocs_dma_sync(&q->dma, OCS_DMASYNC_PREWRITE); in _sli_queue_write()
5168 q->index = (q->index + q->n_posted) & (q->length - 1); in _sli_queue_write()
5169 q->n_posted = 0; in _sli_queue_write()
5176 return -rc; in _sli_queue_write()
5186 * Note: Assumes the q->lock will be locked and released by the caller.
5199 ocs_lock(&q->lock); in sli_queue_write()
5201 ocs_unlock(&q->lock); in sli_queue_write()
5221 switch (q->type) { in sli_queue_entry_is_valid()
5223 valid = (((sli4_eqe_t *)qe)->vld == q->phase) ? 1 : 0; in sli_queue_entry_is_valid()
5225 ((sli4_eqe_t *)qe)->vld = 0; in sli_queue_entry_is_valid()
5234 if (valid_bit_set == q->phase) in sli_queue_entry_is_valid()
5242 valid = q->index != q->u.r_idx; in sli_queue_entry_is_valid()
5249 ocs_log_test(NULL, "doesn't handle type=%#x\n", q->type); in sli_queue_entry_is_valid()
5254 ocs_dma_sync(&q->dma, OCS_DMASYNC_PREWRITE); in sli_queue_entry_is_valid()
5268 * @return Returns 0 on success, or non-zero otherwise.
5274 uint8_t *qe = q->dma.virt; in sli_queue_read()
5278 if (SLI_QTYPE_MQ == q->type) { in sli_queue_read()
5279 qindex = &q->u.r_idx; in sli_queue_read()
5281 qindex = &q->index; in sli_queue_read()
5284 ocs_lock(&q->lock); in sli_queue_read()
5286 ocs_dma_sync(&q->dma, OCS_DMASYNC_POSTREAD); in sli_queue_read()
5288 qe += *qindex * q->size; in sli_queue_read()
5291 ocs_unlock(&q->lock); in sli_queue_read()
5292 return -1; in sli_queue_read()
5296 ocs_memcpy(entry, qe, q->size); in sli_queue_read()
5298 switch(q->type) { in sli_queue_read()
5300 ocs_dump32(OCS_DEBUG_ENABLE_CQ_DUMP, sli4->os, "cq", entry, q->size); in sli_queue_read()
5303 ocs_dump32(OCS_DEBUG_ENABLE_MQ_DUMP, sli4->os, "mq Compl", entry, 64); in sli_queue_read()
5306 ocs_dump32(OCS_DEBUG_ENABLE_EQ_DUMP, sli4->os, "eq Compl", entry, q->size); in sli_queue_read()
5314 switch (q->type) { in sli_queue_read()
5318 *qindex = (*qindex + 1) & (q->length - 1); in sli_queue_read()
5319 if (SLI_QTYPE_MQ != q->type) { in sli_queue_read()
5320 q->n_posted++; in sli_queue_read()
5326 q->phase ^= (uint16_t) 0x1; in sli_queue_read()
5335 ocs_unlock(&q->lock); in sli_queue_read()
5345 return q->index; in sli_queue_index()
5347 return -1; in sli_queue_index()
5356 ocs_lock(&q->lock); in sli_queue_poke()
5358 ocs_unlock(&q->lock); in sli_queue_poke()
5367 uint8_t *qe = q->dma.virt; in _sli_queue_poke()
5369 if (index >= q->length) { in _sli_queue_poke()
5370 return -1; in _sli_queue_poke()
5373 qe += index * q->size; in _sli_queue_poke()
5376 ocs_memcpy(qe, entry, q->size); in _sli_queue_poke()
5379 ocs_dma_sync(&q->dma, OCS_DMASYNC_PREWRITE); in _sli_queue_poke()
5389 * Allocate port-related resources, such as VFI, RPI, XRI, and so on.
5399 * @return Returns 0 on success, or a non-zero value on failure.
5418 status = ocs_bitmap_find(sli4->config.extent[rtype].use_map, in sli_resource_alloc()
5419 sli4->config.extent[rtype].map_size); in sli_resource_alloc()
5421 ocs_log_err(sli4->os, "out of resource %d (alloc=%d)\n", in sli_resource_alloc()
5422 rtype, sli4->config.extent[rtype].n_alloc); in sli_resource_alloc()
5423 rc = -1; in sli_resource_alloc()
5429 size = sli4->config.extent[rtype].size; in sli_resource_alloc()
5434 *rid = sli4->config.extent[rtype].base[extent_idx] + item_idx; in sli_resource_alloc()
5436 sli4->config.extent[rtype].n_alloc++; in sli_resource_alloc()
5439 rc = -1; in sli_resource_alloc()
5450 * Free port-related resources, such as VFI, RPI, XRI, and so. See discussion of
5457 * @return Returns 0 on success, or a non-zero value on failure.
5462 int32_t rc = -1; in sli_resource_free()
5474 * extent->base <= resource ID < extent->base + extent->size in sli_resource_free()
5476 base = sli4->config.extent[rtype].base; in sli_resource_free()
5477 size = sli4->config.extent[rtype].size; in sli_resource_free()
5484 for (x = 0; x < sli4->config.extent[rtype].number; x++) { in sli_resource_free()
5486 rid -= base[x]; in sli_resource_free()
5487 ocs_bitmap_clear(sli4->config.extent[rtype].use_map, in sli_resource_free()
5505 int32_t rc = -1; in sli_resource_reset()
5513 for (i = 0; i < sli4->config.extent[rtype].map_size; i++) { in sli_resource_reset()
5514 ocs_bitmap_clear(sli4->config.extent[rtype].use_map, i); in sli_resource_reset()
5534 * - 0 if success.
5535 * - < 0 if error.
5536 * - > 0 if firmware detects EQ overflow.
5547 return -1; in sli_eq_parse()
5550 switch (eqe->major_code) { in sli_eq_parse()
5552 *cq_id = eqe->resource_id; in sli_eq_parse()
5555 ocs_log_debug(sli4->os, "sentinel EQE\n"); in sli_eq_parse()
5559 ocs_log_test(sli4->os, "Unsupported EQE: major %x minor %x\n", in sli_eq_parse()
5560 eqe->major_code, eqe->minor_code); in sli_eq_parse()
5561 rc = -1; in sli_eq_parse()
5579 * - 0 if call completed correctly and CQE status is SUCCESS.
5580 * - -1 if call failed (no CQE status).
5581 * - Other value if call completed correctly and return value is a CQE status value.
5592 return -1; in sli_cq_parse()
5595 if (cq->u.flag.is_mq) { in sli_cq_parse()
5598 if (mcqe->ae) { in sli_cq_parse()
5604 *q_id = -1; in sli_cq_parse()
5605 } else if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cq_parse()
5608 ocs_log_test(sli4->os, "implement CQE parsing type = %#x\n", in sli_cq_parse()
5609 sli4->port_type); in sli_cq_parse()
5610 rc = -1; in sli_cq_parse()
5628 * @return Returns 0 if call completed correctly, or -1 if call failed (unsupported chip).
5642 value = ocs_config_read32(sli4->os, SLI4_SW_UE_REG); in sli_raise_ue()
5643 ocs_config_write32(sli4->os, SLI4_SW_UE_REG, (value | (1U << 24))); in sli_raise_ue()
5647 ocs_log_test(sli4->os, "invalid asic type %d\n", sli_get_asic_type(sli4)); in sli_raise_ue()
5648 return -1; in sli_raise_ue()
5662 ocs_log_test(sli4->os, "invalid iftype=%d\n", sli_get_if_type(sli4)); in sli_raise_ue()
5663 return -1; in sli_raise_ue()
5714 ocs_log_test(sli4->os, "invalid iftype=%d\n", sli_get_if_type(sli4)); in sli_dump_is_ready()
5715 return -1; in sli_dump_is_ready()
5727 * - 0 if call completed correctly and no dump is present.
5728 * - 1 if call completed and dump is present.
5729 * - -1 if call failed (unsupported chip).
5738 ocs_log_test(sli4->os, "Function only supported for I/F type 2"); in sli_dump_is_present()
5739 return -1; in sli_dump_is_present()
5750 ocs_log_err(sli4->os, "error reading SLIPORT_STATUS\n"); in sli_dump_is_present()
5751 return -1; in sli_dump_is_present()
5764 * - 0 if call completed correctly and reset is not required.
5765 * - 1 if call completed and reset is required.
5766 * - -1 if call failed.
5773 ocs_log_test(sli4->os, "reset required N/A for iftype 0\n"); in sli_reset_required()
5779 ocs_log_err(sli4->os, "error reading SLIPORT_STATUS\n"); in sli_reset_required()
5780 return -1; in sli_reset_required()
5794 * - 0 if call completed correctly and no FW error occurred.
5795 * - > 0 which indicates that a FW error has occurred.
5796 * - -1 if call failed.
5805 ocs_log_err(sli4->os, "error reading SLIPORT_SEMAPHORE register\n"); in sli_fw_error_status()
5811 if (SLI4_IF_TYPE_BE3_SKH_PF == sli4->if_type || in sli_fw_error_status()
5812 (SLI4_IF_TYPE_BE3_SKH_VF == sli4->if_type)) { in sli_fw_error_status()
5824 } else if (SLI4_IF_TYPE_LANCER_FC_ETH == sli4->if_type || in sli_fw_error_status()
5825 SLI4_IF_TYPE_LANCER_G7 == sli4->if_type) { in sli_fw_error_status()
5842 * - 0 if call completed correctly and FW is not ready.
5843 * - 1 if call completed correctly and FW is ready.
5844 * - -1 if call failed.
5850 int32_t rc = -1; in sli_fw_ready()
5855 if (SLI4_IF_TYPE_BE3_SKH_PF == sli4->if_type || in sli_fw_ready()
5856 SLI4_IF_TYPE_BE3_SKH_VF == sli4->if_type) { in sli_fw_ready()
5861 } else if (SLI4_IF_TYPE_LANCER_FC_ETH == sli4->if_type || in sli_fw_ready()
5862 SLI4_IF_TYPE_LANCER_G7 == sli4->if_type) { in sli_fw_ready()
5876 * - 0 if link is not configurable.
5877 * - 1 if link is configurable.
5916 * @param ulp The ULP to bind
5924 ocs_dma_t *qmem, uint16_t cq_id, uint16_t ulp) in sli_cmd_fcoe_wq_create() argument
5931 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_wq_create()
5943 wq->hdr.opcode = SLI4_OPC_FCOE_WQ_CREATE; in sli_cmd_fcoe_wq_create()
5944 wq->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_wq_create()
5945 wq->hdr.request_length = sizeof(sli4_req_fcoe_wq_create_t) - in sli_cmd_fcoe_wq_create()
5947 /* valid values for number of pages: 1-4 (sec 4.5.1) */ in sli_cmd_fcoe_wq_create()
5948 wq->num_pages = sli_page_count(qmem->size, SLI_PAGE_SIZE); in sli_cmd_fcoe_wq_create()
5949 if (!wq->num_pages || (wq->num_pages > SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES)) { in sli_cmd_fcoe_wq_create()
5953 wq->cq_id = cq_id; in sli_cmd_fcoe_wq_create()
5955 if (sli4->config.dual_ulp_capable) { in sli_cmd_fcoe_wq_create()
5956 wq->dua = 1; in sli_cmd_fcoe_wq_create()
5957 wq->bqu = 1; in sli_cmd_fcoe_wq_create()
5958 wq->ulp = ulp; in sli_cmd_fcoe_wq_create()
5961 for (p = 0, addr = qmem->phys; in sli_cmd_fcoe_wq_create()
5962 p < wq->num_pages; in sli_cmd_fcoe_wq_create()
5964 wq->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_fcoe_wq_create()
5965 wq->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_fcoe_wq_create()
5980 * @param ignored This parameter carries the ULP for WQ (ignored for V1)
5997 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_wq_create_v1()
6009 wq->hdr.opcode = SLI4_OPC_FCOE_WQ_CREATE; in sli_cmd_fcoe_wq_create_v1()
6010 wq->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_wq_create_v1()
6011 wq->hdr.request_length = sizeof(sli4_req_fcoe_wq_create_v1_t) - in sli_cmd_fcoe_wq_create_v1()
6013 wq->hdr.version = 1; in sli_cmd_fcoe_wq_create_v1()
6015 n_wqe = qmem->size / sli4->config.wqe_size; in sli_cmd_fcoe_wq_create_v1()
6020 switch (qmem->size) { in sli_cmd_fcoe_wq_create_v1()
6044 /* valid values for number of pages: 1-8 */ in sli_cmd_fcoe_wq_create_v1()
6045 wq->num_pages = sli_page_count(qmem->size, page_bytes); in sli_cmd_fcoe_wq_create_v1()
6046 if (!wq->num_pages || (wq->num_pages > SLI4_FCOE_WQ_CREATE_V1_MAX_PAGES)) { in sli_cmd_fcoe_wq_create_v1()
6050 wq->cq_id = cq_id; in sli_cmd_fcoe_wq_create_v1()
6052 wq->page_size = page_size; in sli_cmd_fcoe_wq_create_v1()
6054 if (sli4->config.wqe_size == SLI4_WQE_EXT_BYTES) { in sli_cmd_fcoe_wq_create_v1()
6055 wq->wqe_size = SLI4_WQE_EXT_SIZE; in sli_cmd_fcoe_wq_create_v1()
6057 wq->wqe_size = SLI4_WQE_SIZE; in sli_cmd_fcoe_wq_create_v1()
6060 wq->wqe_count = n_wqe; in sli_cmd_fcoe_wq_create_v1()
6062 for (p = 0, addr = qmem->phys; in sli_cmd_fcoe_wq_create_v1()
6063 p < wq->num_pages; in sli_cmd_fcoe_wq_create_v1()
6065 wq->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_fcoe_wq_create_v1()
6066 wq->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_fcoe_wq_create_v1()
6089 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_wq_destroy()
6101 wq->hdr.opcode = SLI4_OPC_FCOE_WQ_DESTROY; in sli_cmd_fcoe_wq_destroy()
6102 wq->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_wq_destroy()
6103 wq->hdr.request_length = sizeof(sli4_req_fcoe_wq_destroy_t) - in sli_cmd_fcoe_wq_destroy()
6106 wq->wq_id = wq_id; in sli_cmd_fcoe_wq_destroy()
6122 * @param dma DMA buffer for non-embedded mailbox command (options)
6124 * if non-embedded mbx command is used, dma buffer must be at least (32 + xri_count*16) in length
6136 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_post_sgl_pages()
6147 post = dma->virt; in sli_cmd_fcoe_post_sgl_pages()
6148 ocs_memset(post, 0, dma->size); in sli_cmd_fcoe_post_sgl_pages()
6153 post->hdr.opcode = SLI4_OPC_FCOE_POST_SGL_PAGES; in sli_cmd_fcoe_post_sgl_pages()
6154 post->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_post_sgl_pages()
6161 post->hdr.request_length = 4 + (xri_count * (sizeof(uint64_t) * 2)); in sli_cmd_fcoe_post_sgl_pages()
6163 post->xri_start = xri; in sli_cmd_fcoe_post_sgl_pages()
6164 post->xri_count = xri_count; in sli_cmd_fcoe_post_sgl_pages()
6167 post->page_set[i].page0_low = ocs_addr32_lo(page0[i]->phys); in sli_cmd_fcoe_post_sgl_pages()
6168 post->page_set[i].page0_high = ocs_addr32_hi(page0[i]->phys); in sli_cmd_fcoe_post_sgl_pages()
6173 post->page_set[i].page1_low = ocs_addr32_lo(page1[i]->phys); in sli_cmd_fcoe_post_sgl_pages()
6174 post->page_set[i].page1_high = ocs_addr32_hi(page1[i]->phys); in sli_cmd_fcoe_post_sgl_pages()
6190 * @param ulp This parameter carries the ULP for the RQ
6199 ocs_dma_t *qmem, uint16_t cq_id, uint16_t ulp, uint16_t buffer_size) in sli_cmd_fcoe_rq_create() argument
6206 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_rq_create()
6218 rq->hdr.opcode = SLI4_OPC_FCOE_RQ_CREATE; in sli_cmd_fcoe_rq_create()
6219 rq->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_rq_create()
6220 rq->hdr.request_length = sizeof(sli4_req_fcoe_rq_create_t) - in sli_cmd_fcoe_rq_create()
6222 /* valid values for number of pages: 1-8 (sec 4.5.6) */ in sli_cmd_fcoe_rq_create()
6223 rq->num_pages = sli_page_count(qmem->size, SLI_PAGE_SIZE); in sli_cmd_fcoe_rq_create()
6224 if (!rq->num_pages || (rq->num_pages > SLI4_FCOE_RQ_CREATE_V0_MAX_PAGES)) { in sli_cmd_fcoe_rq_create()
6225 ocs_log_test(sli4->os, "num_pages %d not valid\n", rq->num_pages); in sli_cmd_fcoe_rq_create()
6232 rq->rqe_count = ocs_lg2(qmem->size / SLI4_FCOE_RQE_SIZE); in sli_cmd_fcoe_rq_create()
6236 ocs_log_err(sli4->os, "buffer_size %d out of range (%d-%d)\n", in sli_cmd_fcoe_rq_create()
6240 return -1; in sli_cmd_fcoe_rq_create()
6242 rq->buffer_size = buffer_size; in sli_cmd_fcoe_rq_create()
6244 rq->cq_id = cq_id; in sli_cmd_fcoe_rq_create()
6246 if (sli4->config.dual_ulp_capable) { in sli_cmd_fcoe_rq_create()
6247 rq->dua = 1; in sli_cmd_fcoe_rq_create()
6248 rq->bqu = 1; in sli_cmd_fcoe_rq_create()
6249 rq->ulp = ulp; in sli_cmd_fcoe_rq_create()
6252 for (p = 0, addr = qmem->phys; in sli_cmd_fcoe_rq_create()
6253 p < rq->num_pages; in sli_cmd_fcoe_rq_create()
6255 rq->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_fcoe_rq_create()
6256 rq->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_fcoe_rq_create()
6271 * @param ulp This parameter carries the ULP for RQ (ignored for V1)
6280 ocs_dma_t *qmem, uint16_t cq_id, uint16_t ulp, in sli_cmd_fcoe_rq_create_v1() argument
6288 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_rq_create_v1()
6300 rq->hdr.opcode = SLI4_OPC_FCOE_RQ_CREATE; in sli_cmd_fcoe_rq_create_v1()
6301 rq->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_rq_create_v1()
6302 rq->hdr.request_length = sizeof(sli4_req_fcoe_rq_create_v1_t) - in sli_cmd_fcoe_rq_create_v1()
6304 rq->hdr.version = 1; in sli_cmd_fcoe_rq_create_v1()
6307 rq->dnb = TRUE; in sli_cmd_fcoe_rq_create_v1()
6309 /* valid values for number of pages: 1-8 (sec 4.5.6) */ in sli_cmd_fcoe_rq_create_v1()
6310 rq->num_pages = sli_page_count(qmem->size, SLI_PAGE_SIZE); in sli_cmd_fcoe_rq_create_v1()
6311 if (!rq->num_pages || (rq->num_pages > SLI4_FCOE_RQ_CREATE_V1_MAX_PAGES)) { in sli_cmd_fcoe_rq_create_v1()
6312 ocs_log_test(sli4->os, "num_pages %d not valid, max %d\n", in sli_cmd_fcoe_rq_create_v1()
6313 rq->num_pages, SLI4_FCOE_RQ_CREATE_V1_MAX_PAGES); in sli_cmd_fcoe_rq_create_v1()
6320 rq->rqe_count = qmem->size / SLI4_FCOE_RQE_SIZE; in sli_cmd_fcoe_rq_create_v1()
6322 rq->rqe_size = SLI4_FCOE_RQE_SIZE_8; in sli_cmd_fcoe_rq_create_v1()
6324 rq->page_size = SLI4_FCOE_RQ_PAGE_SIZE_4096; in sli_cmd_fcoe_rq_create_v1()
6326 if ((buffer_size < sli4->config.rq_min_buf_size) || in sli_cmd_fcoe_rq_create_v1()
6327 (buffer_size > sli4->config.rq_max_buf_size)) { in sli_cmd_fcoe_rq_create_v1()
6328 ocs_log_err(sli4->os, "buffer_size %d out of range (%d-%d)\n", in sli_cmd_fcoe_rq_create_v1()
6330 sli4->config.rq_min_buf_size, in sli_cmd_fcoe_rq_create_v1()
6331 sli4->config.rq_max_buf_size); in sli_cmd_fcoe_rq_create_v1()
6332 return -1; in sli_cmd_fcoe_rq_create_v1()
6334 rq->buffer_size = buffer_size; in sli_cmd_fcoe_rq_create_v1()
6336 rq->cq_id = cq_id; in sli_cmd_fcoe_rq_create_v1()
6338 for (p = 0, addr = qmem->phys; in sli_cmd_fcoe_rq_create_v1()
6339 p < rq->num_pages; in sli_cmd_fcoe_rq_create_v1()
6341 rq->page_physical_address[p].low = ocs_addr32_lo(addr); in sli_cmd_fcoe_rq_create_v1()
6342 rq->page_physical_address[p].high = ocs_addr32_hi(addr); in sli_cmd_fcoe_rq_create_v1()
6365 if (SLI4_PORT_TYPE_FC == sli4->port_type) { in sli_cmd_fcoe_rq_destroy()
6377 rq->hdr.opcode = SLI4_OPC_FCOE_RQ_DESTROY; in sli_cmd_fcoe_rq_destroy()
6378 rq->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_rq_destroy()
6379 rq->hdr.request_length = sizeof(sli4_req_fcoe_rq_destroy_t) - in sli_cmd_fcoe_rq_destroy()
6382 rq->rq_id = rq_id; in sli_cmd_fcoe_rq_destroy()
6409 if (SLI4_PORT_TYPE_FC != sli4->port_type) { in sli_cmd_fcoe_read_fcf_table()
6410 ocs_log_test(sli4->os, "FCOE_READ_FCF_TABLE only supported on FC\n"); in sli_cmd_fcoe_read_fcf_table()
6411 return -1; in sli_cmd_fcoe_read_fcf_table()
6414 read_fcf = dma->virt; in sli_cmd_fcoe_read_fcf_table()
6418 read_fcf->hdr.opcode = SLI4_OPC_FCOE_READ_FCF_TABLE; in sli_cmd_fcoe_read_fcf_table()
6419 read_fcf->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_read_fcf_table()
6420 read_fcf->hdr.request_length = dma->size - in sli_cmd_fcoe_read_fcf_table()
6422 read_fcf->fcf_index = index; in sli_cmd_fcoe_read_fcf_table()
6451 page_count = sli_page_count(dma->size, SLI_PAGE_SIZE); in sli_cmd_fcoe_post_hdr_templates()
6458 command, it has to be non-embedded */ in sli_cmd_fcoe_post_hdr_templates()
6459 if (ocs_dma_alloc(sli4->os, payload_dma, payload_size, 4)) { in sli_cmd_fcoe_post_hdr_templates()
6460 ocs_log_err(sli4->os, "mailbox payload memory allocation fail\n"); in sli_cmd_fcoe_post_hdr_templates()
6464 template = (sli4_req_fcoe_post_hdr_templates_t *)payload_dma->virt; in sli_cmd_fcoe_post_hdr_templates()
6471 rpi = sli4->config.extent[SLI_RSRC_FCOE_RPI].base[0]; in sli_cmd_fcoe_post_hdr_templates()
6474 template->hdr.opcode = SLI4_OPC_FCOE_POST_HDR_TEMPLATES; in sli_cmd_fcoe_post_hdr_templates()
6475 template->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_post_hdr_templates()
6476 template->hdr.request_length = sizeof(sli4_req_fcoe_post_hdr_templates_t) - in sli_cmd_fcoe_post_hdr_templates()
6479 template->rpi_offset = rpi; in sli_cmd_fcoe_post_hdr_templates()
6480 template->page_count = page_count; in sli_cmd_fcoe_post_hdr_templates()
6481 phys = dma->phys; in sli_cmd_fcoe_post_hdr_templates()
6482 for (i = 0; i < template->page_count; i++) { in sli_cmd_fcoe_post_hdr_templates()
6483 template->page_descriptor[i].low = ocs_addr32_lo(phys); in sli_cmd_fcoe_post_hdr_templates()
6484 template->page_descriptor[i].high = ocs_addr32_hi(phys); in sli_cmd_fcoe_post_hdr_templates()
6504 redisc->hdr.opcode = SLI4_OPC_FCOE_REDISCOVER_FCF; in sli_cmd_fcoe_rediscover_fcf()
6505 redisc->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_cmd_fcoe_rediscover_fcf()
6506 redisc->hdr.request_length = sizeof(sli4_req_fcoe_rediscover_fcf_t) - in sli_cmd_fcoe_rediscover_fcf()
6510 redisc->fcf_count = 0; in sli_cmd_fcoe_rediscover_fcf()
6512 redisc->fcf_count = 1; in sli_cmd_fcoe_rediscover_fcf()
6513 redisc->fcf_index[0] = index; in sli_cmd_fcoe_rediscover_fcf()
6535 * @return Returns 0 on success, or a non-zero value on failure.
6547 abort->criteria = SLI4_ABORT_CRITERIA_XRI_TAG; in sli_abort_wqe()
6549 ocs_log_warn(sli4->os, "warning non-zero mask %#x when aborting XRI %#x\n", mask, ids); in sli_abort_wqe()
6554 abort->criteria = SLI4_ABORT_CRITERIA_ABORT_TAG; in sli_abort_wqe()
6557 abort->criteria = SLI4_ABORT_CRITERIA_REQUEST_TAG; in sli_abort_wqe()
6560 ocs_log_test(sli4->os, "unsupported type %#x\n", type); in sli_abort_wqe()
6561 return -1; in sli_abort_wqe()
6564 abort->ia = send_abts ? 0 : 1; in sli_abort_wqe()
6567 abort->ir = 1; in sli_abort_wqe()
6569 abort->t_mask = mask; in sli_abort_wqe()
6570 abort->t_tag = ids; in sli_abort_wqe()
6571 abort->command = SLI4_WQE_ABORT; in sli_abort_wqe()
6572 abort->request_tag = tag; in sli_abort_wqe()
6573 abort->qosd = TRUE; in sli_abort_wqe()
6574 abort->cq_id = cq_id; in sli_abort_wqe()
6575 abort->cmd_type = SLI4_CMD_ABORT_WQE; in sli_abort_wqe()
6591 * @param timeout Time, in seconds, before an IO times out. Zero means 2 * R_A_TOV.
6597 * @return Returns 0 on success, or a non-zero value on failure.
6601 uint32_t req_len, uint32_t max_rsp_len, uint8_t timeout, in sli_els_request64_wqe() argument
6605 sli4_sge_t *sge = sgl->virt; in sli_els_request64_wqe()
6610 if (sli4->config.sgl_pre_registered) { in sli_els_request64_wqe()
6611 els->xbl = FALSE; in sli_els_request64_wqe()
6613 els->dbde = TRUE; in sli_els_request64_wqe()
6614 els->els_request_payload.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_els_request64_wqe()
6616 els->els_request_payload.buffer_length = req_len; in sli_els_request64_wqe()
6617 els->els_request_payload.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_els_request64_wqe()
6618 els->els_request_payload.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_els_request64_wqe()
6620 els->xbl = TRUE; in sli_els_request64_wqe()
6622 els->els_request_payload.bde_type = SLI4_BDE_TYPE_BLP; in sli_els_request64_wqe()
6624 els->els_request_payload.buffer_length = 2 * sizeof(sli4_sge_t); in sli_els_request64_wqe()
6625 els->els_request_payload.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_els_request64_wqe()
6626 els->els_request_payload.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_els_request64_wqe()
6629 els->els_request_payload_length = req_len; in sli_els_request64_wqe()
6630 els->max_response_payload_length = max_rsp_len; in sli_els_request64_wqe()
6632 els->xri_tag = xri; in sli_els_request64_wqe()
6633 els->timer = timeout; in sli_els_request64_wqe()
6634 els->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_els_request64_wqe()
6636 els->command = SLI4_WQE_ELS_REQUEST64; in sli_els_request64_wqe()
6638 els->request_tag = tag; in sli_els_request64_wqe()
6640 if (rnode->node_group) { in sli_els_request64_wqe()
6641 els->hlm = TRUE; in sli_els_request64_wqe()
6642 els->remote_id = rnode->fc_id & 0x00ffffff; in sli_els_request64_wqe()
6645 els->iod = SLI4_ELS_REQUEST64_DIR_READ; in sli_els_request64_wqe()
6647 els->qosd = TRUE; in sli_els_request64_wqe()
6653 els->els_id = SLI4_ELS_REQUEST64_LOGO; in sli_els_request64_wqe()
6654 if (rnode->attached) { in sli_els_request64_wqe()
6655 els->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_els_request64_wqe()
6656 els->context_tag = rnode->indicator; in sli_els_request64_wqe()
6658 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_els_request64_wqe()
6659 els->context_tag = rnode->sport->indicator; in sli_els_request64_wqe()
6661 if (FC_ADDR_FABRIC == rnode->fc_id) { in sli_els_request64_wqe()
6666 if (FC_ADDR_FABRIC == rnode->fc_id) { in sli_els_request64_wqe()
6669 if (0 == rnode->sport->fc_id) { in sli_els_request64_wqe()
6670 els->els_id = SLI4_ELS_REQUEST64_FDISC; in sli_els_request64_wqe()
6673 els->els_id = SLI4_ELS_REQUEST64_OTHER; in sli_els_request64_wqe()
6675 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_els_request64_wqe()
6676 els->context_tag = rnode->sport->indicator; in sli_els_request64_wqe()
6677 els->sp = TRUE; in sli_els_request64_wqe()
6680 els->els_id = SLI4_ELS_REQUEST64_FLOGIN; in sli_els_request64_wqe()
6682 if (SLI4_IF_TYPE_BE3_SKH_PF == sli4->if_type) { in sli_els_request64_wqe()
6683 if (!rnode->sport->domain) { in sli_els_request64_wqe()
6684 ocs_log_test(sli4->os, "invalid domain handle\n"); in sli_els_request64_wqe()
6685 return -1; in sli_els_request64_wqe()
6691 els->ct = SLI4_ELS_REQUEST64_CONTEXT_FCFI; in sli_els_request64_wqe()
6692 els->context_tag = rnode->sport->domain->fcf_indicator; in sli_els_request64_wqe()
6693 els->sp = TRUE; in sli_els_request64_wqe()
6695 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_els_request64_wqe()
6696 els->context_tag = rnode->sport->indicator; in sli_els_request64_wqe()
6706 els->sp = TRUE; in sli_els_request64_wqe()
6707 if (rnode->sport->fc_id != UINT32_MAX) { in sli_els_request64_wqe()
6708 els->sid = rnode->sport->fc_id; in sli_els_request64_wqe()
6713 els->els_id = SLI4_ELS_REQUEST64_PLOGI; in sli_els_request64_wqe()
6714 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_els_request64_wqe()
6715 els->context_tag = rnode->sport->indicator; in sli_els_request64_wqe()
6718 els->els_id = SLI4_ELS_REQUEST64_OTHER; in sli_els_request64_wqe()
6719 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_els_request64_wqe()
6720 els->context_tag = rnode->sport->indicator; in sli_els_request64_wqe()
6723 els->els_id = SLI4_ELS_REQUEST64_OTHER; in sli_els_request64_wqe()
6724 if (rnode->attached) { in sli_els_request64_wqe()
6725 els->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_els_request64_wqe()
6726 els->context_tag = rnode->indicator; in sli_els_request64_wqe()
6728 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_els_request64_wqe()
6729 els->context_tag = rnode->sport->indicator; in sli_els_request64_wqe()
6735 els->cmd_type = SLI4_ELS_REQUEST64_CMD_FABRIC; in sli_els_request64_wqe()
6737 els->cmd_type = SLI4_ELS_REQUEST64_CMD_NON_FABRIC; in sli_els_request64_wqe()
6740 els->cq_id = cq_id; in sli_els_request64_wqe()
6742 if (SLI4_ELS_REQUEST64_CONTEXT_RPI != els->ct) { in sli_els_request64_wqe()
6743 els->remote_id = rnode->fc_id; in sli_els_request64_wqe()
6745 if (SLI4_ELS_REQUEST64_CONTEXT_VPI == els->ct) { in sli_els_request64_wqe()
6746 els->temporary_rpi = rnode->indicator; in sli_els_request64_wqe()
6765 * @param timeout Time, in seconds, before an IO times out. Zero means no timeout.
6767 * @return Returns 0 on success, or a non-zero value on failure.
6772 uint32_t rpi, ocs_remote_node_t *rnode, uint8_t timeout) in sli_fcp_icmnd64_wqe() argument
6779 if (!sgl || !sgl->virt) { in sli_fcp_icmnd64_wqe()
6780 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_fcp_icmnd64_wqe()
6781 sgl, sgl ? sgl->virt : NULL); in sli_fcp_icmnd64_wqe()
6782 return -1; in sli_fcp_icmnd64_wqe()
6784 sge = sgl->virt; in sli_fcp_icmnd64_wqe()
6786 if (sli4->config.sgl_pre_registered) { in sli_fcp_icmnd64_wqe()
6787 icmnd->xbl = FALSE; in sli_fcp_icmnd64_wqe()
6789 icmnd->dbde = TRUE; in sli_fcp_icmnd64_wqe()
6790 icmnd->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_icmnd64_wqe()
6792 icmnd->bde.buffer_length = sge[0].buffer_length; in sli_fcp_icmnd64_wqe()
6793 icmnd->bde.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_fcp_icmnd64_wqe()
6794 icmnd->bde.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_fcp_icmnd64_wqe()
6796 icmnd->xbl = TRUE; in sli_fcp_icmnd64_wqe()
6798 icmnd->bde.bde_type = SLI4_BDE_TYPE_BLP; in sli_fcp_icmnd64_wqe()
6800 icmnd->bde.buffer_length = sgl->size; in sli_fcp_icmnd64_wqe()
6801 icmnd->bde.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_fcp_icmnd64_wqe()
6802 icmnd->bde.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_fcp_icmnd64_wqe()
6805 icmnd->payload_offset_length = sge[0].buffer_length + sge[1].buffer_length; in sli_fcp_icmnd64_wqe()
6806 icmnd->xri_tag = xri; in sli_fcp_icmnd64_wqe()
6807 icmnd->context_tag = rpi; in sli_fcp_icmnd64_wqe()
6808 icmnd->timer = timeout; in sli_fcp_icmnd64_wqe()
6810 icmnd->pu = 2; /* WQE word 4 contains read transfer length */ in sli_fcp_icmnd64_wqe()
6811 icmnd->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_fcp_icmnd64_wqe()
6812 icmnd->command = SLI4_WQE_FCP_ICMND64; in sli_fcp_icmnd64_wqe()
6813 icmnd->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_fcp_icmnd64_wqe()
6815 icmnd->abort_tag = xri; in sli_fcp_icmnd64_wqe()
6817 icmnd->request_tag = tag; in sli_fcp_icmnd64_wqe()
6818 icmnd->len_loc = 3; in sli_fcp_icmnd64_wqe()
6819 if (rnode->node_group) { in sli_fcp_icmnd64_wqe()
6820 icmnd->hlm = TRUE; in sli_fcp_icmnd64_wqe()
6821 icmnd->remote_n_port_id = rnode->fc_id & 0x00ffffff; in sli_fcp_icmnd64_wqe()
6823 if (((ocs_node_t *)rnode->node)->fcp2device) { in sli_fcp_icmnd64_wqe()
6824 icmnd->erp = TRUE; in sli_fcp_icmnd64_wqe()
6826 icmnd->cmd_type = SLI4_CMD_FCP_ICMND64_WQE; in sli_fcp_icmnd64_wqe()
6827 icmnd->cq_id = cq_id; in sli_fcp_icmnd64_wqe()
6849 * @param timeout Time, in seconds, before an IO times out. Zero means no timeout.
6851 * @return Returns 0 on success, or a non-zero value on failure.
6857 uint8_t dif, uint8_t bs, uint8_t timeout) in sli_fcp_iread64_wqe() argument
6864 if (!sgl || !sgl->virt) { in sli_fcp_iread64_wqe()
6865 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_fcp_iread64_wqe()
6866 sgl, sgl ? sgl->virt : NULL); in sli_fcp_iread64_wqe()
6867 return -1; in sli_fcp_iread64_wqe()
6869 sge = sgl->virt; in sli_fcp_iread64_wqe()
6871 if (sli4->config.sgl_pre_registered) { in sli_fcp_iread64_wqe()
6872 iread->xbl = FALSE; in sli_fcp_iread64_wqe()
6874 iread->dbde = TRUE; in sli_fcp_iread64_wqe()
6875 iread->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_iread64_wqe()
6877 iread->bde.buffer_length = sge[0].buffer_length; in sli_fcp_iread64_wqe()
6878 iread->bde.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_fcp_iread64_wqe()
6879 iread->bde.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_fcp_iread64_wqe()
6881 iread->xbl = TRUE; in sli_fcp_iread64_wqe()
6883 iread->bde.bde_type = SLI4_BDE_TYPE_BLP; in sli_fcp_iread64_wqe()
6885 iread->bde.buffer_length = sgl->size; in sli_fcp_iread64_wqe()
6886 iread->bde.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_fcp_iread64_wqe()
6887 iread->bde.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_fcp_iread64_wqe()
6891 iread->fcp_cmd_buffer_length = sge[0].buffer_length; in sli_fcp_iread64_wqe()
6895 iread->payload_offset_length = sge[0].buffer_length + sge[1].buffer_length; in sli_fcp_iread64_wqe()
6896 iread->total_transfer_length = xfer_len; in sli_fcp_iread64_wqe()
6898 iread->xri_tag = xri; in sli_fcp_iread64_wqe()
6899 iread->context_tag = rpi; in sli_fcp_iread64_wqe()
6901 iread->timer = timeout; in sli_fcp_iread64_wqe()
6903 iread->pu = 2; /* WQE word 4 contains read transfer length */ in sli_fcp_iread64_wqe()
6904 iread->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_fcp_iread64_wqe()
6905 iread->command = SLI4_WQE_FCP_IREAD64; in sli_fcp_iread64_wqe()
6906 iread->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_fcp_iread64_wqe()
6907 iread->dif = dif; in sli_fcp_iread64_wqe()
6908 iread->bs = bs; in sli_fcp_iread64_wqe()
6910 iread->abort_tag = xri; in sli_fcp_iread64_wqe()
6912 iread->request_tag = tag; in sli_fcp_iread64_wqe()
6913 iread->len_loc = 3; in sli_fcp_iread64_wqe()
6914 if (rnode->node_group) { in sli_fcp_iread64_wqe()
6915 iread->hlm = TRUE; in sli_fcp_iread64_wqe()
6916 iread->remote_n_port_id = rnode->fc_id & 0x00ffffff; in sli_fcp_iread64_wqe()
6918 if (((ocs_node_t *)rnode->node)->fcp2device) { in sli_fcp_iread64_wqe()
6919 iread->erp = TRUE; in sli_fcp_iread64_wqe()
6921 iread->iod = 1; in sli_fcp_iread64_wqe()
6922 iread->cmd_type = SLI4_CMD_FCP_IREAD64_WQE; in sli_fcp_iread64_wqe()
6923 iread->cq_id = cq_id; in sli_fcp_iread64_wqe()
6925 if (sli4->config.perf_hint) { in sli_fcp_iread64_wqe()
6926 iread->first_data_bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_iread64_wqe()
6927 iread->first_data_bde.buffer_length = sge[first_data_sge].buffer_length; in sli_fcp_iread64_wqe()
6928 iread->first_data_bde.u.data.buffer_address_low = sge[first_data_sge].buffer_address_low; in sli_fcp_iread64_wqe()
6929 iread->first_data_bde.u.data.buffer_address_high = sge[first_data_sge].buffer_address_high; in sli_fcp_iread64_wqe()
6953 * @param timeout Time, in seconds, before an IO times out. Zero means no timeout.
6955 * @return Returns 0 on success, or a non-zero value on failure.
6961 uint8_t dif, uint8_t bs, uint8_t timeout) in sli_fcp_iwrite64_wqe() argument
6968 if (!sgl || !sgl->virt) { in sli_fcp_iwrite64_wqe()
6969 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_fcp_iwrite64_wqe()
6970 sgl, sgl ? sgl->virt : NULL); in sli_fcp_iwrite64_wqe()
6971 return -1; in sli_fcp_iwrite64_wqe()
6973 sge = sgl->virt; in sli_fcp_iwrite64_wqe()
6975 if (sli4->config.sgl_pre_registered) { in sli_fcp_iwrite64_wqe()
6976 iwrite->xbl = FALSE; in sli_fcp_iwrite64_wqe()
6978 iwrite->dbde = TRUE; in sli_fcp_iwrite64_wqe()
6979 iwrite->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_iwrite64_wqe()
6981 iwrite->bde.buffer_length = sge[0].buffer_length; in sli_fcp_iwrite64_wqe()
6982 iwrite->bde.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_fcp_iwrite64_wqe()
6983 iwrite->bde.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_fcp_iwrite64_wqe()
6985 iwrite->xbl = TRUE; in sli_fcp_iwrite64_wqe()
6987 iwrite->bde.bde_type = SLI4_BDE_TYPE_BLP; in sli_fcp_iwrite64_wqe()
6989 iwrite->bde.buffer_length = sgl->size; in sli_fcp_iwrite64_wqe()
6990 iwrite->bde.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_fcp_iwrite64_wqe()
6991 iwrite->bde.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_fcp_iwrite64_wqe()
6995 iwrite->fcp_cmd_buffer_length = sge[0].buffer_length; in sli_fcp_iwrite64_wqe()
6999 iwrite->payload_offset_length = sge[0].buffer_length + sge[1].buffer_length; in sli_fcp_iwrite64_wqe()
7000 iwrite->total_transfer_length = xfer_len; in sli_fcp_iwrite64_wqe()
7001 iwrite->initial_transfer_length = MIN(xfer_len, first_burst); in sli_fcp_iwrite64_wqe()
7003 iwrite->xri_tag = xri; in sli_fcp_iwrite64_wqe()
7004 iwrite->context_tag = rpi; in sli_fcp_iwrite64_wqe()
7006 iwrite->timer = timeout; in sli_fcp_iwrite64_wqe()
7008 iwrite->pu = 2; /* WQE word 4 contains read transfer length */ in sli_fcp_iwrite64_wqe()
7009 iwrite->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_fcp_iwrite64_wqe()
7010 iwrite->command = SLI4_WQE_FCP_IWRITE64; in sli_fcp_iwrite64_wqe()
7011 iwrite->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_fcp_iwrite64_wqe()
7012 iwrite->dif = dif; in sli_fcp_iwrite64_wqe()
7013 iwrite->bs = bs; in sli_fcp_iwrite64_wqe()
7015 iwrite->abort_tag = xri; in sli_fcp_iwrite64_wqe()
7017 iwrite->request_tag = tag; in sli_fcp_iwrite64_wqe()
7018 iwrite->len_loc = 3; in sli_fcp_iwrite64_wqe()
7019 if (rnode->node_group) { in sli_fcp_iwrite64_wqe()
7020 iwrite->hlm = TRUE; in sli_fcp_iwrite64_wqe()
7021 iwrite->remote_n_port_id = rnode->fc_id & 0x00ffffff; in sli_fcp_iwrite64_wqe()
7023 if (((ocs_node_t *)rnode->node)->fcp2device) { in sli_fcp_iwrite64_wqe()
7024 iwrite->erp = TRUE; in sli_fcp_iwrite64_wqe()
7026 iwrite->cmd_type = SLI4_CMD_FCP_IWRITE64_WQE; in sli_fcp_iwrite64_wqe()
7027 iwrite->cq_id = cq_id; in sli_fcp_iwrite64_wqe()
7029 if (sli4->config.perf_hint) { in sli_fcp_iwrite64_wqe()
7030 iwrite->first_data_bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_iwrite64_wqe()
7031 iwrite->first_data_bde.buffer_length = sge[first_data_sge].buffer_length; in sli_fcp_iwrite64_wqe()
7032 iwrite->first_data_bde.u.data.buffer_address_low = sge[first_data_sge].buffer_address_low; in sli_fcp_iwrite64_wqe()
7033 iwrite->first_data_bde.u.data.buffer_address_high = sge[first_data_sge].buffer_address_high; in sli_fcp_iwrite64_wqe()
7046 * @param sgl DMA memory for the Scatter-Gather List.
7057 * - ACTIVE - IO is already active.
7058 * - AUTO RSP - Automatically generate a good FCP_RSP.
7064 * @return Returns 0 on success, or a non-zero value on failure.
7078 if (!sgl || !sgl->virt) { in sli_fcp_treceive64_wqe()
7079 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_fcp_treceive64_wqe()
7080 sgl, sgl ? sgl->virt : NULL); in sli_fcp_treceive64_wqe()
7081 return -1; in sli_fcp_treceive64_wqe()
7083 sge = sgl->virt; in sli_fcp_treceive64_wqe()
7085 if (sli4->config.sgl_pre_registered) { in sli_fcp_treceive64_wqe()
7086 trecv->xbl = FALSE; in sli_fcp_treceive64_wqe()
7088 trecv->dbde = TRUE; in sli_fcp_treceive64_wqe()
7089 trecv->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_treceive64_wqe()
7091 trecv->bde.buffer_length = sge[0].buffer_length; in sli_fcp_treceive64_wqe()
7092 trecv->bde.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_fcp_treceive64_wqe()
7093 trecv->bde.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_fcp_treceive64_wqe()
7095 trecv->payload_offset_length = sge[0].buffer_length; in sli_fcp_treceive64_wqe()
7097 trecv->xbl = TRUE; in sli_fcp_treceive64_wqe()
7101 trecv->dbde = TRUE; in sli_fcp_treceive64_wqe()
7102 trecv->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_treceive64_wqe()
7104 trecv->bde.buffer_length = sge[2].buffer_length; in sli_fcp_treceive64_wqe()
7105 trecv->bde.u.data.buffer_address_low = sge[2].buffer_address_low; in sli_fcp_treceive64_wqe()
7106 trecv->bde.u.data.buffer_address_high = sge[2].buffer_address_high; in sli_fcp_treceive64_wqe()
7108 trecv->bde.bde_type = SLI4_BDE_TYPE_BLP; in sli_fcp_treceive64_wqe()
7109 trecv->bde.buffer_length = sgl->size; in sli_fcp_treceive64_wqe()
7110 trecv->bde.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_fcp_treceive64_wqe()
7111 trecv->bde.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_fcp_treceive64_wqe()
7115 trecv->relative_offset = relative_off; in sli_fcp_treceive64_wqe()
7118 trecv->xc = TRUE; in sli_fcp_treceive64_wqe()
7120 trecv->xri_tag = xri; in sli_fcp_treceive64_wqe()
7122 trecv->context_tag = rpi; in sli_fcp_treceive64_wqe()
7124 trecv->pu = TRUE; /* WQE uses relative offset */ in sli_fcp_treceive64_wqe()
7127 trecv->ar = TRUE; in sli_fcp_treceive64_wqe()
7130 trecv->command = SLI4_WQE_FCP_TRECEIVE64; in sli_fcp_treceive64_wqe()
7131 trecv->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_fcp_treceive64_wqe()
7132 trecv->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_fcp_treceive64_wqe()
7133 trecv->dif = dif; in sli_fcp_treceive64_wqe()
7134 trecv->bs = bs; in sli_fcp_treceive64_wqe()
7136 trecv->remote_xid = xid; in sli_fcp_treceive64_wqe()
7138 trecv->request_tag = tag; in sli_fcp_treceive64_wqe()
7140 trecv->iod = 1; in sli_fcp_treceive64_wqe()
7142 trecv->len_loc = 0x2; in sli_fcp_treceive64_wqe()
7144 if (rnode->node_group) { in sli_fcp_treceive64_wqe()
7145 trecv->hlm = TRUE; in sli_fcp_treceive64_wqe()
7146 trecv->dword5.dword = rnode->fc_id & 0x00ffffff; in sli_fcp_treceive64_wqe()
7149 trecv->cmd_type = SLI4_CMD_FCP_TRECEIVE64_WQE; in sli_fcp_treceive64_wqe()
7151 trecv->cq_id = cq_id; in sli_fcp_treceive64_wqe()
7153 trecv->fcp_data_receive_length = xfer_len; in sli_fcp_treceive64_wqe()
7155 if (sli4->config.perf_hint) { in sli_fcp_treceive64_wqe()
7156 trecv->first_data_bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_treceive64_wqe()
7157 trecv->first_data_bde.buffer_length = sge[first_data_sge].buffer_length; in sli_fcp_treceive64_wqe()
7158 trecv->first_data_bde.u.data.buffer_address_low = sge[first_data_sge].buffer_address_low; in sli_fcp_treceive64_wqe()
7159 trecv->first_data_bde.u.data.buffer_address_high = sge[first_data_sge].buffer_address_high; in sli_fcp_treceive64_wqe()
7164 trecv->ccpe = 1; in sli_fcp_treceive64_wqe()
7165 trecv->ccp = (csctl & SLI4_MASK_CCP); in sli_fcp_treceive64_wqe()
7168 if (app_id && (sli4->config.wqe_size == SLI4_WQE_EXT_BYTES) && !trecv->eat) { in sli_fcp_treceive64_wqe()
7169 trecv->app_id_valid = 1; in sli_fcp_treceive64_wqe()
7170 trecv->wqes = 1; in sli_fcp_treceive64_wqe()
7171 trecv_128->dw[31] = app_id; in sli_fcp_treceive64_wqe()
7183 * @param sgl DMA memory for the Scatter-Gather List.
7195 * - ACTIVE - IO is already active.
7196 * - AUTO RSP - Automatically generate a good FCP_RSP.
7202 * @return Returns 0 on success, or a non-zero value on failure.
7217 trecv->command = SLI4_WQE_FCP_CONT_TRECEIVE64; in sli_fcp_cont_treceive64_wqe()
7218 trecv->dword5.sec_xri_tag = sec_xri; in sli_fcp_cont_treceive64_wqe()
7230 * @param sgl DMA memory for the Scatter-Gather List.
7239 * - ACTIVE - IO is already active
7240 * - AUTO RSP - Automatically generate a good FCP_RSP.
7245 * @return Returns 0 on success, or a non-zero value on failure.
7258 trsp->ag = TRUE; in sli_fcp_trsp64_wqe()
7260 * The SLI-4 documentation states that the BDE is ignored when in sli_fcp_trsp64_wqe()
7261 * using auto-good response, but, at least for IF_TYPE 0 devices, in sli_fcp_trsp64_wqe()
7264 if (SLI4_IF_TYPE_BE3_SKH_PF == sli4->if_type) { in sli_fcp_trsp64_wqe()
7265 trsp->bde.buffer_length = 12; /* byte size of RSP */ in sli_fcp_trsp64_wqe()
7268 sli4_sge_t *sge = sgl->virt; in sli_fcp_trsp64_wqe()
7270 if (sli4->config.sgl_pre_registered || port_owned) { in sli_fcp_trsp64_wqe()
7271 trsp->dbde = TRUE; in sli_fcp_trsp64_wqe()
7273 trsp->xbl = TRUE; in sli_fcp_trsp64_wqe()
7276 trsp->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_trsp64_wqe()
7277 trsp->bde.buffer_length = sge[0].buffer_length; in sli_fcp_trsp64_wqe()
7278 trsp->bde.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_fcp_trsp64_wqe()
7279 trsp->bde.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_fcp_trsp64_wqe()
7281 trsp->fcp_response_length = rsp_len; in sli_fcp_trsp64_wqe()
7285 trsp->xc = TRUE; in sli_fcp_trsp64_wqe()
7288 if (rnode->node_group) { in sli_fcp_trsp64_wqe()
7289 trsp->hlm = TRUE; in sli_fcp_trsp64_wqe()
7290 trsp->dword5 = rnode->fc_id & 0x00ffffff; in sli_fcp_trsp64_wqe()
7293 trsp->xri_tag = xri; in sli_fcp_trsp64_wqe()
7294 trsp->rpi = rpi; in sli_fcp_trsp64_wqe()
7296 trsp->command = SLI4_WQE_FCP_TRSP64; in sli_fcp_trsp64_wqe()
7297 trsp->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_fcp_trsp64_wqe()
7299 trsp->remote_xid = xid; in sli_fcp_trsp64_wqe()
7300 trsp->request_tag = tag; in sli_fcp_trsp64_wqe()
7301 trsp->dnrx = ((flags & SLI4_IO_DNRX) == 0 ? 0 : 1); in sli_fcp_trsp64_wqe()
7302 trsp->len_loc = 0x1; in sli_fcp_trsp64_wqe()
7303 trsp->cq_id = cq_id; in sli_fcp_trsp64_wqe()
7304 trsp->cmd_type = SLI4_CMD_FCP_TRSP64_WQE; in sli_fcp_trsp64_wqe()
7308 trsp->ccpe = 1; in sli_fcp_trsp64_wqe()
7309 trsp->ccp = (csctl & SLI4_MASK_CCP); in sli_fcp_trsp64_wqe()
7312 if (app_id && (sli4->config.wqe_size == SLI4_WQE_EXT_BYTES) && !trsp->eat) { in sli_fcp_trsp64_wqe()
7313 trsp->app_id_valid = 1; in sli_fcp_trsp64_wqe()
7314 trsp->wqes = 1; in sli_fcp_trsp64_wqe()
7315 trsp_128->dw[31] = app_id; in sli_fcp_trsp64_wqe()
7338 * - ACTIVE - IO is already active.
7339 * - AUTO RSP - Automatically generate a good FCP_RSP.
7345 * @return Returns 0 on success, or a non-zero value on failure.
7359 if (!sgl || !sgl->virt) { in sli_fcp_tsend64_wqe()
7360 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_fcp_tsend64_wqe()
7361 sgl, sgl ? sgl->virt : NULL); in sli_fcp_tsend64_wqe()
7362 return -1; in sli_fcp_tsend64_wqe()
7364 sge = sgl->virt; in sli_fcp_tsend64_wqe()
7366 if (sli4->config.sgl_pre_registered) { in sli_fcp_tsend64_wqe()
7367 tsend->xbl = FALSE; in sli_fcp_tsend64_wqe()
7369 tsend->dbde = TRUE; in sli_fcp_tsend64_wqe()
7370 tsend->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_tsend64_wqe()
7374 tsend->bde.buffer_length = sge[2].buffer_length; in sli_fcp_tsend64_wqe()
7375 tsend->bde.u.data.buffer_address_low = sge[2].buffer_address_low; in sli_fcp_tsend64_wqe()
7376 tsend->bde.u.data.buffer_address_high = sge[2].buffer_address_high; in sli_fcp_tsend64_wqe()
7378 tsend->xbl = TRUE; in sli_fcp_tsend64_wqe()
7382 tsend->dbde = TRUE; in sli_fcp_tsend64_wqe()
7383 tsend->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_tsend64_wqe()
7386 tsend->bde.buffer_length = sge[2].buffer_length; in sli_fcp_tsend64_wqe()
7387 tsend->bde.u.data.buffer_address_low = sge[2].buffer_address_low; in sli_fcp_tsend64_wqe()
7388 tsend->bde.u.data.buffer_address_high = sge[2].buffer_address_high; in sli_fcp_tsend64_wqe()
7390 tsend->bde.bde_type = SLI4_BDE_TYPE_BLP; in sli_fcp_tsend64_wqe()
7391 tsend->bde.buffer_length = sgl->size; in sli_fcp_tsend64_wqe()
7392 tsend->bde.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_fcp_tsend64_wqe()
7393 tsend->bde.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_fcp_tsend64_wqe()
7397 tsend->relative_offset = relative_off; in sli_fcp_tsend64_wqe()
7400 tsend->xc = TRUE; in sli_fcp_tsend64_wqe()
7402 tsend->xri_tag = xri; in sli_fcp_tsend64_wqe()
7404 tsend->rpi = rpi; in sli_fcp_tsend64_wqe()
7406 tsend->pu = TRUE; /* WQE uses relative offset */ in sli_fcp_tsend64_wqe()
7409 tsend->ar = TRUE; in sli_fcp_tsend64_wqe()
7412 tsend->command = SLI4_WQE_FCP_TSEND64; in sli_fcp_tsend64_wqe()
7413 tsend->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_fcp_tsend64_wqe()
7414 tsend->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_fcp_tsend64_wqe()
7415 tsend->dif = dif; in sli_fcp_tsend64_wqe()
7416 tsend->bs = bs; in sli_fcp_tsend64_wqe()
7418 tsend->remote_xid = xid; in sli_fcp_tsend64_wqe()
7420 tsend->request_tag = tag; in sli_fcp_tsend64_wqe()
7422 tsend->len_loc = 0x2; in sli_fcp_tsend64_wqe()
7424 if (rnode->node_group) { in sli_fcp_tsend64_wqe()
7425 tsend->hlm = TRUE; in sli_fcp_tsend64_wqe()
7426 tsend->dword5 = rnode->fc_id & 0x00ffffff; in sli_fcp_tsend64_wqe()
7429 tsend->cq_id = cq_id; in sli_fcp_tsend64_wqe()
7431 tsend->cmd_type = SLI4_CMD_FCP_TSEND64_WQE; in sli_fcp_tsend64_wqe()
7433 tsend->fcp_data_transmit_length = xfer_len; in sli_fcp_tsend64_wqe()
7435 if (sli4->config.perf_hint) { in sli_fcp_tsend64_wqe()
7436 tsend->first_data_bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_fcp_tsend64_wqe()
7437 tsend->first_data_bde.buffer_length = sge[first_data_sge].buffer_length; in sli_fcp_tsend64_wqe()
7438 tsend->first_data_bde.u.data.buffer_address_low = sge[first_data_sge].buffer_address_low; in sli_fcp_tsend64_wqe()
7439 tsend->first_data_bde.u.data.buffer_address_high = sge[first_data_sge].buffer_address_high; in sli_fcp_tsend64_wqe()
7444 tsend->ccpe = 1; in sli_fcp_tsend64_wqe()
7445 tsend->ccp = (csctl & SLI4_MASK_CCP); in sli_fcp_tsend64_wqe()
7448 if (app_id && (sli4->config.wqe_size == SLI4_WQE_EXT_BYTES) && !tsend->eat) { in sli_fcp_tsend64_wqe()
7449 tsend->app_id_valid = 1; in sli_fcp_tsend64_wqe()
7450 tsend->wqes = 1; in sli_fcp_tsend64_wqe()
7451 tsend_128->dw[31] = app_id; in sli_fcp_tsend64_wqe()
7460 * @note This WQE is only used to send FC-CT commands.
7468 * @param timeout Time, in seconds, before an IO times out. Zero means infinite.
7477 * @return Returns 0 on success, or a non-zero value on failure.
7481 uint32_t req_len, uint32_t max_rsp_len, uint8_t timeout, in sli_gen_request64_wqe() argument
7490 if (!sgl || !sgl->virt) { in sli_gen_request64_wqe()
7491 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_gen_request64_wqe()
7492 sgl, sgl ? sgl->virt : NULL); in sli_gen_request64_wqe()
7493 return -1; in sli_gen_request64_wqe()
7495 sge = sgl->virt; in sli_gen_request64_wqe()
7497 if (sli4->config.sgl_pre_registered) { in sli_gen_request64_wqe()
7498 gen->xbl = FALSE; in sli_gen_request64_wqe()
7500 gen->dbde = TRUE; in sli_gen_request64_wqe()
7501 gen->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_gen_request64_wqe()
7503 gen->bde.buffer_length = req_len; in sli_gen_request64_wqe()
7504 gen->bde.u.data.buffer_address_low = sge[0].buffer_address_low; in sli_gen_request64_wqe()
7505 gen->bde.u.data.buffer_address_high = sge[0].buffer_address_high; in sli_gen_request64_wqe()
7507 gen->xbl = TRUE; in sli_gen_request64_wqe()
7509 gen->bde.bde_type = SLI4_BDE_TYPE_BLP; in sli_gen_request64_wqe()
7511 gen->bde.buffer_length = 2 * sizeof(sli4_sge_t); in sli_gen_request64_wqe()
7512 gen->bde.u.blp.sgl_segment_address_low = ocs_addr32_lo(sgl->phys); in sli_gen_request64_wqe()
7513 gen->bde.u.blp.sgl_segment_address_high = ocs_addr32_hi(sgl->phys); in sli_gen_request64_wqe()
7516 gen->request_payload_length = req_len; in sli_gen_request64_wqe()
7517 gen->max_response_payload_length = max_rsp_len; in sli_gen_request64_wqe()
7519 gen->df_ctl = df_ctl; in sli_gen_request64_wqe()
7520 gen->type = type; in sli_gen_request64_wqe()
7521 gen->r_ctl = r_ctl; in sli_gen_request64_wqe()
7523 gen->xri_tag = xri; in sli_gen_request64_wqe()
7525 gen->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_gen_request64_wqe()
7526 gen->context_tag = rnode->indicator; in sli_gen_request64_wqe()
7528 gen->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_gen_request64_wqe()
7530 gen->command = SLI4_WQE_GEN_REQUEST64; in sli_gen_request64_wqe()
7532 gen->timer = timeout; in sli_gen_request64_wqe()
7534 gen->request_tag = tag; in sli_gen_request64_wqe()
7536 gen->iod = SLI4_ELS_REQUEST64_DIR_READ; in sli_gen_request64_wqe()
7538 gen->qosd = TRUE; in sli_gen_request64_wqe()
7540 if (rnode->node_group) { in sli_gen_request64_wqe()
7541 gen->hlm = TRUE; in sli_gen_request64_wqe()
7542 gen->remote_n_port_id = rnode->fc_id & 0x00ffffff; in sli_gen_request64_wqe()
7545 gen->cmd_type = SLI4_CMD_GEN_REQUEST64_WQE; in sli_gen_request64_wqe()
7547 gen->cq_id = cq_id; in sli_gen_request64_wqe()
7564 * @param timeout Time, in seconds, before an IO times out. Zero means infinite.
7568 * @return Returns 0 on success, or a non-zero value on failure.
7572 ocs_dma_t *payload, uint32_t req_len, uint8_t timeout, in sli_send_frame_wqe() argument
7579 sf->dbde = TRUE; in sli_send_frame_wqe()
7580 sf->bde.buffer_length = req_len; in sli_send_frame_wqe()
7581 sf->bde.u.data.buffer_address_low = ocs_addr32_lo(payload->phys); in sli_send_frame_wqe()
7582 sf->bde.u.data.buffer_address_high = ocs_addr32_hi(payload->phys); in sli_send_frame_wqe()
7585 sf->fc_header_0_1[0] = hdr[0]; in sli_send_frame_wqe()
7586 sf->fc_header_0_1[1] = hdr[1]; in sli_send_frame_wqe()
7587 sf->fc_header_2_5[0] = hdr[2]; in sli_send_frame_wqe()
7588 sf->fc_header_2_5[1] = hdr[3]; in sli_send_frame_wqe()
7589 sf->fc_header_2_5[2] = hdr[4]; in sli_send_frame_wqe()
7590 sf->fc_header_2_5[3] = hdr[5]; in sli_send_frame_wqe()
7592 sf->frame_length = req_len; in sli_send_frame_wqe()
7594 sf->xri_tag = xri; in sli_send_frame_wqe()
7595 sf->pu = 0; in sli_send_frame_wqe()
7596 sf->context_tag = 0; in sli_send_frame_wqe()
7598 sf->ct = 0; in sli_send_frame_wqe()
7599 sf->command = SLI4_WQE_SEND_FRAME; in sli_send_frame_wqe()
7600 sf->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_send_frame_wqe()
7601 sf->timer = timeout; in sli_send_frame_wqe()
7603 sf->request_tag = req_tag; in sli_send_frame_wqe()
7604 sf->eof = eof; in sli_send_frame_wqe()
7605 sf->sof = sof; in sli_send_frame_wqe()
7607 sf->qosd = 0; in sli_send_frame_wqe()
7608 sf->lenloc = 1; in sli_send_frame_wqe()
7609 sf->xc = 0; in sli_send_frame_wqe()
7611 sf->xbl = 1; in sli_send_frame_wqe()
7613 sf->cmd_type = SLI4_CMD_SEND_FRAME_WQE; in sli_send_frame_wqe()
7614 sf->cq_id = 0xffff; in sli_send_frame_wqe()
7623 * This WQE is used to send FC-CT response frames.
7633 * @param timeout Time, in seconds, before an IO times out. Zero means infinite.
7642 * @return Returns 0 on success, or a non-zero value on failure.
7646 uint32_t payload_len, uint8_t timeout, uint16_t ox_id, in sli_xmit_sequence64_wqe() argument
7654 if ((payload == NULL) || (payload->virt == NULL)) { in sli_xmit_sequence64_wqe()
7655 ocs_log_err(sli4->os, "bad parameter sgl=%p virt=%p\n", in sli_xmit_sequence64_wqe()
7656 payload, payload ? payload->virt : NULL); in sli_xmit_sequence64_wqe()
7657 return -1; in sli_xmit_sequence64_wqe()
7660 if (sli4->config.sgl_pre_registered) { in sli_xmit_sequence64_wqe()
7661 xmit->dbde = TRUE; in sli_xmit_sequence64_wqe()
7663 xmit->xbl = TRUE; in sli_xmit_sequence64_wqe()
7666 xmit->bde.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_xmit_sequence64_wqe()
7667 xmit->bde.buffer_length = payload_len; in sli_xmit_sequence64_wqe()
7668 xmit->bde.u.data.buffer_address_low = ocs_addr32_lo(payload->phys); in sli_xmit_sequence64_wqe()
7669 xmit->bde.u.data.buffer_address_high = ocs_addr32_hi(payload->phys); in sli_xmit_sequence64_wqe()
7670 xmit->sequence_payload_len = payload_len; in sli_xmit_sequence64_wqe()
7672 xmit->remote_n_port_id = rnode->fc_id & 0x00ffffff; in sli_xmit_sequence64_wqe()
7674 xmit->relative_offset = 0; in sli_xmit_sequence64_wqe()
7676 xmit->si = 0; /* sequence initiative - this matches what is seen from in sli_xmit_sequence64_wqe()
7678 xmit->ft = 0; /* force transmit */ in sli_xmit_sequence64_wqe()
7679 xmit->xo = 0; /* exchange responder */ in sli_xmit_sequence64_wqe()
7680 xmit->ls = 1; /* last in seqence */ in sli_xmit_sequence64_wqe()
7681 xmit->df_ctl = df_ctl; in sli_xmit_sequence64_wqe()
7682 xmit->type = type; in sli_xmit_sequence64_wqe()
7683 xmit->r_ctl = r_ctl; in sli_xmit_sequence64_wqe()
7685 xmit->xri_tag = xri; in sli_xmit_sequence64_wqe()
7686 xmit->context_tag = rnode->indicator; in sli_xmit_sequence64_wqe()
7688 xmit->dif = 0; in sli_xmit_sequence64_wqe()
7689 xmit->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_xmit_sequence64_wqe()
7690 xmit->bs = 0; in sli_xmit_sequence64_wqe()
7692 xmit->command = SLI4_WQE_XMIT_SEQUENCE64; in sli_xmit_sequence64_wqe()
7693 xmit->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_xmit_sequence64_wqe()
7694 xmit->pu = 0; in sli_xmit_sequence64_wqe()
7695 xmit->timer = timeout; in sli_xmit_sequence64_wqe()
7697 xmit->abort_tag = 0; in sli_xmit_sequence64_wqe()
7698 xmit->request_tag = tag; in sli_xmit_sequence64_wqe()
7699 xmit->remote_xid = ox_id; in sli_xmit_sequence64_wqe()
7701 xmit->iod = SLI4_ELS_REQUEST64_DIR_READ; in sli_xmit_sequence64_wqe()
7703 if (rnode->node_group) { in sli_xmit_sequence64_wqe()
7704 xmit->hlm = TRUE; in sli_xmit_sequence64_wqe()
7705 xmit->remote_n_port_id = rnode->fc_id & 0x00ffffff; in sli_xmit_sequence64_wqe()
7708 xmit->cmd_type = SLI4_CMD_XMIT_SEQUENCE64_WQE; in sli_xmit_sequence64_wqe()
7710 xmit->len_loc = 2; in sli_xmit_sequence64_wqe()
7712 xmit->cq_id = 0xFFFF; in sli_xmit_sequence64_wqe()
7728 * @return Returns 0 on success, or a non-zero value on failure.
7737 requeue->command = SLI4_WQE_REQUEUE_XRI; in sli_requeue_xri_wqe()
7738 requeue->xri_tag = xri; in sli_requeue_xri_wqe()
7739 requeue->request_tag = tag; in sli_requeue_xri_wqe()
7740 requeue->xc = 1; in sli_requeue_xri_wqe()
7741 requeue->qosd = 1; in sli_requeue_xri_wqe()
7742 requeue->cq_id = cq_id; in sli_requeue_xri_wqe()
7743 requeue->cmd_type = SLI4_CMD_REQUEUE_XRI_WQE; in sli_requeue_xri_wqe()
7749 uint32_t payload_len, uint8_t timeout, uint16_t xri, uint16_t tag, in sli_xmit_bcast64_wqe() argument
7756 if (rnode->attached) { in sli_xmit_bcast64_wqe()
7757 ocs_log_test(sli4->os, "remote node %d in use\n", rnode->indicator); in sli_xmit_bcast64_wqe()
7758 return -1; in sli_xmit_bcast64_wqe()
7763 bcast->dbde = TRUE; in sli_xmit_bcast64_wqe()
7764 bcast->sequence_payload.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_xmit_bcast64_wqe()
7765 bcast->sequence_payload.buffer_length = payload_len; in sli_xmit_bcast64_wqe()
7766 bcast->sequence_payload.u.data.buffer_address_low = ocs_addr32_lo(payload->phys); in sli_xmit_bcast64_wqe()
7767 bcast->sequence_payload.u.data.buffer_address_high = ocs_addr32_hi(payload->phys); in sli_xmit_bcast64_wqe()
7769 bcast->sequence_payload_length = payload_len; in sli_xmit_bcast64_wqe()
7771 bcast->df_ctl = df_ctl; in sli_xmit_bcast64_wqe()
7772 bcast->type = type; in sli_xmit_bcast64_wqe()
7773 bcast->r_ctl = r_ctl; in sli_xmit_bcast64_wqe()
7775 bcast->xri_tag = xri; in sli_xmit_bcast64_wqe()
7777 bcast->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_xmit_bcast64_wqe()
7778 bcast->context_tag = rnode->sport->indicator; in sli_xmit_bcast64_wqe()
7780 bcast->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_xmit_bcast64_wqe()
7782 bcast->command = SLI4_WQE_XMIT_BCAST64; in sli_xmit_bcast64_wqe()
7784 bcast->timer = timeout; in sli_xmit_bcast64_wqe()
7786 bcast->request_tag = tag; in sli_xmit_bcast64_wqe()
7788 bcast->temporary_rpi = rnode->indicator; in sli_xmit_bcast64_wqe()
7790 bcast->len_loc = 0x1; in sli_xmit_bcast64_wqe()
7792 bcast->iod = SLI4_ELS_REQUEST64_DIR_WRITE; in sli_xmit_bcast64_wqe()
7794 bcast->cmd_type = SLI4_CMD_XMIT_BCAST64_WQE; in sli_xmit_bcast64_wqe()
7796 bcast->cq_id = cq_id; in sli_xmit_bcast64_wqe()
7815 * @return Returns 0 on success, or a non-zero value on failure.
7826 if (rnode->attached && (s_id != UINT32_MAX)) { in sli_xmit_bls_rsp64_wqe()
7827 ocs_log_test(sli4->os, "S_ID specified for attached remote node %d\n", in sli_xmit_bls_rsp64_wqe()
7828 rnode->indicator); in sli_xmit_bls_rsp64_wqe()
7829 return -1; in sli_xmit_bls_rsp64_wqe()
7834 if (SLI_BLS_ACC == payload->type) { in sli_xmit_bls_rsp64_wqe()
7835 bls->payload_word0 = (payload->u.acc.seq_id_last << 16) | in sli_xmit_bls_rsp64_wqe()
7836 (payload->u.acc.seq_id_validity << 24); in sli_xmit_bls_rsp64_wqe()
7837 bls->high_seq_cnt = payload->u.acc.high_seq_cnt; in sli_xmit_bls_rsp64_wqe()
7838 bls->low_seq_cnt = payload->u.acc.low_seq_cnt; in sli_xmit_bls_rsp64_wqe()
7839 } else if (SLI_BLS_RJT == payload->type) { in sli_xmit_bls_rsp64_wqe()
7840 bls->payload_word0 = *((uint32_t *)&payload->u.rjt); in sli_xmit_bls_rsp64_wqe()
7841 bls->ar = TRUE; in sli_xmit_bls_rsp64_wqe()
7843 ocs_log_test(sli4->os, "bad BLS type %#x\n", in sli_xmit_bls_rsp64_wqe()
7844 payload->type); in sli_xmit_bls_rsp64_wqe()
7845 return -1; in sli_xmit_bls_rsp64_wqe()
7848 bls->ox_id = payload->ox_id; in sli_xmit_bls_rsp64_wqe()
7849 bls->rx_id = payload->rx_id; in sli_xmit_bls_rsp64_wqe()
7851 if (rnode->attached) { in sli_xmit_bls_rsp64_wqe()
7852 bls->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_xmit_bls_rsp64_wqe()
7853 bls->context_tag = rnode->indicator; in sli_xmit_bls_rsp64_wqe()
7855 bls->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_xmit_bls_rsp64_wqe()
7856 bls->context_tag = rnode->sport->indicator; in sli_xmit_bls_rsp64_wqe()
7859 bls->local_n_port_id = s_id & 0x00ffffff; in sli_xmit_bls_rsp64_wqe()
7861 bls->local_n_port_id = rnode->sport->fc_id & 0x00ffffff; in sli_xmit_bls_rsp64_wqe()
7863 bls->remote_id = rnode->fc_id & 0x00ffffff; in sli_xmit_bls_rsp64_wqe()
7865 bls->temporary_rpi = rnode->indicator; in sli_xmit_bls_rsp64_wqe()
7868 bls->xri_tag = xri; in sli_xmit_bls_rsp64_wqe()
7870 bls->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_xmit_bls_rsp64_wqe()
7872 bls->command = SLI4_WQE_XMIT_BLS_RSP; in sli_xmit_bls_rsp64_wqe()
7874 bls->request_tag = tag; in sli_xmit_bls_rsp64_wqe()
7876 bls->qosd = TRUE; in sli_xmit_bls_rsp64_wqe()
7878 if (rnode->node_group) { in sli_xmit_bls_rsp64_wqe()
7879 bls->hlm = TRUE; in sli_xmit_bls_rsp64_wqe()
7880 bls->remote_id = rnode->fc_id & 0x00ffffff; in sli_xmit_bls_rsp64_wqe()
7883 bls->cq_id = cq_id; in sli_xmit_bls_rsp64_wqe()
7885 bls->cmd_type = SLI4_CMD_XMIT_BLS_RSP64_WQE; in sli_xmit_bls_rsp64_wqe()
7905 * - SLI4_IO_CONTINUATION - IO is already active.
7908 * @return Returns 0 on success, or a non-zero value on failure.
7919 if (sli4->config.sgl_pre_registered) { in sli_xmit_els_rsp64_wqe()
7920 els->dbde = TRUE; in sli_xmit_els_rsp64_wqe()
7922 els->xbl = TRUE; in sli_xmit_els_rsp64_wqe()
7925 els->els_response_payload.bde_type = SLI4_BDE_TYPE_BDE_64; in sli_xmit_els_rsp64_wqe()
7926 els->els_response_payload.buffer_length = rsp_len; in sli_xmit_els_rsp64_wqe()
7927 els->els_response_payload.u.data.buffer_address_low = ocs_addr32_lo(rsp->phys); in sli_xmit_els_rsp64_wqe()
7928 els->els_response_payload.u.data.buffer_address_high = ocs_addr32_hi(rsp->phys); in sli_xmit_els_rsp64_wqe()
7930 els->els_response_payload_length = rsp_len; in sli_xmit_els_rsp64_wqe()
7932 els->xri_tag = xri; in sli_xmit_els_rsp64_wqe()
7934 els->class = SLI4_ELS_REQUEST64_CLASS_3; in sli_xmit_els_rsp64_wqe()
7936 els->command = SLI4_WQE_ELS_RSP64; in sli_xmit_els_rsp64_wqe()
7938 els->request_tag = tag; in sli_xmit_els_rsp64_wqe()
7940 els->ox_id = ox_id; in sli_xmit_els_rsp64_wqe()
7942 els->iod = SLI4_ELS_REQUEST64_DIR_WRITE; in sli_xmit_els_rsp64_wqe()
7944 els->qosd = TRUE; in sli_xmit_els_rsp64_wqe()
7947 els->xc = TRUE; in sli_xmit_els_rsp64_wqe()
7950 if (rnode->attached) { in sli_xmit_els_rsp64_wqe()
7951 els->ct = SLI4_ELS_REQUEST64_CONTEXT_RPI; in sli_xmit_els_rsp64_wqe()
7952 els->context_tag = rnode->indicator; in sli_xmit_els_rsp64_wqe()
7954 els->ct = SLI4_ELS_REQUEST64_CONTEXT_VPI; in sli_xmit_els_rsp64_wqe()
7955 els->context_tag = rnode->sport->indicator; in sli_xmit_els_rsp64_wqe()
7956 els->remote_id = rnode->fc_id & 0x00ffffff; in sli_xmit_els_rsp64_wqe()
7957 els->temporary_rpi = rnode->indicator; in sli_xmit_els_rsp64_wqe()
7959 els->sp = TRUE; in sli_xmit_els_rsp64_wqe()
7960 els->s_id = s_id & 0x00ffffff; in sli_xmit_els_rsp64_wqe()
7964 if (rnode->node_group) { in sli_xmit_els_rsp64_wqe()
7965 els->hlm = TRUE; in sli_xmit_els_rsp64_wqe()
7966 els->remote_id = rnode->fc_id & 0x00ffffff; in sli_xmit_els_rsp64_wqe()
7969 els->cmd_type = SLI4_ELS_REQUEST64_CMD_GEN; in sli_xmit_els_rsp64_wqe()
7971 els->cq_id = cq_id; in sli_xmit_els_rsp64_wqe()
7987 * @return Returns 0 on success, or a non-zero value on failure.
7996 if (!sli4->link) { in sli_fc_process_link_state()
8001 if (SLI4_LINK_TYPE_ETHERNET == link_state->link_type) { in sli_fc_process_link_state()
8006 ocs_log_test(sli4->os, "unsupported link type %#x\n", in sli_fc_process_link_state()
8007 link_state->link_type); in sli_fc_process_link_state()
8010 rc = -1; in sli_fc_process_link_state()
8013 switch (link_state->port_link_status) { in sli_fc_process_link_state()
8023 ocs_log_test(sli4->os, "unsupported link status %#x\n", in sli_fc_process_link_state()
8024 link_state->port_link_status); in sli_fc_process_link_state()
8026 rc = -1; in sli_fc_process_link_state()
8029 switch (link_state->port_speed) { in sli_fc_process_link_state()
8058 ocs_log_test(sli4->os, "unsupported port_speed %#x\n", in sli_fc_process_link_state()
8059 link_state->port_speed); in sli_fc_process_link_state()
8060 rc = -1; in sli_fc_process_link_state()
8063 sli4->link(sli4->link_arg, (void *)&event); in sli_fc_process_link_state()
8081 * @return Returns 0 on success, or a non-zero value on failure.
8089 ocs_log_debug(sli4->os, "link_number=%d attn_type=%#x topology=%#x port_speed=%#x " in sli_fc_process_link_attention()
8091 "event_tag=%#x\n", link_attn->link_number, link_attn->attn_type, in sli_fc_process_link_attention()
8092 link_attn->topology, link_attn->port_speed, link_attn->port_fault, in sli_fc_process_link_attention()
8093 link_attn->shared_link_status, link_attn->logical_link_speed, in sli_fc_process_link_attention()
8094 link_attn->event_tag); in sli_fc_process_link_attention()
8096 if (!sli4->link) { in sli_fc_process_link_attention()
8102 switch (link_attn->attn_type) { in sli_fc_process_link_attention()
8110 ocs_log_debug(sli4->os, "attn_type: no hard alpa\n"); in sli_fc_process_link_attention()
8114 ocs_log_test(sli4->os, "attn_type: unknown\n"); in sli_fc_process_link_attention()
8118 switch (link_attn->event_type) { in sli_fc_process_link_attention()
8122 ocs_log_debug(sli4->os, "event_type: FC shared link event \n"); in sli_fc_process_link_attention()
8125 ocs_log_test(sli4->os, "event_type: unknown\n"); in sli_fc_process_link_attention()
8129 switch (link_attn->topology) { in sli_fc_process_link_attention()
8137 ocs_log_debug(sli4->os, "topology Internal loopback\n"); in sli_fc_process_link_attention()
8141 ocs_log_debug(sli4->os, "topology serdes loopback\n"); in sli_fc_process_link_attention()
8145 ocs_log_test(sli4->os, "topology: unknown\n"); in sli_fc_process_link_attention()
8149 event.speed = link_attn->port_speed * 1000; in sli_fc_process_link_attention()
8151 sli4->link(sli4->link_arg, (void *)&event); in sli_fc_process_link_attention()
8166 * @return Returns 0 on success, or a non-zero value on failure.
8173 int32_t rc = -1; in sli_fc_cqe_parse()
8181 *r_id = wcqe->request_tag; in sli_fc_cqe_parse()
8182 rc = wcqe->status; in sli_fc_cqe_parse()
8186 ocs_log_test(sli4->os, "WCQE: status=%#x hw_status=%#x tag=%#x w1=%#x w2=%#x xb=%d\n", in sli_fc_cqe_parse()
8187 wcqe->status, wcqe->hw_status, in sli_fc_cqe_parse()
8188 wcqe->request_tag, wcqe->wqe_specific_1, in sli_fc_cqe_parse()
8189 wcqe->wqe_specific_2, wcqe->xb); in sli_fc_cqe_parse()
8190 ocs_log_test(sli4->os, " %08X %08X %08X %08X\n", ((uint32_t*) cqe)[0], ((uint32_t*) cqe)[1], in sli_fc_cqe_parse()
8205 *r_id = rcqe->rq_id; in sli_fc_cqe_parse()
8206 rc = rcqe->status; in sli_fc_cqe_parse()
8214 *r_id = rcqe->rq_id; in sli_fc_cqe_parse()
8215 rc = rcqe->status; in sli_fc_cqe_parse()
8223 *r_id = optcqe->rq_id; in sli_fc_cqe_parse()
8224 rc = optcqe->status; in sli_fc_cqe_parse()
8232 *r_id = dcqe->xri; in sli_fc_cqe_parse()
8233 rc = dcqe->status; in sli_fc_cqe_parse()
8237 …ocs_log_test(sli4->os, "Optimized DATA CQE: status=%#x hw_status=%#x xri=%#x dpl=%#x w3=%#x xb=%d\… in sli_fc_cqe_parse()
8238 dcqe->status, dcqe->hw_status, in sli_fc_cqe_parse()
8239 dcqe->xri, dcqe->total_data_placed, in sli_fc_cqe_parse()
8240 ((uint32_t*) cqe)[3], dcqe->xb); in sli_fc_cqe_parse()
8249 *r_id = rcqe->rq_id; in sli_fc_cqe_parse()
8250 rc = rcqe->status; in sli_fc_cqe_parse()
8258 *r_id = xa->xri; in sli_fc_cqe_parse()
8266 *r_id = wqec->wq_id; in sli_fc_cqe_parse()
8271 ocs_log_test(sli4->os, "CQE completion code %d not handled\n", code); in sli_fc_cqe_parse()
8293 return wcqe->wqe_specific_1; in sli_fc_response_length()
8310 return wcqe->wqe_specific_1; in sli_fc_io_length()
8321 * @return Returns 0 on success, or a non-zero value on failure.
8330 if (wcqe->status) { in sli_fc_els_did()
8331 return -1; in sli_fc_els_did()
8333 *d_id = wcqe->wqe_specific_2 & 0x00ffffff; in sli_fc_els_did()
8344 switch (wcqe->status) { in sli_fc_ext_status()
8366 return wcqe->wqe_specific_2 & mask; in sli_fc_ext_status()
8378 * @return Returns 0 on success, or a non-zero value on failure.
8385 int32_t rc = -1; in sli_fc_rqe_rqid_and_index()
8394 *rq_id = rcqe->rq_id; in sli_fc_rqe_rqid_and_index()
8395 if (SLI4_FC_ASYNC_RQ_SUCCESS == rcqe->status) { in sli_fc_rqe_rqid_and_index()
8396 *index = rcqe->rq_element_index; in sli_fc_rqe_rqid_and_index()
8399 *index = rcqe->rq_element_index; in sli_fc_rqe_rqid_and_index()
8400 rc = rcqe->status; in sli_fc_rqe_rqid_and_index()
8401 ocs_log_test(sli4->os, "status=%02x (%s) rq_id=%d, index=%x pdpl=%x sof=%02x eof=%02x hdpl=%x\n", in sli_fc_rqe_rqid_and_index()
8402 rcqe->status, sli_fc_get_status_string(rcqe->status), rcqe->rq_id, in sli_fc_rqe_rqid_and_index()
8403 rcqe->rq_element_index, rcqe->payload_data_placement_length, rcqe->sof_byte, in sli_fc_rqe_rqid_and_index()
8404 rcqe->eof_byte, rcqe->header_data_placement_length); in sli_fc_rqe_rqid_and_index()
8407 *rq_id = rcqe_v1->rq_id; in sli_fc_rqe_rqid_and_index()
8408 if (SLI4_FC_ASYNC_RQ_SUCCESS == rcqe_v1->status) { in sli_fc_rqe_rqid_and_index()
8409 *index = rcqe_v1->rq_element_index; in sli_fc_rqe_rqid_and_index()
8412 *index = rcqe_v1->rq_element_index; in sli_fc_rqe_rqid_and_index()
8413 rc = rcqe_v1->status; in sli_fc_rqe_rqid_and_index()
8414 ocs_log_test(sli4->os, "status=%02x (%s) rq_id=%d, index=%x pdpl=%x sof=%02x eof=%02x hdpl=%x\n", in sli_fc_rqe_rqid_and_index()
8415 rcqe_v1->status, sli_fc_get_status_string(rcqe_v1->status), in sli_fc_rqe_rqid_and_index()
8416 rcqe_v1->rq_id, rcqe_v1->rq_element_index, in sli_fc_rqe_rqid_and_index()
8417 rcqe_v1->payload_data_placement_length, rcqe_v1->sof_byte, in sli_fc_rqe_rqid_and_index()
8418 rcqe_v1->eof_byte, rcqe_v1->header_data_placement_length); in sli_fc_rqe_rqid_and_index()
8423 *rq_id = optcqe->rq_id; in sli_fc_rqe_rqid_and_index()
8424 if (SLI4_FC_ASYNC_RQ_SUCCESS == optcqe->status) { in sli_fc_rqe_rqid_and_index()
8425 *index = optcqe->rq_element_index; in sli_fc_rqe_rqid_and_index()
8428 *index = optcqe->rq_element_index; in sli_fc_rqe_rqid_and_index()
8429 rc = optcqe->status; in sli_fc_rqe_rqid_and_index()
8430 …ocs_log_test(sli4->os, "status=%02x (%s) rq_id=%d, index=%x pdpl=%x hdpl=%x oox=%d agxr=%d xri=0x%… in sli_fc_rqe_rqid_and_index()
8431 optcqe->status, sli_fc_get_status_string(optcqe->status), optcqe->rq_id, in sli_fc_rqe_rqid_and_index()
8432 optcqe->rq_element_index, optcqe->payload_data_placement_length, in sli_fc_rqe_rqid_and_index()
8433 optcqe->header_data_placement_length, optcqe->oox, optcqe->agxr, optcqe->xri, in sli_fc_rqe_rqid_and_index()
8434 optcqe->rpi); in sli_fc_rqe_rqid_and_index()
8439 *rq_id = rcqe->rq_id; in sli_fc_rqe_rqid_and_index()
8440 if (SLI4_FC_COALESCE_RQ_SUCCESS == rcqe->status) { in sli_fc_rqe_rqid_and_index()
8441 *index = rcqe->rq_element_index; in sli_fc_rqe_rqid_and_index()
8445 rc = rcqe->status; in sli_fc_rqe_rqid_and_index()
8447 ocs_log_test(sli4->os, "status=%02x (%s) rq_id=%d, index=%x rq_id=%#x sdpl=%x\n", in sli_fc_rqe_rqid_and_index()
8448 rcqe->status, sli_fc_get_status_string(rcqe->status), rcqe->rq_id, in sli_fc_rqe_rqid_and_index()
8449 rcqe->rq_element_index, rcqe->rq_id, rcqe->sequence_reporting_placement_length); in sli_fc_rqe_rqid_and_index()
8454 rc = rcqe->status; in sli_fc_rqe_rqid_and_index()
8456 ocs_log_debug(sli4->os, "status=%02x rq_id=%d, index=%x pdpl=%x sof=%02x eof=%02x hdpl=%x\n", in sli_fc_rqe_rqid_and_index()
8457 rcqe->status, rcqe->rq_id, rcqe->rq_element_index, rcqe->payload_data_placement_length, in sli_fc_rqe_rqid_and_index()
8458 rcqe->sof_byte, rcqe->eof_byte, rcqe->header_data_placement_length); in sli_fc_rqe_rqid_and_index()
8475 * @return Returns 0 on success, or a non-zero value on failure.
8484 ocs_log_debug(sli4->os, "ACQE FCoE FIP type=%02x count=%d tag=%#x\n", in sli_fc_process_fcoe()
8485 fcoe->event_type, in sli_fc_process_fcoe()
8486 fcoe->fcf_count, in sli_fc_process_fcoe()
8487 fcoe->event_tag); in sli_fc_process_fcoe()
8489 if (!sli4->fip) { in sli_fc_process_fcoe()
8493 event.type = fcoe->event_type; in sli_fc_process_fcoe()
8496 switch (fcoe->event_type) { in sli_fc_process_fcoe()
8498 ocs_log_debug(sli4->os, "FCF Discovered index=%d\n", fcoe->event_information); in sli_fc_process_fcoe()
8501 ocs_log_debug(sli4->os, "FCF Table Full\n"); in sli_fc_process_fcoe()
8505 ocs_log_debug(sli4->os, "FCF Dead/Gone index=%d\n", fcoe->event_information); in sli_fc_process_fcoe()
8509 ocs_log_debug(sli4->os, "Clear VLINK Received VPI=%#x\n", fcoe->event_information & mask); in sli_fc_process_fcoe()
8512 ocs_log_debug(sli4->os, "FCF Modified\n"); in sli_fc_process_fcoe()
8515 ocs_log_test(sli4->os, "bad FCoE type %#x", fcoe->event_type); in sli_fc_process_fcoe()
8520 event.index = fcoe->event_information & mask; in sli_fc_process_fcoe()
8523 sli4->fip(sli4->fip_arg, &event); in sli_fc_process_fcoe()
8540 * @param ulp The ULP to bind
8543 * @return Returns 0 on success, or -1 on failure.
8548 sli4_queue_t *cq, uint16_t ulp, uint8_t is_hdr) in sli_fc_rq_alloc() argument
8553 void *os = sli4 != NULL ? sli4->os : NULL; in sli_fc_rq_alloc()
8556 return -1; in sli_fc_rq_alloc()
8561 return -1; in sli_fc_rq_alloc()
8564 if (sli4->if_type == SLI4_IF_TYPE_BE3_SKH_PF) { in sli_fc_rq_alloc()
8570 if (rq_create(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, &q->dma, in sli_fc_rq_alloc()
8571 cq->id, ulp, buffer_size)) { in sli_fc_rq_alloc()
8573 ocs_dma_free(sli4->os, &q->dma); in sli_fc_rq_alloc()
8574 return -1; in sli_fc_rq_alloc()
8576 if (is_hdr && q->id & 1) { in sli_fc_rq_alloc()
8577 ocs_log_test(sli4->os, "bad header RQ_ID %d\n", q->id); in sli_fc_rq_alloc()
8578 ocs_dma_free(sli4->os, &q->dma); in sli_fc_rq_alloc()
8579 return -1; in sli_fc_rq_alloc()
8580 } else if (!is_hdr && (q->id & 1) == 0) { in sli_fc_rq_alloc()
8581 ocs_log_test(sli4->os, "bad data RQ_ID %d\n", q->id); in sli_fc_rq_alloc()
8582 ocs_dma_free(sli4->os, &q->dma); in sli_fc_rq_alloc()
8583 return -1; in sli_fc_rq_alloc()
8586 return -1; in sli_fc_rq_alloc()
8588 q->u.flag.is_hdr = is_hdr; in sli_fc_rq_alloc()
8589 if (SLI4_IF_TYPE_BE3_SKH_PF == sli4->if_type) { in sli_fc_rq_alloc()
8590 q->u.flag.rq_batch = TRUE; in sli_fc_rq_alloc()
8607 * @param ulp The ULP to bind
8609 * @return Returns 0 on success, or -1 on failure.
8615 uint32_t payload_buffer_size, uint16_t ulp) in sli_fc_rq_set_alloc() argument
8633 total_page_count = sli_page_count(qs[0]->dma.size, SLI_PAGE_SIZE) * num_rq_pairs * 2; in sli_fc_rq_set_alloc()
8639 if (ocs_dma_alloc(sli4->os, &dma, payload_size, SLI_PAGE_SIZE)) { in sli_fc_rq_set_alloc()
8640 ocs_log_err(sli4->os, "DMA allocation failed\n"); in sli_fc_rq_set_alloc()
8645 if (sli_cmd_sli_config(sli4, sli4->bmbx.virt, SLI4_BMBX_SIZE, in sli_fc_rq_set_alloc()
8646 payload_size, &dma) == -1) { in sli_fc_rq_set_alloc()
8652 req->hdr.opcode = SLI4_OPC_FCOE_RQ_CREATE; in sli_fc_rq_set_alloc()
8653 req->hdr.subsystem = SLI4_SUBSYSTEM_FCFCOE; in sli_fc_rq_set_alloc()
8654 req->hdr.version = 2; in sli_fc_rq_set_alloc()
8655 req->hdr.request_length = sizeof(sli4_req_fcoe_rq_create_v2_t) - sizeof(sli4_req_hdr_t) in sli_fc_rq_set_alloc()
8659 req->dnb = TRUE; in sli_fc_rq_set_alloc()
8660 req->num_pages = sli_page_count(qs[0]->dma.size, SLI_PAGE_SIZE); in sli_fc_rq_set_alloc()
8661 req->rqe_count = qs[0]->dma.size / SLI4_FCOE_RQE_SIZE; in sli_fc_rq_set_alloc()
8662 req->rqe_size = SLI4_FCOE_RQE_SIZE_8; in sli_fc_rq_set_alloc()
8663 req->page_size = SLI4_FCOE_RQ_PAGE_SIZE_4096; in sli_fc_rq_set_alloc()
8664 req->rq_count = num_rq_pairs * 2; in sli_fc_rq_set_alloc()
8665 req->base_cq_id = base_cq_id; in sli_fc_rq_set_alloc()
8666 req->hdr_buffer_size = header_buffer_size; in sli_fc_rq_set_alloc()
8667 req->payload_buffer_size = payload_buffer_size; in sli_fc_rq_set_alloc()
8670 for (p = 0, addr = qs[i]->dma.phys; p < req->num_pages; p++, addr += SLI_PAGE_SIZE) { in sli_fc_rq_set_alloc()
8671 req->page_physical_address[offset].low = ocs_addr32_lo(addr); in sli_fc_rq_set_alloc()
8672 req->page_physical_address[offset].high = ocs_addr32_hi(addr); in sli_fc_rq_set_alloc()
8678 ocs_log_crit(sli4->os, "bootstrap mailbox write failed RQSet\n"); in sli_fc_rq_set_alloc()
8683 if (rsp->hdr.status) { in sli_fc_rq_set_alloc()
8684 ocs_log_err(sli4->os, "bad create RQSet status=%#x addl=%#x\n", in sli_fc_rq_set_alloc()
8685 rsp->hdr.status, rsp->hdr.additional_status); in sli_fc_rq_set_alloc()
8689 qs[i]->id = i + rsp->q_id; in sli_fc_rq_set_alloc()
8690 if ((qs[i]->id & 1) == 0) { in sli_fc_rq_set_alloc()
8691 qs[i]->u.flag.is_hdr = TRUE; in sli_fc_rq_set_alloc()
8693 qs[i]->u.flag.is_hdr = FALSE; in sli_fc_rq_set_alloc()
8695 qs[i]->doorbell_offset = regmap[SLI4_REG_FCOE_RQ_DOORBELL][sli4->if_type].off; in sli_fc_rq_set_alloc()
8696 qs[i]->doorbell_rset = regmap[SLI4_REG_FCOE_RQ_DOORBELL][sli4->if_type].rset; in sli_fc_rq_set_alloc()
8700 ocs_dma_free(sli4->os, &dma); in sli_fc_rq_set_alloc()
8706 if (qs[i]->dma.size) { in sli_fc_rq_set_alloc()
8707 ocs_dma_free(sli4->os, &qs[i]->dma); in sli_fc_rq_set_alloc()
8712 ocs_dma_free(sli4->os, &dma); in sli_fc_rq_set_alloc()
8715 return -1; in sli_fc_rq_set_alloc()
8733 if (sli4->config.hdr_template_req) { in sli_fc_get_rpi_requirements()