17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
2a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Copyright (c) 2005-2010 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
185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcpim.c - FCP initiator mode i-t nexus state machine
207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h"
23a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_fcs.h"
24a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_fcbuild.h"
25a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfad_im.h"
267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing HuangBFA_TRC_FILE(FCS, FCPIM);
287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations
317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_timeout(void *arg);
33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim);
34a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_send_prli(void *itnim_cbarg,
357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					struct bfa_fcxp_s *fcxp_alloced);
36a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_prli_response(void *fcsarg,
37a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 struct bfa_fcxp_s *fcxp, void *cbarg,
38a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			    bfa_status_t req_status, u32 rsp_len,
39a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			    u32 resid_len, struct fchs_s *rsp_fchs);
407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void	bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim,
417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			enum bfa_itnim_aen_event event);
427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
43a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					 enum bfa_fcs_itnim_event event);
45a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					   enum bfa_fcs_itnim_event event);
47a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				      enum bfa_fcs_itnim_event event);
49a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    enum bfa_fcs_itnim_event event);
51a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    enum bfa_fcs_itnim_event event);
5361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatistatic void	bfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim,
5461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati					enum bfa_fcs_itnim_event event);
55a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					enum bfa_fcs_itnim_event event);
57a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					     enum bfa_fcs_itnim_event event);
59a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					   enum bfa_fcs_itnim_event event);
617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s itnim_sm_table[] = {
637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_offline), BFA_ITNIM_OFFLINE},
647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli_send), BFA_ITNIM_PRLI_SEND},
657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli), BFA_ITNIM_PRLI_SENT},
667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli_retry), BFA_ITNIM_PRLI_RETRY},
677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_hcb_online), BFA_ITNIM_HCB_ONLINE},
687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_online), BFA_ITNIM_ONLINE},
697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_hcb_offline), BFA_ITNIM_HCB_OFFLINE},
707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_initiator), BFA_ITNIM_INITIATIOR},
717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcs_itnim_sm FCS itnim state machine
757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
79a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
8561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	case BFA_FCS_ITNIM_SM_FCS_ONLINE:
867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
8741188cf5a60a24bf54df5be70142f0928f413788Jing Huang		itnim->prli_retries = 0;
887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_send_prli(itnim, NULL);
897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
92f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
104e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_FRMSENT:
1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli);
1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
12461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
130f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
140e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_OK:
15361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR)
1544b5e759dca9fb26d921c1267283350004dbf197bJing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
15561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		else
15661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati			bfa_sm_set_state(itnim,
15761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati				bfa_fcs_itnim_sm_hal_rport_online);
15861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
15961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_ERROR:
1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_retry);
1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_start(itnim->fcs->bfa, &itnim->timer,
1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_fcs_itnim_timeout, itnim,
1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				BFA_FCS_RETRY_TIMEOUT);
1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
169d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati	case BFA_FCS_ITNIM_SM_RSP_NOT_SUPP:
170d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
171d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati		break;
172d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati
1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_discard(itnim->fcxp);
176f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1814b5e759dca9fb26d921c1267283350004dbf197bJing Huang		bfa_fcxp_discard(itnim->fcxp);
18261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_discard(itnim->fcxp);
1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
192e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
19761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatibfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim,
19861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati				enum bfa_fcs_itnim_event event)
19961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati{
20061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	bfa_trc(itnim->fcs, itnim->rport->pwwn);
20161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	bfa_trc(itnim->fcs, event);
20261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
20361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	switch (event) {
20461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	case BFA_FCS_ITNIM_SM_HAL_ONLINE:
20561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		if (!itnim->bfa_itnim)
20661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati			itnim->bfa_itnim = bfa_itnim_create(itnim->fcs->bfa,
20761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati					itnim->rport->bfa_rport, itnim);
20861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
20961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		if (itnim->bfa_itnim) {
21061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online);
21161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati			bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec);
21261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		} else {
21361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
21461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati			bfa_sm_send_event(itnim->rport, RPSM_EVENT_DELETE);
21561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		}
21661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
21761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		break;
21861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
21961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	case BFA_FCS_ITNIM_SM_OFFLINE:
22061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
22161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
22261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		break;
22361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
22461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	case BFA_FCS_ITNIM_SM_DELETE:
22561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
22661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_fcs_itnim_free(itnim);
22761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		break;
22861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
22961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	default:
23061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_fault(itnim->fcs, event);
23161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	}
23261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati}
23361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
23461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatistatic void
2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    enum bfa_fcs_itnim_event event)
2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_TIMEOUT:
24341188cf5a60a24bf54df5be70142f0928f413788Jing Huang		if (itnim->prli_retries < BFA_FCS_RPORT_MAX_RETRIES) {
24441188cf5a60a24bf54df5be70142f0928f413788Jing Huang			itnim->prli_retries++;
24541188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_trc(itnim->fcs, itnim->prli_retries);
24641188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
24741188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_fcs_itnim_send_prli(itnim, NULL);
24841188cf5a60a24bf54df5be70142f0928f413788Jing Huang		} else {
24941188cf5a60a24bf54df5be70142f0928f413788Jing Huang			/* invoke target offline */
25041188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
251f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang			bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP);
25241188cf5a60a24bf54df5be70142f0928f413788Jing Huang		}
2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_stop(&itnim->timer);
259f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_stop(&itnim->timer);
26561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_stop(&itnim->timer);
2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
275e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    enum bfa_fcs_itnim_event event)
2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad;
284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	lpwwn_buf[BFA_STRING_32];
285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	rpwwn_buf[BFA_STRING_32];
286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_HCB_ONLINE:
2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_online);
2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_online(itnim->itnim_drv);
294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port));
295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(rpwwn_buf, itnim->rport->pwwn);
2968816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang		BFA_LOG(KERN_INFO, bfad, bfa_log_level,
297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		"Target (WWN = %s) is online for initiator (WWN = %s)\n",
298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		rpwwn_buf, lpwwn_buf);
2997826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_ONLINE);
3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
30361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline);
3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_offline(itnim->bfa_itnim);
3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
313e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad;
322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	lpwwn_buf[BFA_STRING_32];
323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	rpwwn_buf[BFA_STRING_32];
324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline);
3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_offline(itnim->itnim_drv);
3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_offline(itnim->bfa_itnim);
333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port));
334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(rpwwn_buf, itnim->rport->pwwn);
3357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		if (bfa_fcs_lport_is_online(itnim->rport->port) == BFA_TRUE) {
3368816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang			BFA_LOG(KERN_ERR, bfad, bfa_log_level,
337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			"Target (WWN = %s) connectivity lost for "
338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			"initiator (WWN = %s)\n", rpwwn_buf, lpwwn_buf);
3397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_DISCONNECT);
3407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		} else {
3418816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang			BFA_LOG(KERN_INFO, bfad, bfa_log_level,
342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			"Target (WWN = %s) offlined by initiator (WWN = %s)\n",
343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			rpwwn_buf, lpwwn_buf);
3447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_OFFLINE);
3457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		}
3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
354e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			     enum bfa_fcs_itnim_event event)
3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_HCB_OFFLINE:
3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
368f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
377e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This state is set when a discovered rport is also in intiator mode.
3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This ITN is marked as no_op and is not active and will not be truned into
3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * online state.
3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
396f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
39961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	/*
40061ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	 * fcs_online is expected here for well known initiator ports
40161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	 */
40261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	case BFA_FCS_ITNIM_SM_FCS_ONLINE:
40361ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
40461ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		break;
40561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_ERROR:
4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
416e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4217826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim,
4227826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			enum bfa_itnim_aen_event event)
4237826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{
4247826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfa_fcs_rport_s *rport = itnim->rport;
4257826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad;
4267826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfa_aen_entry_s	*aen_entry;
4277826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
4287826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	/* Don't post events for well known addresses */
4297826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	if (BFA_FCS_PID_IS_WKA(rport->pid))
4307826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		return;
4317826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
4327826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_get_aen_entry(bfad, aen_entry);
4337826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	if (!aen_entry)
4347826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		return;
4357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
4367826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.itnim.vf_id = rport->port->fabric->vf_id;
4377826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.itnim.ppwwn = bfa_fcs_lport_get_pwwn(
4387826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati					bfa_fcs_get_base_port(itnim->fcs));
4397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.itnim.lpwwn = bfa_fcs_lport_get_pwwn(rport->port);
4407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.itnim.rpwwn = rport->pwwn;
4417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
4427826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	/* Send the AEN notification */
4437826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_im_post_vendor_event(aen_entry, bfad, ++rport->fcs->fcs_aen_seq,
4447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati				  BFA_AEN_CAT_ITNIM, event);
4457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati}
4467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
4477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void
4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced)
4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = itnim_cbarg;
4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport = itnim->rport;
452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_lport_s *port = rport->port;
453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fchs_s	fchs;
4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcxp_s *fcxp;
455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		len;
4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
459c3f1b123d0573b47aea540c711e6ca83737c5d86Krishna Gudipati	fcxp = fcxp_alloced ? fcxp_alloced :
460c3f1b123d0573b47aea540c711e6ca83737c5d86Krishna Gudipati	       bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE);
4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!fcxp) {
4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.fcxp_alloc_wait++;
463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &itnim->fcxp_wqe,
464c3f1b123d0573b47aea540c711e6ca83737c5d86Krishna Gudipati				bfa_fcs_itnim_send_prli, itnim, BFA_TRUE);
4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->fcxp = fcxp;
4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	len = fc_prli_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			    itnim->rport->pid, bfa_fcs_lport_get_fcid(port), 0);
4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id, port->lp_tag,
4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      BFA_FALSE, FC_CLASS_3, len, &fchs,
474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		      bfa_fcs_itnim_prli_response, (void *)itnim,
475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		      FC_MAX_PDUSZ, FC_ELS_TOV);
4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.prli_sent++;
4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_FRMSENT);
4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    bfa_status_t req_status, u32 rsp_len,
4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    u32 resid_len, struct fchs_s *rsp_fchs)
4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg;
487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_els_cmd_s *els_cmd;
488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_prli_s *prli_resp;
489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_ls_rjt_s *ls_rjt;
4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_prli_params_s *sparams;
4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, req_status);
4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Sanity Checks
4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (req_status != BFA_STATUS_OK) {
4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_err++;
4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR);
5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	els_cmd = (struct fc_els_cmd_s *) BFA_FCXP_RSP_PLD(fcxp);
5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (els_cmd->els_code == FC_ELS_ACC) {
5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		prli_resp = (struct fc_prli_s *) els_cmd;
5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (fc_prli_rsp_parse(prli_resp, rsp_len) != FC_PARSE_OK) {
5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(itnim->fcs, rsp_len);
5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			/*
5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 * Check if this  r-port is also in Initiator mode.
5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 * If so, we need to set this ITN as a no-op.
5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 */
5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			if (prli_resp->parampage.servparams.initiator) {
5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_trc(itnim->fcs, prli_resp->parampage.type);
5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				itnim->rport->scsi_function =
51761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati						BFA_RPORT_INITIATOR;
5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				itnim->stats.prli_rsp_acc++;
519d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati				itnim->stats.initiator++;
5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_sm_send_event(itnim,
5214b5e759dca9fb26d921c1267283350004dbf197bJing Huang						  BFA_FCS_ITNIM_SM_RSP_OK);
5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				return;
5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			}
5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			itnim->stats.prli_rsp_parse_err++;
5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			return;
5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->rport->scsi_function = BFA_RPORT_TARGET;
5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		sparams = &prli_resp->parampage.servparams;
531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->seq_rec	     = sparams->retry;
532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->rec_support   = sparams->rec_support;
5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->task_retry_id = sparams->task_retry_id;
534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->conf_comp     = sparams->confirm;
5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_acc++;
5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_OK);
5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp);
5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(itnim->fcs, ls_rjt->reason_code);
5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(itnim->fcs, ls_rjt->reason_code_expl);
5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_rjt++;
545d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati		if (ls_rjt->reason_code == FC_LS_RJT_RSN_CMD_NOT_SUPP) {
546d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati			bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_NOT_SUPP);
547d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati			return;
548d7be54cc5c5f6f9cb9ac67462aadda57813698b8Krishna Gudipati		}
5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR);
5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_timeout(void *arg)
5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) arg;
5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.timeout++;
5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_TIMEOUT);
5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim)
5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
56561ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	if (itnim->bfa_itnim) {
56661ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_itnim_delete(itnim->bfa_itnim);
56761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		itnim->bfa_itnim = NULL;
56861ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	}
56961ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati
5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv);
5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  itnim_public FCS ITNIM public interfaces
5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	Called by rport when a new rport is created.
5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport	-  remote port.
5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s *
5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport)
5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_lport_s *port = rport->port;
5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim;
589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_itnim_s   *itnim_drv;
5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * call bfad to allocate the itnim
5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_alloc(port->fcs->bfad, &itnim, &itnim_drv);
5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL) {
5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port->fcs, rport->pwwn);
5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize itnim
6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->rport = rport;
6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->fcs = rport->fcs;
6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->itnim_drv = itnim_drv;
6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
60761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	itnim->bfa_itnim     = NULL;
608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->seq_rec	     = BFA_FALSE;
609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->rec_support   = BFA_FALSE;
610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->conf_comp     = BFA_FALSE;
6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->task_retry_id = BFA_FALSE;
6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Set State machine
6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return itnim;
6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6215fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
622a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	Called by rport to delete  the instance of FCPIM.
6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport	-  remote port.
6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim)
6287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_DELETE);
6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notification from rport that PLOGI is complete to initiate FC-4 session.
6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
63761ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipatibfa_fcs_itnim_brp_online(struct bfa_fcs_itnim_s *itnim)
6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.onlines++;
6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
64161ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati	if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid))
64261ba43947e61dcda4af0993135a7268e4c0465b9Krishna Gudipati		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HAL_ONLINE);
6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6455fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to handle a remote device offline.
6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim)
6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.offlines++;
6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_OFFLINE);
6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when remote port is known to be an initiator from
6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * PRLI received.
6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim)
6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.initiator++;
6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR);
6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6675fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to check if the itnim is online.
6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim)
6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (bfa_sm_to_state(itnim_sm_table, itnim->sm)) {
6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_ONLINE:
6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_INITIATIOR:
6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_OK;
6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_online().
6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_online(void *cbarg)
6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg;
6917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_ONLINE);
6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6965fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_offline().
6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_offline(void *cb_arg)
7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_OFFLINE);
7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the beginning of PATH TOV handling. IO completion callbacks
7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * are still pending.
7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov_begin(void *cb_arg)
7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7205fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the end of PATH TOV handling. All pending IOs are already cleaned up.
7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov(void *cb_arg)
7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_itnim_s *itnim_drv = itnim->itnim_drv;
7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim_drv->state = ITNIM_STATE_TIMEOUT;
7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *		BFA notification to FCS/driver for second level error recovery.
7357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Atleast one I/O request has timedout and target is unresponsive to
7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * repeated abort requests. Second level error recovery should be initiated
7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * by starting implicit logout and recovery procedures.
7397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_sler(void *cb_arg)
7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.sler++;
7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
747f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP);
7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s *
751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_lookup(struct bfa_fcs_lport_s *port, wwn_t rpwwn)
7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport;
7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	rport = bfa_fcs_rport_lookup(port, rpwwn);
7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!rport)
7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
759d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(rport->itnim == NULL);
760f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return rport->itnim;
7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_attr_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn,
7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		       struct bfa_itnim_attr_s *attr)
7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->state	    = bfa_sm_to_state(itnim_sm_table, itnim->sm);
775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->retry	    = itnim->seq_rec;
776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->rec_support   = itnim->rec_support;
777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->conf_comp	    = itnim->conf_comp;
7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->task_retry_id = itnim->task_retry_id;
7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn,
7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			struct bfa_itnim_stats_s *stats)
7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
788d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(port == NULL);
7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7956a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(stats, &itnim->stats, sizeof(struct bfa_itnim_stats_s));
7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_clear(struct bfa_fcs_lport_s *port, wwn_t rpwwn)
8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
805d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(port == NULL);
8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8126a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset(&itnim->stats, 0, sizeof(struct bfa_itnim_stats_s));
8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim,
818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			struct fchs_s *fchs, u16 len)
8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_els_cmd_s *els_cmd;
8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, fchs->type);
8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fchs->type != FC_TYPE_ELS)
8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, els_cmd->els_code);
8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (els_cmd->els_code) {
8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case FC_ELS_PRLO:
8334b5e759dca9fb26d921c1267283350004dbf197bJing Huang		bfa_fcs_rport_prlo(itnim->rport, fchs->ox_id);
8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
837d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
840