^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2014- QLogic Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * All rights reserved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * www.qlogic.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * bfa_fcs.c BFA FCS main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "bfad_drv.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "bfad_im.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "bfa_fcs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include "bfa_fcbuild.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) BFA_TRC_FILE(FCS, FCS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * fcs_api BFA FCS API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) bfa_fcs_exit_comp(void *fcs_cbarg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct bfa_fcs_s *fcs = fcs_cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct bfad_s *bfad = fcs->bfad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) complete(&bfad->comp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * fcs initialization, called once after bfa initialization is complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) bfa_fcs_init(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) bfa_sm_send_event(&fcs->fabric, BFA_FCS_FABRIC_SM_CREATE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) bfa_trc(fcs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * fcs_api BFA FCS API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * FCS update cfg - reset the pwwn/nwwn of fabric base logical port
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * with values learned during bfa_init firmware GETATTR REQ.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) bfa_fcs_update_cfg(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct bfa_fcs_fabric_s *fabric = &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct bfa_lport_cfg_s *port_cfg = &fabric->bport.port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct bfa_ioc_s *ioc = &fabric->fcs->bfa->ioc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) port_cfg->nwwn = ioc->attr->nwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) port_cfg->pwwn = ioc->attr->pwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * Stop FCS operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) bfa_fcs_stop(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) bfa_wc_init(&fcs->wc, bfa_fcs_exit_comp, fcs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) bfa_wc_up(&fcs->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) bfa_fcs_fabric_modstop(fcs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) bfa_wc_wait(&fcs->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * fcs pbc vport initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) bfa_fcs_pbc_vport_init(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) int i, npbc_vports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct bfi_pbc_vport_s pbc_vports[BFI_PBC_MAX_VPORTS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Initialize pbc vports */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) if (!fcs->min_cfg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) npbc_vports =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) bfa_iocfc_get_pbc_vports(fcs->bfa, pbc_vports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) for (i = 0; i < npbc_vports; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) bfa_fcb_pbc_vport_create(fcs->bfa->bfad, pbc_vports[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * brief
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * FCS driver details initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * param[in] fcs FCS instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * param[in] driver_info Driver Details
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * return None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) bfa_fcs_driver_info_init(struct bfa_fcs_s *fcs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct bfa_fcs_driver_info_s *driver_info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) fcs->driver_info = *driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) bfa_fcs_fabric_psymb_init(&fcs->fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) bfa_fcs_fabric_nsymb_init(&fcs->fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * brief
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * FCS instance cleanup and exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * param[in] fcs FCS instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * return None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) bfa_fcs_exit(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) bfa_wc_init(&fcs->wc, bfa_fcs_exit_comp, fcs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) bfa_wc_up(&fcs->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) bfa_trc(fcs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) bfa_lps_delete(fcs->fabric.lps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) bfa_sm_send_event(&fcs->fabric, BFA_FCS_FABRIC_SM_DELETE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) bfa_wc_wait(&fcs->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) * Fabric module implementation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define BFA_FCS_FABRIC_RETRY_DELAY (2000) /* Milliseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define BFA_FCS_FABRIC_CLEANUP_DELAY (10000) /* Milliseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define bfa_fcs_fabric_set_opertype(__fabric) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) if (bfa_fcport_get_topology((__fabric)->fcs->bfa) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) == BFA_PORT_TOPOLOGY_P2P) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) if (fabric->fab_type == BFA_FCS_FABRIC_SWITCHED) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) (__fabric)->oper_type = BFA_PORT_TYPE_NPORT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) (__fabric)->oper_type = BFA_PORT_TYPE_P2P; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) } else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) (__fabric)->oper_type = BFA_PORT_TYPE_NLPORT; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * forward declarations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static void bfa_fcs_fabric_init(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static void bfa_fcs_fabric_login(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static void bfa_fcs_fabric_notify_online(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static void bfa_fcs_fabric_notify_offline(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static void bfa_fcs_fabric_delay(void *cbarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static void bfa_fcs_fabric_delete(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static void bfa_fcs_fabric_delete_comp(void *cbarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static void bfa_fcs_fabric_stop(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static void bfa_fcs_fabric_stop_comp(void *cbarg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static void bfa_fcs_fabric_process_uf(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) struct fchs_s *fchs, u16 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static void bfa_fcs_fabric_process_flogi(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) struct fchs_s *fchs, u16 len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) static void bfa_fcs_fabric_send_flogi_acc(struct bfa_fcs_fabric_s *fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static void bfa_fcs_fabric_flogiacc_comp(void *fcsarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct bfa_fcxp_s *fcxp, void *cbarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) bfa_status_t status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) u32 rsp_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) u32 resid_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) struct fchs_s *rspfchs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) static void bfa_fcs_fabric_sm_uninit(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static void bfa_fcs_fabric_sm_created(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) static void bfa_fcs_fabric_sm_linkdown(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static void bfa_fcs_fabric_sm_flogi(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) static void bfa_fcs_fabric_sm_flogi_retry(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) static void bfa_fcs_fabric_sm_auth(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static void bfa_fcs_fabric_sm_nofabric(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static void bfa_fcs_fabric_sm_evfp(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) static void bfa_fcs_fabric_sm_evfp_done(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static void bfa_fcs_fabric_sm_isolated(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) static void bfa_fcs_fabric_sm_deleting(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) static void bfa_fcs_fabric_sm_stopping(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static void bfa_fcs_fabric_sm_cleanup(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) enum bfa_fcs_fabric_event event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * Beginning state before fabric creation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) bfa_fcs_fabric_sm_uninit(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) case BFA_FCS_FABRIC_SM_CREATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) bfa_fcs_fabric_init(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) bfa_fcs_lport_init(&fabric->bport, &fabric->bport.port_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) case BFA_FCS_FABRIC_SM_LINK_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * Beginning state before fabric creation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) bfa_fcs_fabric_sm_created(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct bfa_s *bfa = fabric->fcs->bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) case BFA_FCS_FABRIC_SM_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) if (!bfa_fcport_is_linkup(fabric->fcs->bfa)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (bfa_fcport_get_topology(bfa) ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) BFA_PORT_TOPOLOGY_LOOP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) fabric->fab_type = BFA_FCS_FABRIC_LOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) fabric->bport.pid = bfa_fcport_get_myalpa(bfa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) fabric->bport.pid = bfa_hton3b(fabric->bport.pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) bfa_sm_set_state(fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) bfa_fcs_fabric_sm_online);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) bfa_fcs_fabric_set_opertype(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) bfa_fcs_lport_online(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) bfa_fcs_fabric_login(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) case BFA_FCS_FABRIC_SM_LINK_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * Link is down, awaiting LINK UP event from port. This is also the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * first state at fabric creation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) bfa_fcs_fabric_sm_linkdown(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) struct bfa_s *bfa = fabric->fcs->bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) case BFA_FCS_FABRIC_SM_LINK_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) if (bfa_fcport_get_topology(bfa) != BFA_PORT_TOPOLOGY_LOOP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) bfa_fcs_fabric_login(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) fabric->fab_type = BFA_FCS_FABRIC_LOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) fabric->bport.pid = bfa_fcport_get_myalpa(bfa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) fabric->bport.pid = bfa_hton3b(fabric->bport.pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_online);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) bfa_fcs_fabric_set_opertype(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) bfa_fcs_lport_online(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) case BFA_FCS_FABRIC_SM_RETRY_OP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) case BFA_FCS_FABRIC_SM_LOOPBACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) case BFA_FCS_FABRIC_SM_STOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_cleanup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) bfa_fcs_fabric_stop(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * FLOGI is in progress, awaiting FLOGI reply.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) bfa_fcs_fabric_sm_flogi(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) case BFA_FCS_FABRIC_SM_CONT_OP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) fabric->bb_credit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) fabric->fab_type = BFA_FCS_FABRIC_SWITCHED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (fabric->auth_reqd && fabric->is_auth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_online);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) bfa_fcs_fabric_notify_online(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) case BFA_FCS_FABRIC_SM_RETRY_OP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi_retry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) bfa_timer_start(fabric->fcs->bfa, &fabric->delay_timer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) bfa_fcs_fabric_delay, fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) BFA_FCS_FABRIC_RETRY_DELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) case BFA_FCS_FABRIC_SM_LOOPBACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_loopback);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) bfa_fcs_fabric_set_opertype(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) case BFA_FCS_FABRIC_SM_NO_FABRIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) fabric->fab_type = BFA_FCS_FABRIC_N2N;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) fabric->bb_credit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) bfa_fcs_fabric_notify_online(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_nofabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) bfa_fcs_fabric_sm_flogi_retry(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) case BFA_FCS_FABRIC_SM_DELAYED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_flogi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) bfa_fcs_fabric_login(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) bfa_timer_stop(&fabric->delay_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) bfa_timer_stop(&fabric->delay_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) * Authentication is in progress, awaiting authentication results.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) bfa_fcs_fabric_sm_auth(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) case BFA_FCS_FABRIC_SM_AUTH_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_auth_failed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) case BFA_FCS_FABRIC_SM_AUTH_SUCCESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_online);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) bfa_fcs_fabric_notify_online(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) case BFA_FCS_FABRIC_SM_PERF_EVFP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_evfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) * Authentication failed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) bfa_fcs_fabric_sm_auth_failed(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) bfa_fcs_fabric_notify_offline(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) * Port is in loopback mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) bfa_fcs_fabric_sm_loopback(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) bfa_fcs_fabric_notify_offline(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) * There is no attached fabric - private loop or NPort-to-NPort topology.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) bfa_fcs_fabric_sm_nofabric(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) bfa_fcs_fabric_notify_offline(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) case BFA_FCS_FABRIC_SM_NO_FABRIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) bfa_trc(fabric->fcs, fabric->bb_credit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) bfa_fcport_set_tx_bbcredit(fabric->fcs->bfa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) fabric->bb_credit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) case BFA_FCS_FABRIC_SM_RETRY_OP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) * Fabric is online - normal operating state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) bfa_fcs_fabric_sm_online(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) struct bfa_s *bfa = fabric->fcs->bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_linkdown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) if (bfa_fcport_get_topology(bfa) == BFA_PORT_TOPOLOGY_LOOP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) bfa_fcs_lport_offline(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) bfa_fcs_fabric_notify_offline(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) case BFA_FCS_FABRIC_SM_DELETE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_deleting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) bfa_fcs_fabric_delete(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) case BFA_FCS_FABRIC_SM_STOP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_stopping);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) bfa_fcs_fabric_stop(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) case BFA_FCS_FABRIC_SM_AUTH_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_auth_failed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_OFFLINE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) case BFA_FCS_FABRIC_SM_AUTH_SUCCESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) * Exchanging virtual fabric parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) bfa_fcs_fabric_sm_evfp(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) case BFA_FCS_FABRIC_SM_CONT_OP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_evfp_done);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) case BFA_FCS_FABRIC_SM_ISOLATE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_isolated);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) * EVFP exchange complete and VFT tagging is enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) bfa_fcs_fabric_sm_evfp_done(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) * Port is isolated after EVFP exchange due to VF_ID mismatch (N and F).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) bfa_fcs_fabric_sm_isolated(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) struct bfad_s *bfad = (struct bfad_s *)fabric->fcs->bfad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) char pwwn_ptr[BFA_STRING_32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) wwn2str(pwwn_ptr, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) BFA_LOG(KERN_INFO, bfad, bfa_log_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) "Port is isolated due to VF_ID mismatch. "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) "PWWN: %s Port VF_ID: %04x switch port VF_ID: %04x.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) pwwn_ptr, fabric->fcs->port_vfid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) fabric->event_arg.swp_vfid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) * Fabric is being deleted, awaiting vport delete completions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) bfa_fcs_fabric_sm_deleting(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) case BFA_FCS_FABRIC_SM_DELCOMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_uninit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) bfa_wc_down(&fabric->fcs->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) case BFA_FCS_FABRIC_SM_LINK_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) bfa_fcs_fabric_notify_offline(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) * Fabric is being stopped, awaiting vport stop completions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) bfa_fcs_fabric_sm_stopping(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) struct bfa_s *bfa = fabric->fcs->bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) case BFA_FCS_FABRIC_SM_STOPCOMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) if (bfa_fcport_get_topology(bfa) == BFA_PORT_TOPOLOGY_LOOP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_cleanup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) bfa_sm_send_event(fabric->lps, BFA_LPS_SM_LOGOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) case BFA_FCS_FABRIC_SM_LINK_UP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) if (bfa_fcport_get_topology(bfa) == BFA_PORT_TOPOLOGY_LOOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_cleanup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) * Fabric is being stopped, cleanup without FLOGO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) bfa_fcs_fabric_sm_cleanup(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) enum bfa_fcs_fabric_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) bfa_trc(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) case BFA_FCS_FABRIC_SM_STOPCOMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) case BFA_FCS_FABRIC_SM_LOGOCOMP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_created);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) bfa_wc_down(&(fabric->fcs)->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) case BFA_FCS_FABRIC_SM_LINK_DOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) * Ignore - can get this event if we get notified about IOC down
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) * before the fabric completion callbk is done.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) bfa_sm_fault(fabric->fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * fcs_fabric_private fabric private functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) bfa_fcs_fabric_init(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) struct bfa_lport_cfg_s *port_cfg = &fabric->bport.port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) port_cfg->roles = BFA_LPORT_ROLE_FCP_IM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) port_cfg->nwwn = fabric->fcs->bfa->ioc.attr->nwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) port_cfg->pwwn = fabric->fcs->bfa->ioc.attr->pwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) * Port Symbolic Name Creation for base port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) struct bfa_lport_cfg_s *port_cfg = &fabric->bport.port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) char model[BFA_ADAPTER_MODEL_NAME_LEN] = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) struct bfa_fcs_driver_info_s *driver_info = &fabric->fcs->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) /* Model name/number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) strlcpy(port_cfg->sym_name.symname, model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) /* Driver Version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) strlcat(port_cfg->sym_name.symname, driver_info->version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) /* Host machine name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) strlcat(port_cfg->sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) driver_info->host_machine_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) * Host OS Info :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) * If OS Patch Info is not there, do not truncate any bytes from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) * OS name string and instead copy the entire OS info string (64 bytes).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) if (driver_info->host_os_patch[0] == '\0') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) strlcat(port_cfg->sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) driver_info->host_os_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) strlcat(port_cfg->sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) strlcat(port_cfg->sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) driver_info->host_os_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) strlcat(port_cfg->sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) /* Append host OS Patch Info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) strlcat(port_cfg->sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) driver_info->host_os_patch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* null terminate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) port_cfg->sym_name.symname[BFA_SYMNAME_MAXLEN - 1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) * Node Symbolic Name Creation for base port and all vports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) struct bfa_lport_cfg_s *port_cfg = &fabric->bport.port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) char model[BFA_ADAPTER_MODEL_NAME_LEN] = {0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) struct bfa_fcs_driver_info_s *driver_info = &fabric->fcs->driver_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) /* Model name/number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) strlcpy(port_cfg->node_sym_name.symname, model,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) strlcat(port_cfg->node_sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) /* Driver Version */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) strlcat(port_cfg->node_sym_name.symname, (char *)driver_info->version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) strlcat(port_cfg->node_sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) /* Host machine name */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) strlcat(port_cfg->node_sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) driver_info->host_machine_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) strlcat(port_cfg->node_sym_name.symname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) BFA_FCS_PORT_SYMBNAME_SEPARATOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) BFA_SYMNAME_MAXLEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) /* null terminate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) port_cfg->node_sym_name.symname[BFA_SYMNAME_MAXLEN - 1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) * bfa lps login completion callback
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) struct bfa_fcs_fabric_s *fabric = uarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) bfa_trc(fabric->fcs, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) switch (status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) case BFA_STATUS_OK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) fabric->stats.flogi_accepts++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) case BFA_STATUS_INVALID_MAC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) /* Only for CNA */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) fabric->stats.flogi_acc_err++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_RETRY_OP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) case BFA_STATUS_EPROTOCOL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) switch (fabric->lps->ext_status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) case BFA_EPROTO_BAD_ACCEPT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) fabric->stats.flogi_acc_err++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) case BFA_EPROTO_UNKNOWN_RSP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) fabric->stats.flogi_unknown_rsp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_RETRY_OP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) case BFA_STATUS_FABRIC_RJT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) fabric->stats.flogi_rejects++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_RETRY_OP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) fabric->stats.flogi_rsp_err++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_RETRY_OP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) fabric->bb_credit = fabric->lps->pr_bbcred;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) bfa_trc(fabric->fcs, fabric->bb_credit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) if (!(fabric->lps->brcd_switch))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) fabric->fabric_name = fabric->lps->pr_nwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) * Check port type. It should be 1 = F-port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) if (fabric->lps->fport) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) fabric->bport.pid = fabric->lps->lp_pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) fabric->is_npiv = fabric->lps->npiv_en;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) fabric->is_auth = fabric->lps->auth_req;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_CONT_OP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) * Nport-2-Nport direct attached
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) fabric->bport.port_topo.pn2n.rem_port_wwn =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) fabric->lps->pr_pwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) fabric->fab_type = BFA_FCS_FABRIC_N2N;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_NO_FABRIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) bfa_trc(fabric->fcs, fabric->bport.pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) bfa_trc(fabric->fcs, fabric->is_npiv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) bfa_trc(fabric->fcs, fabric->is_auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) * Allocate and send FLOGI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) bfa_fcs_fabric_login(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) struct bfa_s *bfa = fabric->fcs->bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) struct bfa_lport_cfg_s *pcfg = &fabric->bport.port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) u8 alpa = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) bfa_lps_flogi(fabric->lps, fabric, alpa, bfa_fcport_get_maxfrsize(bfa),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) pcfg->pwwn, pcfg->nwwn, fabric->auth_reqd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) fabric->stats.flogi_sent++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) bfa_fcs_fabric_notify_online(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) struct list_head *qe, *qen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) bfa_trc(fabric->fcs, fabric->fabric_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) bfa_fcs_fabric_set_opertype(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) fabric->stats.fabric_onlines++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) * notify online event to base and then virtual ports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) bfa_fcs_lport_online(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) list_for_each_safe(qe, qen, &fabric->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) bfa_fcs_vport_online(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) bfa_fcs_fabric_notify_offline(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) struct list_head *qe, *qen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) bfa_trc(fabric->fcs, fabric->fabric_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) fabric->stats.fabric_offlines++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) * notify offline event first to vports and then base port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) list_for_each_safe(qe, qen, &fabric->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) bfa_fcs_vport_offline(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) bfa_fcs_lport_offline(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) fabric->fabric_name = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) fabric->fabric_ip_addr[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) bfa_fcs_fabric_delay(void *cbarg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) struct bfa_fcs_fabric_s *fabric = cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_DELAYED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) * Stop all vports and wait for vport stop completions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) bfa_fcs_fabric_stop(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) struct list_head *qe, *qen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) bfa_wc_init(&fabric->stop_wc, bfa_fcs_fabric_stop_comp, fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) list_for_each_safe(qe, qen, &fabric->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) bfa_wc_up(&fabric->stop_wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) bfa_fcs_vport_fcs_stop(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) bfa_wc_up(&fabric->stop_wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) bfa_fcs_lport_stop(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) bfa_wc_wait(&fabric->stop_wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) * Delete all vports and wait for vport delete completions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) bfa_fcs_fabric_delete(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) struct list_head *qe, *qen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) list_for_each_safe(qe, qen, &fabric->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) bfa_fcs_vport_fcs_delete(vport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) bfa_fcs_lport_delete(&fabric->bport);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) bfa_wc_wait(&fabric->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) bfa_fcs_fabric_delete_comp(void *cbarg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) struct bfa_fcs_fabric_s *fabric = cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_DELCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) bfa_fcs_fabric_stop_comp(void *cbarg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) struct bfa_fcs_fabric_s *fabric = cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_STOPCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) * fcs_fabric_public fabric public functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) * Fabric module stop -- stop FCS actions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) bfa_fcs_fabric_modstop(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) struct bfa_fcs_fabric_s *fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) bfa_trc(fcs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) fabric = &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_STOP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) * Fabric module start -- kick starts FCS actions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) bfa_fcs_fabric_modstart(struct bfa_fcs_s *fcs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) struct bfa_fcs_fabric_s *fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) bfa_trc(fcs, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) fabric = &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_START);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) * Link up notification from BFA physical port module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) bfa_fcs_fabric_link_up(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_LINK_UP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) * Link down notification from BFA physical port module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) bfa_fcs_fabric_link_down(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) bfa_trc(fabric->fcs, fabric->bport.port_cfg.pwwn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_LINK_DOWN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) * A child vport is being created in the fabric.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) * Call from vport module at vport creation. A list of base port and vports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) * belonging to a fabric is maintained to propagate link events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) * param[in] fabric - Fabric instance. This can be a base fabric or vf.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) * param[in] vport - Vport being created.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) * @return None (always succeeds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) bfa_fcs_fabric_addvport(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) struct bfa_fcs_vport_s *vport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) * - add vport to fabric's vport_q
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) bfa_trc(fabric->fcs, fabric->vf_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) list_add_tail(&vport->qe, &fabric->vport_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) fabric->num_vports++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) bfa_wc_up(&fabric->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) * A child vport is being deleted from fabric.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) * Vport is being deleted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) bfa_fcs_fabric_delvport(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) struct bfa_fcs_vport_s *vport)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) list_del(&vport->qe);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) fabric->num_vports--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) bfa_wc_down(&fabric->wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) * Lookup for a vport within a fabric given its pwwn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) struct bfa_fcs_vport_s *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) bfa_fcs_fabric_vport_lookup(struct bfa_fcs_fabric_s *fabric, wwn_t pwwn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) struct list_head *qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) list_for_each(qe, &fabric->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) if (bfa_fcs_lport_get_pwwn(&vport->lport) == pwwn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) return vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) * Get OUI of the attached switch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * Note : Use of this function should be avoided as much as possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) * This function should be used only if there is any requirement
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) * to check for FOS version below 6.3.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) * To check if the attached fabric is a brocade fabric, use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) * bfa_lps_is_brcd_fabric() which works for FOS versions 6.3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) * or above only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) u16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) bfa_fcs_fabric_get_switch_oui(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) wwn_t fab_nwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) u8 *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) u16 oui;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) fab_nwwn = fabric->lps->pr_nwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) tmp = (u8 *)&fab_nwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) oui = (tmp[3] << 8) | tmp[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) return oui;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) * Unsolicited frame receive handling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric, struct fchs_s *fchs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) u16 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) u32 pid = fchs->d_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) struct list_head *qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) struct fc_logi_s *flogi = (struct fc_logi_s *) els_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) bfa_trc(fabric->fcs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) bfa_trc(fabric->fcs, pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * Look for our own FLOGI frames being looped back. This means an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * external loopback cable is in place. Our own FLOGI frames are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * sometimes looped back when switch port gets temporarily bypassed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) if ((pid == bfa_ntoh3b(FC_FABRIC_PORT)) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) (els_cmd->els_code == FC_ELS_FLOGI) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) (flogi->port_name == bfa_fcs_lport_get_pwwn(&fabric->bport))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_LOOPBACK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * FLOGI/EVFP exchanges should be consumed by base fabric.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) if (fchs->d_id == bfa_hton3b(FC_FABRIC_PORT)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) bfa_trc(fabric->fcs, pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) bfa_fcs_fabric_process_uf(fabric, fchs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) if (fabric->bport.pid == pid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) * All authentication frames should be routed to auth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) bfa_trc(fabric->fcs, els_cmd->els_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) if (els_cmd->els_code == FC_ELS_AUTH) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) bfa_trc(fabric->fcs, els_cmd->els_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) bfa_trc(fabric->fcs, *(u8 *) ((u8 *) fchs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) bfa_fcs_lport_uf_recv(&fabric->bport, fchs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) * look for a matching local port ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) list_for_each(qe, &fabric->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (vport->lport.pid == pid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) bfa_fcs_lport_uf_recv(&vport->lport, fchs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) if (!bfa_fcs_fabric_is_switched(fabric))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) bfa_fcs_lport_uf_recv(&fabric->bport, fchs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) bfa_trc(fabric->fcs, fchs->type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) * Unsolicited frames to be processed by fabric.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) bfa_fcs_fabric_process_uf(struct bfa_fcs_fabric_s *fabric, struct fchs_s *fchs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) u16 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) struct fc_els_cmd_s *els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) bfa_trc(fabric->fcs, els_cmd->els_code);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) switch (els_cmd->els_code) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) case FC_ELS_FLOGI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) bfa_fcs_fabric_process_flogi(fabric, fchs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) * need to generate a LS_RJT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) * Process incoming FLOGI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) bfa_fcs_fabric_process_flogi(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) struct fchs_s *fchs, u16 len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) struct fc_logi_s *flogi = (struct fc_logi_s *) (fchs + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) struct bfa_fcs_lport_s *bport = &fabric->bport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) bfa_trc(fabric->fcs, fchs->s_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) fabric->stats.flogi_rcvd++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) * Check port type. It should be 0 = n-port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) if (flogi->csp.port_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) * @todo: may need to send a LS_RJT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) bfa_trc(fabric->fcs, flogi->port_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) fabric->stats.flogi_rejected++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) fabric->bb_credit = be16_to_cpu(flogi->csp.bbcred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) bport->port_topo.pn2n.rem_port_wwn = flogi->port_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) bport->port_topo.pn2n.reply_oxid = fchs->ox_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) * Send a Flogi Acc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) bfa_fcs_fabric_send_flogi_acc(fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_NO_FABRIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) bfa_fcs_fabric_send_flogi_acc(struct bfa_fcs_fabric_s *fabric)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) struct bfa_lport_cfg_s *pcfg = &fabric->bport.port_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) struct bfa_fcs_lport_n2n_s *n2n_port = &fabric->bport.port_topo.pn2n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) struct bfa_s *bfa = fabric->fcs->bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) struct bfa_fcxp_s *fcxp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) u16 reqlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) struct fchs_s fchs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) fcxp = bfa_fcs_fcxp_alloc(fabric->fcs, BFA_FALSE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) * Do not expect this failure -- expect remote node to retry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) if (!fcxp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) reqlen = fc_flogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) bfa_hton3b(FC_FABRIC_PORT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) n2n_port->reply_oxid, pcfg->pwwn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) pcfg->nwwn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) bfa_fcport_get_maxfrsize(bfa),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) bfa_fcport_get_rx_bbcredit(bfa), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) bfa_fcxp_send(fcxp, NULL, fabric->vf_id, fabric->lps->bfa_tag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) BFA_FALSE, FC_CLASS_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) reqlen, &fchs, bfa_fcs_fabric_flogiacc_comp, fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) FC_MAX_PDUSZ, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) * Flogi Acc completion callback.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) bfa_fcs_fabric_flogiacc_comp(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) bfa_status_t status, u32 rsp_len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) u32 resid_len, struct fchs_s *rspfchs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) struct bfa_fcs_fabric_s *fabric = cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) bfa_trc(fabric->fcs, status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) * Send AEN notification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) bfa_fcs_fabric_aen_post(struct bfa_fcs_lport_s *port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) enum bfa_port_aen_event event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) struct bfad_s *bfad = (struct bfad_s *)port->fabric->fcs->bfad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) struct bfa_aen_entry_s *aen_entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) bfad_get_aen_entry(bfad, aen_entry);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) if (!aen_entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) aen_entry->aen_data.port.pwwn = bfa_fcs_lport_get_pwwn(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) aen_entry->aen_data.port.fwwn = bfa_fcs_lport_get_fabric_name(port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) /* Send the AEN notification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) bfad_im_post_vendor_event(aen_entry, bfad, ++port->fcs->fcs_aen_seq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) BFA_AEN_CAT_PORT, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) * @param[in] fabric - fabric
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) * @param[in] wwn_t - new fabric name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) * @return - none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) bfa_fcs_fabric_set_fabric_name(struct bfa_fcs_fabric_s *fabric,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) wwn_t fabric_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) struct bfad_s *bfad = (struct bfad_s *)fabric->fcs->bfad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) char pwwn_ptr[BFA_STRING_32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) char fwwn_ptr[BFA_STRING_32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) bfa_trc(fabric->fcs, fabric_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) if (fabric->fabric_name == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) * With BRCD switches, we don't get Fabric Name in FLOGI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) * Don't generate a fabric name change event in this case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) fabric->fabric_name = fabric_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) fabric->fabric_name = fabric_name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) wwn2str(pwwn_ptr, bfa_fcs_lport_get_pwwn(&fabric->bport));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) wwn2str(fwwn_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) bfa_fcs_lport_get_fabric_name(&fabric->bport));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) BFA_LOG(KERN_WARNING, bfad, bfa_log_level,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) "Base port WWN = %s Fabric WWN = %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) pwwn_ptr, fwwn_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) bfa_fcs_fabric_aen_post(&fabric->bport,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) BFA_PORT_AEN_FABRIC_NAME_CHANGE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) bfa_cb_lps_flogo_comp(void *bfad, void *uarg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) struct bfa_fcs_fabric_s *fabric = uarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) bfa_sm_send_event(fabric, BFA_FCS_FABRIC_SM_LOGOCOMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) * Returns FCS vf structure for a given vf_id.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) * param[in] vf_id - VF_ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) * return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) * If lookup succeeds, retuns fcs vf object, otherwise returns NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) bfa_fcs_vf_t *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) bfa_fcs_vf_lookup(struct bfa_fcs_s *fcs, u16 vf_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) bfa_trc(fcs, vf_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) if (vf_id == FC_VF_ID_NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) return &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) * Return the list of local logical ports present in the given VF.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) * @param[in] vf vf for which logical ports are returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) * @param[out] lpwwn returned logical port wwn list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) * @param[in,out] nlports in:size of lpwwn list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) * out:total elements present,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) * actual elements returned is limited by the size
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) bfa_fcs_vf_get_ports(bfa_fcs_vf_t *vf, wwn_t lpwwn[], int *nlports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) struct list_head *qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) struct bfa_fcs_vport_s *vport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) struct bfa_fcs_s *fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) if (vf == NULL || lpwwn == NULL || *nlports == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) fcs = vf->fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) bfa_trc(fcs, vf->vf_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) bfa_trc(fcs, (uint32_t) *nlports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) lpwwn[i++] = vf->bport.port_cfg.pwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) list_for_each(qe, &vf->vport_q) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) if (i >= *nlports)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) vport = (struct bfa_fcs_vport_s *) qe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) lpwwn[i++] = vport->lport.port_cfg.pwwn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) bfa_trc(fcs, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) *nlports = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) * BFA FCS PPORT ( physical port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) bfa_fcs_port_event_handler(void *cbarg, enum bfa_port_linkstate event)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) struct bfa_fcs_s *fcs = cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) bfa_trc(fcs, event);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) switch (event) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) case BFA_PORT_LINKUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) bfa_fcs_fabric_link_up(&fcs->fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) case BFA_PORT_LINKDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) bfa_fcs_fabric_link_down(&fcs->fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) * BFA FCS UF ( Unsolicited Frames)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) * BFA callback for unsolicited frame receive handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) * @param[in] cbarg callback arg for receive handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) * @param[in] uf unsolicited frame descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) * @return None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) bfa_fcs_uf_recv(void *cbarg, struct bfa_uf_s *uf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) struct bfa_fcs_s *fcs = (struct bfa_fcs_s *) cbarg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) struct fchs_s *fchs = bfa_uf_get_frmbuf(uf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) u16 len = bfa_uf_get_frmlen(uf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) struct fc_vft_s *vft;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) struct bfa_fcs_fabric_s *fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) * check for VFT header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (fchs->routing == FC_RTG_EXT_HDR &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) fchs->cat_info == FC_CAT_VFT_HDR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) bfa_stats(fcs, uf.tagged);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) vft = bfa_uf_get_frmbuf(uf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) if (fcs->port_vfid == vft->vf_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) fabric = &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) fabric = bfa_fcs_vf_lookup(fcs, (u16) vft->vf_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) * drop frame if vfid is unknown
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) if (!fabric) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) WARN_ON(1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) bfa_stats(fcs, uf.vfid_unknown);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) bfa_uf_free(uf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) * skip vft header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) fchs = (struct fchs_s *) (vft + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) len -= sizeof(struct fc_vft_s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) bfa_trc(fcs, vft->vf_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) bfa_stats(fcs, uf.untagged);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) fabric = &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) bfa_trc(fcs, ((u32 *) fchs)[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) bfa_trc(fcs, ((u32 *) fchs)[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) bfa_trc(fcs, ((u32 *) fchs)[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) bfa_trc(fcs, ((u32 *) fchs)[3]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) bfa_trc(fcs, ((u32 *) fchs)[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) bfa_trc(fcs, ((u32 *) fchs)[5]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) bfa_trc(fcs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) bfa_fcs_fabric_uf_recv(fabric, fchs, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) bfa_uf_free(uf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) * fcs attach -- called once to initialize data structures at driver attach time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) bfa_boolean_t min_cfg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) struct bfa_fcs_fabric_s *fabric = &fcs->fabric;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) fcs->bfa = bfa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) fcs->bfad = bfad;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) fcs->min_cfg = min_cfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) fcs->num_rport_logins = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) bfa->fcs = BFA_TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) fcbuild_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) bfa_fcport_event_register(fcs->bfa, bfa_fcs_port_event_handler, fcs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) bfa_uf_recv_register(fcs->bfa, bfa_fcs_uf_recv, fcs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) memset(fabric, 0, sizeof(struct bfa_fcs_fabric_s));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) * Initialize base fabric.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) fabric->fcs = fcs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) INIT_LIST_HEAD(&fabric->vport_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) INIT_LIST_HEAD(&fabric->vf_q);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) fabric->lps = bfa_lps_alloc(fcs->bfa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) WARN_ON(!fabric->lps);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) * Initialize fabric delete completion handler. Fabric deletion is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) * complete when the last vport delete is complete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) bfa_wc_init(&fabric->wc, bfa_fcs_fabric_delete_comp, fabric);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) bfa_wc_up(&fabric->wc); /* For the base port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) bfa_sm_set_state(fabric, bfa_fcs_fabric_sm_uninit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) bfa_fcs_lport_attach(&fabric->bport, fabric->fcs, FC_VF_ID_NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) }