bfa_fcs_fcpim.c revision d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359a
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);
407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcs_itnim_sm FCS itnim state machine events
437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum bfa_fcs_itnim_event {
467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_ONLINE = 1,	/*  rport online event */
477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_OFFLINE = 2,	/*  rport offline */
487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_FRMSENT = 3,	/*  prli frame is sent */
497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_RSP_OK = 4,	/*  good response */
507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_RSP_ERROR = 5,	/*  error response */
517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_TIMEOUT = 6,	/*  delay timeout */
52a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_FCS_ITNIM_SM_HCB_OFFLINE = 7, /*  BFA online callback */
53a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_FCS_ITNIM_SM_HCB_ONLINE = 8, /*  BFA offline callback */
547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_INITIATOR = 9,	/*  rport is initiator */
557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_DELETE = 10,	/*  delete event from rport */
567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	BFA_FCS_ITNIM_SM_PRLO = 11,	/*  delete event from rport */
577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
59a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					 enum bfa_fcs_itnim_event event);
61a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					   enum bfa_fcs_itnim_event event);
63a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				      enum bfa_fcs_itnim_event event);
65a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    enum bfa_fcs_itnim_event event);
67a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					    enum bfa_fcs_itnim_event event);
69a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					enum bfa_fcs_itnim_event event);
71a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					     enum bfa_fcs_itnim_event event);
73a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void	bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang					   enum bfa_fcs_itnim_event event);
757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s itnim_sm_table[] = {
777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_offline), BFA_ITNIM_OFFLINE},
787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli_send), BFA_ITNIM_PRLI_SEND},
797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli), BFA_ITNIM_PRLI_SENT},
807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_prli_retry), BFA_ITNIM_PRLI_RETRY},
817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_hcb_online), BFA_ITNIM_HCB_ONLINE},
827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_online), BFA_ITNIM_ONLINE},
837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_hcb_offline), BFA_ITNIM_HCB_OFFLINE},
847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_fcs_itnim_sm_initiator), BFA_ITNIM_INITIATIOR},
857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
875fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  fcs_itnim_sm FCS itnim state machine
897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_ONLINE:
1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
10141188cf5a60a24bf54df5be70142f0928f413788Jing Huang		itnim->prli_retries = 0;
1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_send_prli(itnim, NULL);
1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
106f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
118e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_FRMSENT:
1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli);
1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
143f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
153e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_OK:
1664b5e759dca9fb26d921c1267283350004dbf197bJing Huang		if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR) {
1674b5e759dca9fb26d921c1267283350004dbf197bJing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1684b5e759dca9fb26d921c1267283350004dbf197bJing Huang		} else {
1694b5e759dca9fb26d921c1267283350004dbf197bJing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online);
1704b5e759dca9fb26d921c1267283350004dbf197bJing Huang			bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec);
1714b5e759dca9fb26d921c1267283350004dbf197bJing Huang		}
1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_ERROR:
1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_retry);
1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_start(itnim->fcs->bfa, &itnim->timer,
1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_fcs_itnim_timeout, itnim,
1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				BFA_FCS_RETRY_TIMEOUT);
1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_discard(itnim->fcxp);
184f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
1894b5e759dca9fb26d921c1267283350004dbf197bJing Huang		bfa_fcxp_discard(itnim->fcxp);
1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcxp_discard(itnim->fcxp);
1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
199e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    enum bfa_fcs_itnim_event event)
2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_TIMEOUT:
21241188cf5a60a24bf54df5be70142f0928f413788Jing Huang		if (itnim->prli_retries < BFA_FCS_RPORT_MAX_RETRIES) {
21341188cf5a60a24bf54df5be70142f0928f413788Jing Huang			itnim->prli_retries++;
21441188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_trc(itnim->fcs, itnim->prli_retries);
21541188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
21641188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_fcs_itnim_send_prli(itnim, NULL);
21741188cf5a60a24bf54df5be70142f0928f413788Jing Huang		} else {
21841188cf5a60a24bf54df5be70142f0928f413788Jing Huang			/* invoke target offline */
21941188cf5a60a24bf54df5be70142f0928f413788Jing Huang			bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
220f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang			bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP);
22141188cf5a60a24bf54df5be70142f0928f413788Jing Huang		}
2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
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);
228f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
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:
243e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
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{
251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad;
252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	lpwwn_buf[BFA_STRING_32];
253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	rpwwn_buf[BFA_STRING_32];
254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_HCB_ONLINE:
2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_online);
2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_online(itnim->itnim_drv);
262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port));
263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(rpwwn_buf, itnim->rport->pwwn);
2648816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang		BFA_LOG(KERN_INFO, bfad, bfa_log_level,
265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		"Target (WWN = %s) is online for initiator (WWN = %s)\n",
266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		rpwwn_buf, lpwwn_buf);
2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_offline(itnim->bfa_itnim);
272f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
281e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad;
290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	lpwwn_buf[BFA_STRING_32];
291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	char	rpwwn_buf[BFA_STRING_32];
292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline);
2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_offline(itnim->itnim_drv);
3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_itnim_offline(itnim->bfa_itnim);
301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port));
302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wwn2str(rpwwn_buf, itnim->rport->pwwn);
303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_fcs_lport_is_online(itnim->rport->port) == BFA_TRUE)
3048816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang			BFA_LOG(KERN_ERR, bfad, bfa_log_level,
305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			"Target (WWN = %s) connectivity lost for "
306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			"initiator (WWN = %s)\n", rpwwn_buf, lpwwn_buf);
307f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang		else
3088816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang			BFA_LOG(KERN_INFO, bfad, bfa_log_level,
309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			"Target (WWN = %s) offlined by initiator (WWN = %s)\n",
310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			rpwwn_buf, lpwwn_buf);
3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
319e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			     enum bfa_fcs_itnim_event event)
3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_HCB_OFFLINE:
3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
333f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
342e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This state is set when a discovered rport is also in intiator mode.
3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This ITN is marked as no_op and is not active and will not be truned into
3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * online state.
3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 enum bfa_fcs_itnim_event event)
3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, event);
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_OFFLINE:
3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
361f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_RSP_ERROR:
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_ONLINE:
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_INITIATOR:
3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_FCS_ITNIM_SM_DELETE:
3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcs_itnim_free(itnim);
3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
375e641de37e67953fa9ecad72608942481a5d66a1dKrishna Gudipati		bfa_sm_fault(itnim->fcs, event);
3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced)
3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = itnim_cbarg;
3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport = itnim->rport;
384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_lport_s *port = rport->port;
385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fchs_s	fchs;
3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcxp_s *fcxp;
387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		len;
3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fcxp = fcxp_alloced ? fcxp_alloced : bfa_fcs_fcxp_alloc(port->fcs);
3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!fcxp) {
3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.fcxp_alloc_wait++;
394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &itnim->fcxp_wqe,
3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				    bfa_fcs_itnim_send_prli, itnim);
3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->fcxp = fcxp;
3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	len = fc_prli_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			    itnim->rport->pid, bfa_fcs_lport_get_fcid(port), 0);
4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id, port->lp_tag,
4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      BFA_FALSE, FC_CLASS_3, len, &fchs,
405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		      bfa_fcs_itnim_prli_response, (void *)itnim,
406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		      FC_MAX_PDUSZ, FC_ELS_TOV);
4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.prli_sent++;
4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_FRMSENT);
4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    bfa_status_t req_status, u32 rsp_len,
4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			    u32 resid_len, struct fchs_s *rsp_fchs)
4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg;
418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_els_cmd_s *els_cmd;
419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_prli_s *prli_resp;
420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_ls_rjt_s *ls_rjt;
4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct fc_prli_params_s *sparams;
4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, req_status);
4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Sanity Checks
4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (req_status != BFA_STATUS_OK) {
4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_err++;
4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR);
4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	els_cmd = (struct fc_els_cmd_s *) BFA_FCXP_RSP_PLD(fcxp);
4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (els_cmd->els_code == FC_ELS_ACC) {
4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		prli_resp = (struct fc_prli_s *) els_cmd;
4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (fc_prli_rsp_parse(prli_resp, rsp_len) != FC_PARSE_OK) {
4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(itnim->fcs, rsp_len);
4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			/*
4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 * Check if this  r-port is also in Initiator mode.
4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 * If so, we need to set this ITN as a no-op.
4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 */
4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			if (prli_resp->parampage.servparams.initiator) {
4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_trc(itnim->fcs, prli_resp->parampage.type);
4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				itnim->rport->scsi_function =
448a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					 BFA_RPORT_INITIATOR;
4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				itnim->stats.prli_rsp_acc++;
4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_sm_send_event(itnim,
4514b5e759dca9fb26d921c1267283350004dbf197bJing Huang						  BFA_FCS_ITNIM_SM_RSP_OK);
4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				return;
4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			}
4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			itnim->stats.prli_rsp_parse_err++;
4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			return;
4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->rport->scsi_function = BFA_RPORT_TARGET;
4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		sparams = &prli_resp->parampage.servparams;
461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->seq_rec	     = sparams->retry;
462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->rec_support   = sparams->rec_support;
4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->task_retry_id = sparams->task_retry_id;
464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		itnim->conf_comp     = sparams->confirm;
4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_acc++;
4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_OK);
4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp);
4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(itnim->fcs, ls_rjt->reason_code);
4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(itnim->fcs, ls_rjt->reason_code_expl);
4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.prli_rsp_rjt++;
4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_RSP_ERROR);
4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_timeout(void *arg)
4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) arg;
4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.timeout++;
4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_TIMEOUT);
4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim)
4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_itnim_delete(itnim->bfa_itnim);
4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv);
4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4975fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  itnim_public FCS ITNIM public interfaces
4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5015fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	Called by rport when a new rport is created.
5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport	-  remote port.
5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s *
5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport)
5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_lport_s *port = rport->port;
5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim;
511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_itnim_s   *itnim_drv;
5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_itnim_s *bfa_itnim;
5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * call bfad to allocate the itnim
5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fcb_itnim_alloc(port->fcs->bfad, &itnim, &itnim_drv);
5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL) {
5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port->fcs, rport->pwwn);
5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize itnim
5257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->rport = rport;
5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->fcs = rport->fcs;
5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->itnim_drv = itnim_drv;
5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * call BFA to create the itnim
5327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_itnim =
534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_itnim_create(port->fcs->bfa, rport->bfa_rport, itnim);
5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_itnim == NULL) {
5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(port->fcs, rport->pwwn);
5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fcb_itnim_free(port->fcs->bfad, itnim_drv);
539d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->bfa_itnim     = bfa_itnim;
544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->seq_rec	     = BFA_FALSE;
545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->rec_support   = BFA_FALSE;
546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim->conf_comp     = BFA_FALSE;
5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->task_retry_id = BFA_FALSE;
5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Set State machine
5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return itnim;
5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5575fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	Called by rport to delete  the instance of FCPIM.
5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] rport	-  remote port.
5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim)
5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_DELETE);
5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notification from rport that PLOGI is complete to initiate FC-4 session.
5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim)
5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.onlines++;
5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid)) {
5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_ONLINE);
5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 *  For well known addresses, we set the itnim to initiator
582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 *  state
5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		itnim->stats.initiator++;
5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR);
5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to handle a remote device offline.
5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim)
5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.offlines++;
5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_OFFLINE);
5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport when remote port is known to be an initiator from
6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * PRLI received.
6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim)
6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.initiator++;
6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR);
6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Called by rport to check if the itnim is online.
6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim)
6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pid);
6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (bfa_sm_to_state(itnim_sm_table, itnim->sm)) {
6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_ONLINE:
6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_ITNIM_INITIATIOR:
6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_OK;
6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
6257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6285fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_online().
6307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_online(void *cbarg)
6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cbarg;
6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_ONLINE);
6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA completion callback for bfa_itnim_offline().
6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_offline(void *cb_arg)
6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HCB_OFFLINE);
6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the beginning of PATH TOV handling. IO completion callbacks
6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * are still pending.
6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov_begin(void *cb_arg)
6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mark the end of PATH TOV handling. All pending IOs are already cleaned up.
6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_tov(void *cb_arg)
6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_itnim_s *itnim_drv = itnim->itnim_drv;
6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	itnim_drv->state = ITNIM_STATE_TIMEOUT;
6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *		BFA notification to FCS/driver for second level error recovery.
6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Atleast one I/O request has timedout and target is unresponsive to
6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * repeated abort requests. Second level error recovery should be initiated
6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * by starting implicit logout and recovery procedures.
6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cb_itnim_sler(void *cb_arg)
6867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_fcs_itnim_s *itnim = (struct bfa_fcs_itnim_s *) cb_arg;
6887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim->stats.sler++;
6907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, itnim->rport->pwwn);
691f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_sm_send_event(itnim->rport, RPSM_EVENT_LOGO_IMP);
6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstruct bfa_fcs_itnim_s *
695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_lookup(struct bfa_fcs_lport_s *port, wwn_t rpwwn)
6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_rport_s *rport;
6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	rport = bfa_fcs_rport_lookup(port, rpwwn);
6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!rport)
7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return NULL;
7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
703d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(rport->itnim == NULL);
704f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return rport->itnim;
7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_attr_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn,
7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		       struct bfa_itnim_attr_s *attr)
7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->state	    = bfa_sm_to_state(itnim_sm_table, itnim->sm);
719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->retry	    = itnim->seq_rec;
720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->rec_support   = itnim->rec_support;
721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->conf_comp	    = itnim->conf_comp;
7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->task_retry_id = itnim->task_retry_id;
7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_get(struct bfa_fcs_lport_s *port, wwn_t rpwwn,
7287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			struct bfa_itnim_stats_s *stats)
7297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
732d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(port == NULL);
7337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(stats, &itnim->stats, sizeof(struct bfa_itnim_stats_s));
7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_itnim_stats_clear(struct bfa_fcs_lport_s *port, wwn_t rpwwn)
7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_fcs_itnim_s *itnim = NULL;
7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
749d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(port == NULL);
7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	itnim = bfa_fcs_itnim_lookup(port, rpwwn);
7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (itnim == NULL)
7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_NO_FCPIM_NEXUS;
7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7566a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset(&itnim->stats, 0, sizeof(struct bfa_itnim_stats_s));
7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim,
762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			struct fchs_s *fchs, u16 len)
7637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct fc_els_cmd_s *els_cmd;
7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, fchs->type);
7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fchs->type != FC_TYPE_ELS)
7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
7727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(itnim->fcs, els_cmd->els_code);
7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (els_cmd->els_code) {
7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case FC_ELS_PRLO:
7774b5e759dca9fb26d921c1267283350004dbf197bJing Huang		bfa_fcs_rport_prlo(itnim->rport, fchs->ox_id);
7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
781d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
784