Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) }