bfa_fcs_fcpim.c revision f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2e
17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
27725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved
47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com
57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter.
77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it
97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as
107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation
117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but
137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of
147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details.
167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcpim.c - FCP initiator mode i-t nexus state machine
207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa.h>
237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa_svc.h>
247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_fcpim.h"
257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_rport.h"
267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_lport.h"
277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_trcmod.h"
287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs_fcxp.h"
297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include "fcs.h"
307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <fcs/bfa_fcs_fcpim.h>
317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <fcb/bfa_fcb_fcpim.h>
327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <aen/bfa_aen_itnim.h>
337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(FCS, FCPIM);
357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations
387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_timeout(void *arg);
407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim);
417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_send_prli(void *itnim_cbarg,
427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					struct bfa_fcxp_s *fcxp_alloced);
437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_prli_response(void *fcsarg,
447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    struct bfa_fcxp_s *fcxp,
457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    void *cbarg,
467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    bfa_status_t req_status,
477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    u32 rsp_len,
487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    u32 resid_len,
497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    struct fchs_s *rsp_fchs);
507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim,
517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				       enum bfa_itnim_aen_event event);
527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcs_itnim_sm FCS itnim state machine events
557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum bfa_fcs_itnim_event {
587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_ONLINE = 1,	/*  rport online event */
597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_OFFLINE = 2,	/*  rport offline */
607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_FRMSENT = 3,	/*  prli frame is sent */
617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_RSP_OK = 4,	/*  good response */
627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_RSP_ERROR = 5,	/*  error response */
637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_TIMEOUT = 6,	/*  delay timeout */
647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_HCB_OFFLINE = 7,	/*  BFA online callback */
657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_HCB_ONLINE = 8,	/*  BFA offline callback */
667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_INITIATOR = 9,	/*  rport is initiator */
677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_DELETE = 10,	/*  delete event from rport */
687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_PRLO = 11,	/*  delete event from rport */
697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					 enum bfa_fcs_itnim_event event);
737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					   enum bfa_fcs_itnim_event event);
757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				      enum bfa_fcs_itnim_event event);
777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    enum bfa_fcs_itnim_event event);
797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    enum bfa_fcs_itnim_event event);
817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					enum bfa_fcs_itnim_event event);
837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					     enum bfa_fcs_itnim_event event);
857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					   enum bfa_fcs_itnim_event event);
877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s itnim_sm_table[] = {
897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_offline), BFA_ITNIM_OFFLINE},
907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli_send), BFA_ITNIM_PRLI_SEND},
917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli), BFA_ITNIM_PRLI_SENT},
927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli_retry), BFA_ITNIM_PRLI_RETRY},
937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_hcb_online), BFA_ITNIM_HCB_ONLINE},
947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_online), BFA_ITNIM_ONLINE},
957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_hcb_offline), BFA_ITNIM_HCB_OFFLINE},
967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_initiator), BFA_ITNIM_INITIATIOR},
977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcs_itnim_sm FCS itnim state machine
1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 enum bfa_fcs_itnim_event event)
1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_ONLINE:
1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_send_prli(itnim, NULL);
1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			   enum bfa_fcs_itnim_event event)
1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_FRMSENT:
1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli);
1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
1707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      enum bfa_fcs_itnim_event event)
1717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_OK:
1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online);
1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec);
1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_ERROR:
1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_retry);
1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_start(itnim->fcs->bfa, &itnim->timer,
1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_fcs_itnim_timeout, itnim,
1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				BFA_FCS_RETRY_TIMEOUT);
1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_discard(itnim->fcxp);
1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * dont discard fcxp. accept will reach same state
1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_discard(itnim->fcxp);
2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
2147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    enum bfa_fcs_itnim_event event)
2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_TIMEOUT:
2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_send_prli(itnim, NULL);
2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_stop(&itnim->timer);
2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
2327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
2337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_stop(&itnim->timer);
2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_stop(&itnim->timer);
2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
2437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    enum bfa_fcs_itnim_event event)
2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_HCB_ONLINE:
2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_online);
2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_online(itnim->itnim_drv);
2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_ONLINE);
2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_offline(itnim->bfa_itnim);
2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			enum bfa_fcs_itnim_event event)
2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline);
2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_offline(itnim->itnim_drv);
2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_offline(itnim->bfa_itnim);
289f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang		if (bfa_fcs_port_is_online(itnim->rport->port) == BFA_TRUE)
2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_DISCONNECT);
291f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang		else
2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_OFFLINE);
2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			     enum bfa_fcs_itnim_event event)
3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_HCB_OFFLINE:
3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This state is set when a discovered rport is also in intiator mode.
3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This ITN is marked as no_op and is not active and will not be truned into
3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * online state.
3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			   enum bfa_fcs_itnim_event event)
3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_rport_itnim_ack(itnim->rport);
3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_ERROR:
3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_ONLINE:
3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  itnim_private FCS ITNIM private interfaces
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim,
3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		       enum bfa_itnim_aen_event event)
3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport = itnim->rport;
3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union bfa_aen_data_u aen_data;
3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_log_mod_s *logmod = rport->fcs->logm;
3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	wwn_t           lpwwn = bfa_fcs_port_get_pwwn(rport->port);
3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	wwn_t           rpwwn = rport->pwwn;
3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	char            lpwwn_ptr[BFA_STRING_32];
3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	char            rpwwn_ptr[BFA_STRING_32];
3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Don't post events for well known addresses
3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (BFA_FCS_PID_IS_WKA(rport->pid))
3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	wwn2str(lpwwn_ptr, lpwwn);
3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	wwn2str(rpwwn_ptr, rpwwn);
3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_AEN_ONLINE:
3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_log(logmod, BFA_AEN_ITNIM_ONLINE, rpwwn_ptr, lpwwn_ptr);
3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_AEN_OFFLINE:
3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_log(logmod, BFA_AEN_ITNIM_OFFLINE, rpwwn_ptr, lpwwn_ptr);
3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_AEN_DISCONNECT:
3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_log(logmod, BFA_AEN_ITNIM_DISCONNECT, rpwwn_ptr, lpwwn_ptr);
3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	aen_data.itnim.vf_id = rport->port->fabric->vf_id;
4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	aen_data.itnim.ppwwn =
4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_port_get_pwwn(bfa_fcs_get_base_port(itnim->fcs));
4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	aen_data.itnim.lpwwn = lpwwn;
4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	aen_data.itnim.rpwwn = rpwwn;
4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced)
4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = itnim_cbarg;
4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport = itnim->rport;
4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_port_s *port = rport->port;
4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fchs_s          fchs;
4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcxp_s *fcxp;
4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             len;
4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fcxp = fcxp_alloced ? fcxp_alloced : bfa_fcs_fcxp_alloc(port->fcs);
4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!fcxp) {
4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.fcxp_alloc_wait++;
4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_alloc_wait(port->fcs->bfa, &itnim->fcxp_wqe,
4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				    bfa_fcs_itnim_send_prli, itnim);
4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->fcxp = fcxp;
4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	len = fc_prli_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), itnim->rport->pid,
4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    bfa_fcs_port_get_fcid(port), 0);
4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id, port->lp_tag,
4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      BFA_FALSE, FC_CLASS_3, len, &fchs,
4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      bfa_fcs_itnim_prli_response, (void *)itnim, FC_MAX_PDUSZ,
4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      FC_RA_TOV);
4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.prli_sent++;
4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_FRMSENT);
4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    bfa_status_t req_status, u32 rsp_len,
4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    u32 resid_len, struct fchs_s *rsp_fchs)
4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cbarg;
4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_els_cmd_s   *els_cmd;
4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_prli_s      *prli_resp;
4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_ls_rjt_s    *ls_rjt;
4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_prli_params_s *sparams;
4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, req_status);
4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Sanity Checks
4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (req_status != BFA_STATUS_OK) {
4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_err++;
4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR);
4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	els_cmd = (struct fc_els_cmd_s *) BFA_FCXP_RSP_PLD(fcxp);
4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (els_cmd->els_code == FC_ELS_ACC) {
4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		prli_resp = (struct fc_prli_s *) els_cmd;
4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (fc_prli_rsp_parse(prli_resp, rsp_len) != FC_PARSE_OK) {
4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(itnim->fcs, rsp_len);
4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			/*
4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 * Check if this  r-port is also in Initiator mode.
4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 * If so, we need to set this ITN as a no-op.
4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 */
4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			if (prli_resp->parampage.servparams.initiator) {
4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_trc(itnim->fcs, prli_resp->parampage.type);
4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				itnim->rport->scsi_function =
4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					BFA_RPORT_INITIATOR;
4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				itnim->stats.prli_rsp_acc++;
4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_sm_send_event(itnim,
4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang						  BFA_FCS_ITNIM_SM_INITIATOR);
4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				return;
4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			}
4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			itnim->stats.prli_rsp_parse_err++;
4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			return;
4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->rport->scsi_function = BFA_RPORT_TARGET;
4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		sparams = &prli_resp->parampage.servparams;
4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->seq_rec = sparams->retry;
4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->rec_support = sparams->rec_support;
4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->task_retry_id = sparams->task_retry_id;
4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->conf_comp = sparams->confirm;
4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_acc++;
4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_OK);
4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp);
5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(itnim->fcs, ls_rjt->reason_code);
5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(itnim->fcs, ls_rjt->reason_code_expl);
5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_rjt++;
5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR);
5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_timeout(void *arg)
5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)arg;
5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.timeout++;
5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_TIMEOUT);
5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim)
5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_itnim_delete(itnim->bfa_itnim);
5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv);
5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  itnim_public FCS ITNIM public interfaces
5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 	Called by rport when a new rport is created.
5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
5347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport	-  remote port.
5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s *
5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport)
5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_port_s *port = rport->port;
5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim;
5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfad_itnim_s *itnim_drv;
5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_itnim_s *bfa_itnim;
5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * call bfad to allocate the itnim
5467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_alloc(port->fcs->bfad, &itnim, &itnim_drv);
5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL) {
5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port->fcs, rport->pwwn);
5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize itnim
5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->rport = rport;
5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->fcs = rport->fcs;
5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->itnim_drv = itnim_drv;
5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * call BFA to create the itnim
5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_itnim = bfa_itnim_create(port->fcs->bfa, rport->bfa_rport, itnim);
5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_itnim == NULL) {
5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port->fcs, rport->pwwn);
5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_free(port->fcs->bfad, itnim_drv);
5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->bfa_itnim = bfa_itnim;
5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->seq_rec = BFA_FALSE;
5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->rec_support = BFA_FALSE;
5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->conf_comp = BFA_FALSE;
5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->task_retry_id = BFA_FALSE;
5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Set State machine
5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return itnim;
5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 	Called by rport to delete  the instance of FCPIM.
5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
5897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport	-  remote port.
5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim)
5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_DELETE);
5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notification from rport that PLOGI is complete to initiate FC-4 session.
6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim)
6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.onlines++;
6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid)) {
6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_ONLINE);
6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * For well known addresses, we set the itnim to initiator
6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * state
6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.initiator++;
6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR);
6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to handle a remote device offline.
6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim)
6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.offlines++;
6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_OFFLINE);
6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when remote port is known to be an initiator from
6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * PRLI received.
6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim)
6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.initiator++;
6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR);
6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to check if the itnim is online.
6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim)
6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (bfa_sm_to_state(itnim_sm_table, itnim->sm)) {
6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_ONLINE:
6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_INITIATIOR:
6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_OK;
6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_online().
6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_online(void *cbarg)
6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cbarg;
6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_ONLINE);
6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_offline().
6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_offline(void *cb_arg)
6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg;
6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_OFFLINE);
6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the beginning of PATH TOV handling. IO completion callbacks
6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * are still pending.
6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov_begin(void *cb_arg)
6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg;
6907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_tov_begin(itnim->itnim_drv);
6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the end of PATH TOV handling. All pending IOs are already cleaned up.
6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov(void *cb_arg)
7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg;
7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_tov(itnim->itnim_drv);
7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * 		BFA notification to FCS/driver for second level error recovery.
7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Atleast one I/O request has timedout and target is unresponsive to
7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * repeated abort requests. Second level error recovery should be initiated
7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * by starting implicit logout and recovery procedures.
7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_sler(void *cb_arg)
7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *)cb_arg;
7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.sler++;
7207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcs_rport_logo_imp(itnim->rport);
7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s *
7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_lookup(struct bfa_fcs_port_s *port, wwn_t rpwwn)
7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport;
7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	rport = bfa_fcs_rport_lookup(port, rpwwn);
7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!rport)
7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
7327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(rport->itnim != NULL);
734f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return rport->itnim;
7357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_attr_get(struct bfa_fcs_port_s *port, wwn_t rpwwn,
7397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		       struct bfa_itnim_attr_s *attr)
7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->state = bfa_sm_to_state(itnim_sm_table, itnim->sm);
7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->retry = itnim->seq_rec;
7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->rec_support = itnim->rec_support;
7517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->conf_comp = itnim->conf_comp;
7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->task_retry_id = itnim->task_retry_id;
7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_stats_get(struct bfa_fcs_port_s *port, wwn_t rpwwn,
7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			struct bfa_itnim_stats_s *stats)
7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(port != NULL);
7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_memcpy(stats, &itnim->stats, sizeof(struct bfa_itnim_stats_s));
7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_stats_clear(struct bfa_fcs_port_s *port, wwn_t rpwwn)
7777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(port != NULL);
7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_memset(&itnim->stats, 0, sizeof(struct bfa_itnim_stats_s));
7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, struct fchs_s *fchs,
7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      u16 len)
7947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_els_cmd_s   *els_cmd;
7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, fchs->type);
7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fchs->type != FC_TYPE_ELS)
8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
8017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, els_cmd->els_code);
8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (els_cmd->els_code) {
8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case FC_ELS_PRLO:
8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/* bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_PRLO); */
8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
8127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
8177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_pause(struct bfa_fcs_itnim_s *itnim)
8187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_resume(struct bfa_fcs_itnim_s *itnim)
8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *   Module initialization
8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_fcpim_modinit(struct bfa_fcs_s *fcs)
8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *   Module cleanup
8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_fcpim_modexit(struct bfa_fcs_s *fcs)
8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcs_modexit_comp(fcs);
8417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
844