From nobody Mon Mar 7 11:00:38 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 5EF8A1A01F54; Mon, 7 Mar 2022 11:00:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KBwVH1fB4z3wFh; Mon, 7 Mar 2022 11:00:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646650839; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4nSyzSUUz4eA047f0J9MUSza6wzXjpcfs1Edg8/OGVI=; b=sDB2rwgTpX8uH6AL/UGdWvmnh9C+0HJoMF7MCcPw10V/EvFZ/XcMTYJmZoLxclAzlUjdbx whJPfnxLzf39f3vNduWazz4caexzt9H9t4/GcQqRrB5w69PcT46bQO6/eMBBPkeEUASroX XnAb481cDUHSLm1BqMxYbWx9cu1BXBfRsMoNrCpigrFpC2iEEOGP+lmfa7GNbD8wz5OQIX W+yvVo/8tf66dlKVGJSh0jGrvjJsFzRt5TzaN2KSXK/QgWY/DiOX4D2JXpU+bzQsRDiB78 0gqIEVMLzBOHZ8qE0ViWGgLcooYCMlGMcgPB46NfoHju7OdFRDClD0yDNN22zQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 1832726FCA; Mon, 7 Mar 2022 11:00:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 227B0cFr066153; Mon, 7 Mar 2022 11:00:38 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 227B0c91066152; Mon, 7 Mar 2022 11:00:38 GMT (envelope-from git) Date: Mon, 7 Mar 2022 11:00:38 GMT Message-Id: <202203071100.227B0c91066152@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Ram Kishore Vegesna Subject: git: 3ca1c43d1ca9 - stable/12 - ocs_fc: Support persistent topology feature List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: ram X-Git-Repository: src X-Git-Refname: refs/heads/stable/12 X-Git-Reftype: branch X-Git-Commit: 3ca1c43d1ca9df6573fff8652768eb14c95da794 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646650839; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4nSyzSUUz4eA047f0J9MUSza6wzXjpcfs1Edg8/OGVI=; b=yMZzwFe+B4y6TbaFC44KZxwKATHHDj12HvQtyyLfIQOSgw0Kn6kXM2kJEtTF7VWOdSUOYo pkWI7ytgRhlCfDJGBmOHiVwnJ/6PECmo5I4QnTCHgvu2uNT42fFTDb+NuJRblYf9ktubKa HXe8n8TTETKMdULxe5/CtC2XYp2vL3jo+fQKGpc7CH6gqvNEiTHV9key92+I33tn7/osM+ UNuIqLeyBsXYB2zovJNb1TlKkkFzkWOKnXiZ/PqjOV5J8DNK3tK9K/6GY35niO4TLFK6ld E2G/XW9DKjObglaqexd4CEfEuXDM+Jo5ZvmWfSOiygb+NpampFZeD9WGs8t/Kw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1646650839; a=rsa-sha256; cv=none; b=wb0KWZF3F40ouj1GkwoklLHMYnDIPYh+vSfvGR3V+T2h0UBsFr/LwTbGJ82opVamfaQejI yMfKbwahdC26yT7XK0NTCKEjDNbllpuMRunEm0Fz7RpvF2yDDThHND9VecnCSVe0EZoVpd 8Ss1KoxtnJSD22fjwszVFPaEOaMm6j/+C1aMJ0D6/4O10jqIIrfSLUFkLlcaHT2PWxtV6A YxK3f5TIoR5piA8kVCrpGAwf0CdSfQ1r49MO/yFEh46mRtLNycLMcbWAXvQLUKw0NGjLXm SfZHC9hdxmFjo32oFlFTl4DKkI+kmd1OK7DAE9ta4qw1t9GCJ0CGLYc8dBZLvg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/12 has been updated by ram: URL: https://cgit.FreeBSD.org/src/commit/?id=3ca1c43d1ca9df6573fff8652768eb14c95da794 commit 3ca1c43d1ca9df6573fff8652768eb14c95da794 Author: Ram Kishore Vegesna AuthorDate: 2022-03-03 16:00:27 +0000 Commit: Ram Kishore Vegesna CommitDate: 2022-03-07 10:49:51 +0000 ocs_fc: Support persistent topology feature Summary: Enable persistent topology across power cycles/firmware resets. Reviewed by: mav MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D34425 (cherry picked from commit 965e2154e7682572e99e4c8fd4776dfe8f836b24) --- sys/dev/ocs_fc/ocs_hw.c | 162 +++++++++++++++++++++++++++++++++++++++++++++ sys/dev/ocs_fc/ocs_hw.h | 2 + sys/dev/ocs_fc/ocs_ioctl.c | 2 +- sys/dev/ocs_fc/ocs_mgmt.c | 5 ++ sys/dev/ocs_fc/ocs_xport.c | 37 +++++++++++ sys/dev/ocs_fc/sli4.c | 110 ++++++++++++++++++++++-------- sys/dev/ocs_fc/sli4.h | 42 +++++++++++- 7 files changed, 330 insertions(+), 30 deletions(-) diff --git a/sys/dev/ocs_fc/ocs_hw.c b/sys/dev/ocs_fc/ocs_hw.c index 7a623478c8aa..38d27915672c 100644 --- a/sys/dev/ocs_fc/ocs_hw.c +++ b/sys/dev/ocs_fc/ocs_hw.c @@ -12101,6 +12101,168 @@ ocs_hw_get_def_wwn(ocs_t *ocs, uint32_t chan, uint64_t *wwpn, uint64_t *wwnn) return 0; } +uint32_t +ocs_hw_get_config_persistent_topology(ocs_hw_t *hw) +{ + uint32_t topology = OCS_HW_TOPOLOGY_AUTO; + sli4_t *sli = &hw->sli; + + if (!sli_persist_topology_enabled(sli)) + return topology; + + switch (sli->config.pt) { + case SLI4_INIT_LINK_F_P2P_ONLY: + topology = OCS_HW_TOPOLOGY_NPORT; + break; + case SLI4_INIT_LINK_F_FCAL_ONLY: + topology = OCS_HW_TOPOLOGY_LOOP; + break; + default: + break; + } + + return topology; +} + +/* + * @brief Persistent topology configuration callback argument. + */ +typedef struct ocs_hw_persistent_topo_cb_arg { + ocs_sem_t semaphore; + int32_t status; +} ocs_hw_persistent_topo_cb_arg_t; + +/* + * @brief Called after the completion of set persistent topology request + * + * @par Description + * This is callback fn for the set_persistent_topology + * function. This callback is called when the common feature mbx cmd + * completes. + * + * @param hw Hardware context. + * @param status The status from the MQE. + * @param mqe Pointer to mailbox command buffer. + * @param arg Pointer to a callback argument. + * + * @return 0 on success, non-zero otherwise + */ +static int32_t +ocs_hw_set_persistent_topolgy_cb(ocs_hw_t *hw, int32_t status, uint8_t *mqe, void *arg) +{ + ocs_hw_persistent_topo_cb_arg_t *req = (ocs_hw_persistent_topo_cb_arg_t *)arg; + + req->status = status; + + ocs_sem_v(&req->semaphore); + + return 0; +} + +/** + * @brief Set persistent topology + * + * Sets the persistent topology(PT) feature using + * COMMON_SET_FEATURES cmd. If mbx cmd succeeds, update the + * topology into sli config. PT stores the value to be set into link_flags + * of the cmd INIT_LINK, to bring up the link. + * + * SLI specs defines following for PT: + * When TF is set to 0: + * 0 Reserved + * 1 Attempt point-to-point initialization (direct attach or Fabric topology). + * 2 Attempt FC-AL loop initialization. + * 3 Reserved + * + * When TF is set to 1: + * 0 Attempt FC-AL loop initialization; if it fails, attempt point-to-point initialization. + * 1 Attempt point-to-point initialization; if it fails, attempt FC-AL loop initialization. + * 2 Reserved + * 3 Reserved + * + * Note: Topology failover is only available on Lancer G5. This command will fail + * if TF is set to 1 on any other ASICs + * + * @param hw Pointer to hw + * @param topology topology value to be set, provided through + * elxsdkutil set-topology cmd + * + * @return Returns 0 on success, or a non-zero value on failure. + */ +ocs_hw_rtn_e +ocs_hw_set_persistent_topology(ocs_hw_t *hw, uint32_t topology, uint32_t opts) +{ + ocs_hw_rtn_e rc = OCS_HW_RTN_SUCCESS; + uint8_t buf[SLI4_BMBX_SIZE]; + sli4_req_common_set_features_persistent_topo_param_t param; + ocs_hw_persistent_topo_cb_arg_t request; + + ocs_memset(¶m, 0, sizeof(param)); + param.persistent_topo = topology; + + switch (topology) { + case OCS_HW_TOPOLOGY_AUTO: + if (sli_get_asic_type(&hw->sli) == SLI4_ASIC_TYPE_LANCER) { + param.persistent_topo = SLI4_INIT_LINK_F_P2P_FAIL_OVER; + param.topo_failover = 1; + } else { + param.persistent_topo = SLI4_INIT_LINK_F_P2P_ONLY;; + param.topo_failover = 0; + } + break; + + case OCS_HW_TOPOLOGY_NPORT: + param.persistent_topo = SLI4_INIT_LINK_F_P2P_ONLY; + param.topo_failover = 0; + break; + + case OCS_HW_TOPOLOGY_LOOP: + param.persistent_topo = SLI4_INIT_LINK_F_FCAL_ONLY; + param.topo_failover = 0; + break; + + default: + ocs_log_err(hw->os, "unsupported topology %#x\n", topology); + return -1; + } + + ocs_sem_init(&request.semaphore, 0, "set_persistent_topo"); + + /* build the set_features command */ + sli_cmd_common_set_features(&hw->sli, buf, SLI4_BMBX_SIZE, + SLI4_SET_FEATURES_PERSISTENT_TOPOLOGY, sizeof(param), ¶m); + + if (opts == OCS_CMD_POLL) { + rc = ocs_hw_command(hw, buf, OCS_CMD_POLL, NULL, NULL); + if (rc) { + ocs_log_err(hw->os, "Failed to set persistent topology, rc: %#x\n", rc); + return rc; + } + } else { + + // there's no response for this feature command + rc = ocs_hw_command(hw, buf, OCS_CMD_NOWAIT, ocs_hw_set_persistent_topolgy_cb, &request); + if (rc) { + ocs_log_err(hw->os, "Failed to set persistent topology, rc: %#x\n", rc); + return rc; + } + + if (ocs_sem_p(&request.semaphore, OCS_SEM_FOREVER)) { + ocs_log_err(hw->os, "ocs_sem_p failed\n"); + return -ENXIO; + } + + if (request.status) { + ocs_log_err(hw->os, "set persistent topology failed; status: %d\n", request.status); + return -EFAULT; + } + } + + sli_config_persistent_topology(&hw->sli, ¶m); + + return rc; +} + /** * @page fc_hw_api_overview HW APIs * - @ref devInitShutdown diff --git a/sys/dev/ocs_fc/ocs_hw.h b/sys/dev/ocs_fc/ocs_hw.h index 86a7d98c24d3..8916ac70e13c 100644 --- a/sys/dev/ocs_fc/ocs_hw.h +++ b/sys/dev/ocs_fc/ocs_hw.h @@ -1382,6 +1382,8 @@ extern ocs_hw_io_t * ocs_hw_io_lookup(ocs_hw_t *hw, uint32_t indicator); extern uint32_t ocs_hw_xri_move_to_port_owned(ocs_hw_t *hw, uint32_t num_xri); extern ocs_hw_rtn_e ocs_hw_xri_move_to_host_owned(ocs_hw_t *hw, uint8_t num_xri); extern int32_t ocs_hw_reque_xri(ocs_hw_t *hw, ocs_hw_io_t *io); +ocs_hw_rtn_e ocs_hw_set_persistent_topology(ocs_hw_t *hw, uint32_t topology, uint32_t opts); +extern uint32_t ocs_hw_get_config_persistent_topology(ocs_hw_t *hw); typedef struct { diff --git a/sys/dev/ocs_fc/ocs_ioctl.c b/sys/dev/ocs_fc/ocs_ioctl.c index dec2a106c414..4be0ae66f9f1 100644 --- a/sys/dev/ocs_fc/ocs_ioctl.c +++ b/sys/dev/ocs_fc/ocs_ioctl.c @@ -617,7 +617,7 @@ ocs_ioctl(struct cdev *cdev, u_long cmd, caddr_t addr, int flag, struct thread * return -EFAULT; } - req->result = ocs_mgmt_set(ocs, req->name, req->value); + req->result = ocs_mgmt_set(ocs, name, value); break; } diff --git a/sys/dev/ocs_fc/ocs_mgmt.c b/sys/dev/ocs_fc/ocs_mgmt.c index e3be49fb9168..6555dc60c457 100644 --- a/sys/dev/ocs_fc/ocs_mgmt.c +++ b/sys/dev/ocs_fc/ocs_mgmt.c @@ -1822,6 +1822,11 @@ set_configured_topology(ocs_t *ocs, char *name, char *value) if (hw_rc != OCS_HW_RTN_SUCCESS) { ocs_log_test(ocs, "Topology set failed\n"); result = 1; + } else { + // Set the persistent topology before port is online + hw_rc = ocs_hw_set_persistent_topology(&ocs->hw, topo, OCS_CMD_NOWAIT); + if (hw_rc != OCS_HW_RTN_SUCCESS) + ocs_log_err(ocs, "Set persistent topology feature failed: %d\n", hw_rc); } /* If we failed to set the topology we still want to try to bring diff --git a/sys/dev/ocs_fc/ocs_xport.c b/sys/dev/ocs_fc/ocs_xport.c index b73c1d071a29..8cec75e1a1db 100644 --- a/sys/dev/ocs_fc/ocs_xport.c +++ b/sys/dev/ocs_fc/ocs_xport.c @@ -375,6 +375,36 @@ ocs_xport_initialize_auto_xfer_ready(ocs_xport_t *xport) return 0; } +/** + * @brief Initialize link topology config + * + * @par Description + * Topology can be fetched from mod-param or Persistet Topology(PT). + * a. Mod-param value is used when the value is 1(P2P) or 2(LOOP). + * a. PT is used if mod-param is not provided( i.e, default value of AUTO) + * Also, if mod-param is used, update PT. + * + * @param ocs Pointer to ocs + * + * @return Returns 0 on success, or a non-zero value on failure. + */ +static int +ocs_topology_setup(ocs_t *ocs) +{ + uint32_t topology; + + if (ocs->topology == OCS_HW_TOPOLOGY_AUTO) { + topology = ocs_hw_get_config_persistent_topology(&ocs->hw); + } else { + topology = ocs->topology; + /* ignore failure here. link will come-up either in auto mode + * if PT is not supported or last saved PT value */ + ocs_hw_set_persistent_topology(&ocs->hw, topology, OCS_CMD_POLL); + } + + return ocs_hw_set(&ocs->hw, OCS_HW_TOPOLOGY, topology); +} + /** * @brief Initializes the device. * @@ -457,6 +487,13 @@ ocs_xport_initialize(ocs_xport_t *xport) } } + /* Setup persistent topology based on topology mod-param value */ + rc = ocs_topology_setup(ocs); + if (rc) { + ocs_log_err(ocs, "%s: Can't set the toplogy\n", ocs->desc); + return -1; + } + if (ocs_hw_set(&ocs->hw, OCS_HW_TOPOLOGY, ocs->topology) != OCS_HW_RTN_SUCCESS) { ocs_log_err(ocs, "%s: Can't set the toplogy\n", ocs->desc); return -1; diff --git a/sys/dev/ocs_fc/sli4.c b/sys/dev/ocs_fc/sli4.c index 861a5c9b7d56..724ee15c8d31 100644 --- a/sys/dev/ocs_fc/sli4.c +++ b/sys/dev/ocs_fc/sli4.c @@ -765,6 +765,63 @@ sli_cmd_fw_initialize(sli4_t *sli4, void *buf, size_t size) return sizeof(sli4_fw_initialize); } +/** + * @ingroup sli + * @brief update INIT_LINK flags with the sli config topology. + * + * @param sli4 SLI context pointer. + * @param init_link Pointer to the init link command + * + * @return Returns 0 on success, -1 on failure + */ +static int32_t +sli4_set_link_flags_config_topo(sli4_t *sli4, sli4_cmd_init_link_t *init_link) +{ + + switch (sli4->config.topology) { + case SLI4_READ_CFG_TOPO_FC: + // Attempt P2P but failover to FC-AL + init_link->link_flags.enable_topology_failover = TRUE; + init_link->link_flags.topology = SLI4_INIT_LINK_F_P2P_FAIL_OVER; + break; + case SLI4_READ_CFG_TOPO_FC_AL: + init_link->link_flags.topology = SLI4_INIT_LINK_F_FCAL_ONLY; + return (!sli_fcal_is_speed_supported(init_link->link_speed_selection_code)); + + case SLI4_READ_CFG_TOPO_FC_DA: + init_link->link_flags.topology = FC_TOPOLOGY_P2P; + break; + default: + ocs_log_err(sli4->os, "unsupported topology %#x\n", sli4->config.topology); + return -1; + } + + return 0; +} + +/** + * @ingroup sli + * @brief update INIT_LINK flags with the persistent topology. + * PT stores value in compatible form, directly assign to link_flags + * + * @param sli4 SLI context pointer. + * @param init_link Pointer to the init link command + * + * @return Returns 0 on success, -1 on failure + */ +static int32_t +sli4_set_link_flags_persistent_topo(sli4_t *sli4, sli4_cmd_init_link_t *init_link) +{ + if ((sli4->config.pt == SLI4_INIT_LINK_F_FCAL_ONLY) && + (!sli_fcal_is_speed_supported(init_link->link_speed_selection_code))) + return -1; + + init_link->link_flags.enable_topology_failover = sli4->config.tf; + init_link->link_flags.topology = sli4->config.pt; + + return 0; +} + /** * @ingroup sli * @brief Write an INIT_LINK command to the provided buffer. @@ -781,6 +838,7 @@ int32_t sli_cmd_init_link(sli4_t *sli4, void *buf, size_t size, uint32_t speed, uint8_t reset_alpa) { sli4_cmd_init_link_t *init_link = buf; + int32_t rc = 0; ocs_memset(buf, 0, size); @@ -806,41 +864,23 @@ sli_cmd_init_link(sli4_t *sli4, void *buf, size_t size, uint32_t speed, uint8_t return 0; } - switch (sli4->config.topology) { - case SLI4_READ_CFG_TOPO_FC: - /* Attempt P2P but failover to FC-AL */ - init_link->link_flags.enable_topology_failover = TRUE; - - if (sli_get_asic_type(sli4) == SLI4_ASIC_TYPE_LANCER) - init_link->link_flags.topology = SLI4_INIT_LINK_F_FCAL_FAIL_OVER; - else - init_link->link_flags.topology = SLI4_INIT_LINK_F_P2P_FAIL_OVER; - - break; - case SLI4_READ_CFG_TOPO_FC_AL: - init_link->link_flags.topology = SLI4_INIT_LINK_F_FCAL_ONLY; - if ((init_link->link_speed_selection_code == FC_LINK_SPEED_16G) || - (init_link->link_speed_selection_code == FC_LINK_SPEED_32G)) { - ocs_log_test(sli4->os, "unsupported FC-AL speed %d\n", speed); - return 0; - } - break; - case SLI4_READ_CFG_TOPO_FC_DA: - init_link->link_flags.topology = FC_TOPOLOGY_P2P; - break; - default: - ocs_log_test(sli4->os, "unsupported topology %#x\n", sli4->config.topology); - return 0; - } - init_link->link_flags.unfair = FALSE; init_link->link_flags.skip_lirp_lilp = FALSE; init_link->link_flags.gen_loop_validity_check = FALSE; init_link->link_flags.skip_lisa = FALSE; init_link->link_flags.select_hightest_al_pa = FALSE; + + //update topology in the link flags for link bring up + ocs_log_info(sli4->os, "bring up link with topology: %d, PTV: %d, TF: %d, PT: %d \n", + sli4->config.topology, sli4->config.ptv, sli4->config.tf, sli4->config.pt); + if (sli4->config.ptv) + rc = sli4_set_link_flags_persistent_topo(sli4, init_link); + else + rc = sli4_set_link_flags_config_topo(sli4, init_link); + } - return sizeof(sli4_cmd_init_link_t); + return rc ? 0 : sizeof(sli4_cmd_init_link_t); } /** @@ -3740,6 +3780,14 @@ sli_get_config(sli4_t *sli4) } sli4->config.topology = read_config->topology; + sli4->config.ptv = read_config->ptv; + if (sli4->config.ptv){ + sli4->config.tf = read_config->tf; + sli4->config.pt = read_config->pt; + } + ocs_log_info(sli4->os, "Persistent Topology: PTV: %d, TF: %d, PT: %d \n", + sli4->config.topology, sli4->config.ptv, sli4->config.tf, sli4->config.pt); + switch (sli4->config.topology) { case SLI4_READ_CFG_TOPO_FCOE: ocs_log_debug(sli4->os, "FCoE\n"); @@ -4178,6 +4226,12 @@ sli_setup(sli4_t *sli4, ocs_os_handle_t os, sli4_port_type_e port_type) return 0; } +bool +sli_persist_topology_enabled(sli4_t *sli4) +{ + return (sli4->config.ptv); +} + int32_t sli_init(sli4_t *sli4) { diff --git a/sys/dev/ocs_fc/sli4.h b/sys/dev/ocs_fc/sli4.h index 93dd2ca89393..bcce6764c743 100644 --- a/sys/dev/ocs_fc/sli4.h +++ b/sys/dev/ocs_fc/sli4.h @@ -796,7 +796,10 @@ typedef struct sli4_res_read_config_s { #if BYTE_ORDER == LITTLE_ENDIAN uint32_t :31, ext:1; /** Resource Extents */ - uint32_t :24, + uint32_t :20, + pt:2, + tf:1, + ptv:1, topology:8; uint32_t rsvd3; uint32_t e_d_tov:16, @@ -2553,6 +2556,7 @@ typedef struct sli4_res_common_set_dump_location_s { #define SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE 0x0D #define SLI4_SET_FEATURES_SET_FTD_XFER_HINT 0x0F #define SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK 0x11 +#define SLI4_SET_FEATURES_PERSISTENT_TOPOLOGY 0x20 typedef struct sli4_req_common_set_features_s { sli4_req_hdr_t hdr; @@ -2630,6 +2634,16 @@ typedef struct sli4_req_common_set_features_set_fdt_xfer_hint_s { #endif } sli4_req_common_set_features_set_fdt_xfer_hint_t; +typedef struct sli4_req_common_set_features_persistent_topo_param_s { +#if BYTE_ORDER == LITTLE_ENDIAN + uint32_t persistent_topo:2, + topo_failover:1, + :29; +#else +#error big endian version not defined +#endif +} sli4_req_common_set_features_persistent_topo_param_t; + /** * @brief DMTF_EXEC_CLP_CMD */ @@ -3247,6 +3261,10 @@ typedef struct sli4_s { uint16_t rq_min_buf_size; uint32_t rq_max_buf_size; uint8_t topology; + uint8_t pt:4, + tf:1, + ptv:1, + :2; uint8_t wwpn[8]; uint8_t wwnn[8]; uint32_t fw_rev[2]; @@ -3585,6 +3603,13 @@ sli_set_topology(sli4_t *sli4, uint32_t value) return rc; } +static inline void +sli_config_persistent_topology(sli4_t *sli4, sli4_req_common_set_features_persistent_topo_param_t *req) +{ + sli4->config.pt = req->persistent_topo; + sli4->config.tf = req->topo_failover; +} + static inline uint16_t sli_get_link_module_type(sli4_t *sli4) { @@ -3618,6 +3643,19 @@ sli_convert_mask_to_count(uint32_t method, uint32_t mask) return count; } +static inline bool +sli_fcal_is_speed_supported(uint32_t link_speed) +{ + if ((link_speed == FC_LINK_SPEED_16G) || + (link_speed == FC_LINK_SPEED_32G) || + (link_speed >= FC_LINK_SPEED_AUTO_32_16)) { + ocs_log_err(NULL, "unsupported FC-AL speed (speed_code: %d)\n", link_speed); + return FALSE; + } + + return TRUE; +} + /** * @brief Common Create Queue function prototype */ @@ -5596,6 +5634,8 @@ extern int32_t sli_xmit_bls_rsp64_wqe(sli4_t *, void *, size_t, sli_bls_payload_ extern int32_t sli_xmit_els_rsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t, uint32_t); extern int32_t sli_requeue_xri_wqe(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t); extern void sli4_cmd_lowlevel_set_watchdog(sli4_t *sli4, void *buf, size_t size, uint16_t timeout); +extern bool sli_persist_topology_enabled(sli4_t *sli4); + /** * @ingroup sli_fc