xref: /openbmc/linux/drivers/scsi/bfa/bfa_fcs_rport.c (revision df561f66)
152fa7bf9SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2a36c61f9SKrishna Gudipati /*
3889d0d42SAnil Gurumurthy  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4889d0d42SAnil Gurumurthy  * Copyright (c) 2014- QLogic Corporation.
5a36c61f9SKrishna Gudipati  * All rights reserved
6889d0d42SAnil Gurumurthy  * www.qlogic.com
7a36c61f9SKrishna Gudipati  *
831e1d569SAnil Gurumurthy  * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
9a36c61f9SKrishna Gudipati  */
10a36c61f9SKrishna Gudipati 
115fbe25c7SJing Huang /*
12a36c61f9SKrishna Gudipati  *  rport.c Remote port implementation.
13a36c61f9SKrishna Gudipati  */
14a36c61f9SKrishna Gudipati 
15f16a1750SMaggie Zhang #include "bfad_drv.h"
167826f304SKrishna Gudipati #include "bfad_im.h"
17a36c61f9SKrishna Gudipati #include "bfa_fcs.h"
18a36c61f9SKrishna Gudipati #include "bfa_fcbuild.h"
19a36c61f9SKrishna Gudipati 
20a36c61f9SKrishna Gudipati BFA_TRC_FILE(FCS, RPORT);
21a36c61f9SKrishna Gudipati 
22a36c61f9SKrishna Gudipati static u32
23a36c61f9SKrishna Gudipati bfa_fcs_rport_del_timeout = BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000;
24a36c61f9SKrishna Gudipati 	 /* In millisecs */
25a36c61f9SKrishna Gudipati /*
2661ba4394SKrishna Gudipati  * bfa_fcs_rport_max_logins is max count of bfa_fcs_rports
2761ba4394SKrishna Gudipati  * whereas DEF_CFG_NUM_RPORTS is max count of bfa_rports
2861ba4394SKrishna Gudipati  */
2961ba4394SKrishna Gudipati static u32 bfa_fcs_rport_max_logins = BFA_FCS_MAX_RPORT_LOGINS;
3061ba4394SKrishna Gudipati 
3161ba4394SKrishna Gudipati /*
32a36c61f9SKrishna Gudipati  * forward declarations
33a36c61f9SKrishna Gudipati  */
34a36c61f9SKrishna Gudipati static struct bfa_fcs_rport_s *bfa_fcs_rport_alloc(
35a36c61f9SKrishna Gudipati 		struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid);
36a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport);
37a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport);
3861ba4394SKrishna Gudipati static void	bfa_fcs_rport_fcs_online_action(struct bfa_fcs_rport_s *rport);
3961ba4394SKrishna Gudipati static void	bfa_fcs_rport_hal_online_action(struct bfa_fcs_rport_s *rport);
4061ba4394SKrishna Gudipati static void	bfa_fcs_rport_fcs_offline_action(struct bfa_fcs_rport_s *rport);
4161ba4394SKrishna Gudipati static void	bfa_fcs_rport_hal_offline_action(struct bfa_fcs_rport_s *rport);
42a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport,
43a36c61f9SKrishna Gudipati 					struct fc_logi_s *plogi);
44a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_timeout(void *arg);
45a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_plogi(void *rport_cbarg,
46a36c61f9SKrishna Gudipati 					 struct bfa_fcxp_s *fcxp_alloced);
47a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_plogiacc(void *rport_cbarg,
48a36c61f9SKrishna Gudipati 					struct bfa_fcxp_s *fcxp_alloced);
49a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_plogi_response(void *fcsarg,
50a36c61f9SKrishna Gudipati 				struct bfa_fcxp_s *fcxp, void *cbarg,
51a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
52a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs);
53a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_adisc(void *rport_cbarg,
54a36c61f9SKrishna Gudipati 					 struct bfa_fcxp_s *fcxp_alloced);
55a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_adisc_response(void *fcsarg,
56a36c61f9SKrishna Gudipati 				struct bfa_fcxp_s *fcxp, void *cbarg,
57a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
58a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs);
59a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_nsdisc(void *rport_cbarg,
60a36c61f9SKrishna Gudipati 					 struct bfa_fcxp_s *fcxp_alloced);
61a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_gidpn_response(void *fcsarg,
62a36c61f9SKrishna Gudipati 				struct bfa_fcxp_s *fcxp, void *cbarg,
63a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
64a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs);
65a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_gpnid_response(void *fcsarg,
66a36c61f9SKrishna Gudipati 				struct bfa_fcxp_s *fcxp, void *cbarg,
67a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
68a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs);
69a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_logo(void *rport_cbarg,
70a36c61f9SKrishna Gudipati 					struct bfa_fcxp_s *fcxp_alloced);
71a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_logo_acc(void *rport_cbarg);
72a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_process_prli(struct bfa_fcs_rport_s *rport,
73a36c61f9SKrishna Gudipati 					struct fchs_s *rx_fchs, u16 len);
74a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_send_ls_rjt(struct bfa_fcs_rport_s *rport,
75a36c61f9SKrishna Gudipati 				struct fchs_s *rx_fchs, u8 reason_code,
76a36c61f9SKrishna Gudipati 					  u8 reason_code_expl);
77a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s *rport,
78a36c61f9SKrishna Gudipati 				struct fchs_s *rx_fchs, u16 len);
79a36c61f9SKrishna Gudipati static void bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s *rport);
8061ba4394SKrishna Gudipati static void	bfa_fcs_rport_hal_offline(struct bfa_fcs_rport_s *rport);
81a36c61f9SKrishna Gudipati 
82a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport,
83a36c61f9SKrishna Gudipati 					enum rport_event event);
84a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_plogi_sending(struct bfa_fcs_rport_s *rport,
85a36c61f9SKrishna Gudipati 						enum rport_event event);
86a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s *rport,
87a36c61f9SKrishna Gudipati 						  enum rport_event event);
88a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
89a36c61f9SKrishna Gudipati 						enum rport_event event);
90a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport,
91a36c61f9SKrishna Gudipati 					enum rport_event event);
9261ba4394SKrishna Gudipati static void	bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s *rport,
9361ba4394SKrishna Gudipati 					enum rport_event event);
94a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport,
95a36c61f9SKrishna Gudipati 						enum rport_event event);
96a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport,
97a36c61f9SKrishna Gudipati 					enum rport_event event);
98a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport,
99a36c61f9SKrishna Gudipati 						 enum rport_event event);
100a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport,
101a36c61f9SKrishna Gudipati 					 enum rport_event event);
102bc0e2c2aSKrishna Gudipati static void	bfa_fcs_rport_sm_adisc_online_sending(
103bc0e2c2aSKrishna Gudipati 			struct bfa_fcs_rport_s *rport, enum rport_event event);
104bc0e2c2aSKrishna Gudipati static void	bfa_fcs_rport_sm_adisc_online(struct bfa_fcs_rport_s *rport,
105a36c61f9SKrishna Gudipati 					enum rport_event event);
106bc0e2c2aSKrishna Gudipati static void	bfa_fcs_rport_sm_adisc_offline_sending(struct bfa_fcs_rport_s
107bc0e2c2aSKrishna Gudipati 					*rport, enum rport_event event);
108bc0e2c2aSKrishna Gudipati static void	bfa_fcs_rport_sm_adisc_offline(struct bfa_fcs_rport_s *rport,
109a36c61f9SKrishna Gudipati 					enum rport_event event);
110a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s *rport,
111a36c61f9SKrishna Gudipati 						enum rport_event event);
112a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_fc4_logosend(struct bfa_fcs_rport_s *rport,
113a36c61f9SKrishna Gudipati 						enum rport_event event);
114a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport,
115a36c61f9SKrishna Gudipati 						enum rport_event event);
116a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport,
117a36c61f9SKrishna Gudipati 						enum rport_event event);
118a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s *rport,
119a36c61f9SKrishna Gudipati 						enum rport_event event);
120a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s *rport,
121a36c61f9SKrishna Gudipati 						enum rport_event event);
122a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s *rport,
123a36c61f9SKrishna Gudipati 						enum rport_event event);
124a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport,
125a36c61f9SKrishna Gudipati 					 enum rport_event event);
126a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s *rport,
127a36c61f9SKrishna Gudipati 						enum rport_event event);
128a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s *rport,
129a36c61f9SKrishna Gudipati 						enum rport_event event);
130a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
131a36c61f9SKrishna Gudipati 						enum rport_event event);
132a36c61f9SKrishna Gudipati static void	bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
133a36c61f9SKrishna Gudipati 						enum rport_event event);
13461ba4394SKrishna Gudipati static void	bfa_fcs_rport_sm_fc4_off_delete(struct bfa_fcs_rport_s *rport,
13561ba4394SKrishna Gudipati 						enum rport_event event);
13661ba4394SKrishna Gudipati static void	bfa_fcs_rport_sm_delete_pending(struct bfa_fcs_rport_s *rport,
13761ba4394SKrishna Gudipati 						enum rport_event event);
138a36c61f9SKrishna Gudipati 
139a36c61f9SKrishna Gudipati static struct bfa_sm_table_s rport_sm_table[] = {
140a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_uninit), BFA_RPORT_UNINIT},
141a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_plogi_sending), BFA_RPORT_PLOGI},
142a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_plogiacc_sending), BFA_RPORT_ONLINE},
143a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_plogi_retry), BFA_RPORT_PLOGI_RETRY},
144a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_plogi), BFA_RPORT_PLOGI},
14561ba4394SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_fc4_fcs_online), BFA_RPORT_ONLINE},
146a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_hal_online), BFA_RPORT_ONLINE},
147a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_online), BFA_RPORT_ONLINE},
148a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_nsquery_sending), BFA_RPORT_NSQUERY},
149a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_nsquery), BFA_RPORT_NSQUERY},
150bc0e2c2aSKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_adisc_online_sending), BFA_RPORT_ADISC},
151bc0e2c2aSKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_adisc_online), BFA_RPORT_ADISC},
152bc0e2c2aSKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_adisc_offline_sending), BFA_RPORT_ADISC},
153bc0e2c2aSKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_adisc_offline), BFA_RPORT_ADISC},
154a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_fc4_logorcv), BFA_RPORT_LOGORCV},
155a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_fc4_logosend), BFA_RPORT_LOGO},
156a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_fc4_offline), BFA_RPORT_OFFLINE},
157a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_hcb_offline), BFA_RPORT_OFFLINE},
158a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_hcb_logorcv), BFA_RPORT_LOGORCV},
159a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_hcb_logosend), BFA_RPORT_LOGO},
160a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_logo_sending), BFA_RPORT_LOGO},
161a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_offline), BFA_RPORT_OFFLINE},
162a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_nsdisc_sending), BFA_RPORT_NSDISC},
163a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_nsdisc_retry), BFA_RPORT_NSDISC},
164a36c61f9SKrishna Gudipati 	{BFA_SM(bfa_fcs_rport_sm_nsdisc_sent), BFA_RPORT_NSDISC},
165a36c61f9SKrishna Gudipati };
166a36c61f9SKrishna Gudipati 
1675fbe25c7SJing Huang /*
168a36c61f9SKrishna Gudipati  *		Beginning state.
169a36c61f9SKrishna Gudipati  */
170a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s * rport,enum rport_event event)171a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport, enum rport_event event)
172a36c61f9SKrishna Gudipati {
173a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
174a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
175a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
176a36c61f9SKrishna Gudipati 
177a36c61f9SKrishna Gudipati 	switch (event) {
178a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_SEND:
179a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
180a36c61f9SKrishna Gudipati 		rport->plogi_retries = 0;
181a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogi(rport, NULL);
182a36c61f9SKrishna Gudipati 		break;
183a36c61f9SKrishna Gudipati 
184a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
18507cdc046SVijay Mohan Guvva 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
18607cdc046SVijay Mohan Guvva 		bfa_fcs_rport_send_plogiacc(rport, NULL);
187a36c61f9SKrishna Gudipati 		break;
188a36c61f9SKrishna Gudipati 
189a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
190a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online);
191a36c61f9SKrishna Gudipati 		bfa_fcs_rport_hal_online(rport);
192a36c61f9SKrishna Gudipati 		break;
193a36c61f9SKrishna Gudipati 
194a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
195a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_DISC:
196a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
197a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
198a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
199a36c61f9SKrishna Gudipati 		break;
200a36c61f9SKrishna Gudipati 	default:
201a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
202a36c61f9SKrishna Gudipati 	}
203a36c61f9SKrishna Gudipati }
204a36c61f9SKrishna Gudipati 
2055fbe25c7SJing Huang /*
206a36c61f9SKrishna Gudipati  *		PLOGI is being sent.
207a36c61f9SKrishna Gudipati  */
208a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_plogi_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)209a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_plogi_sending(struct bfa_fcs_rport_s *rport,
210a36c61f9SKrishna Gudipati 	 enum rport_event event)
211a36c61f9SKrishna Gudipati {
212a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
213a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
214a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
215a36c61f9SKrishna Gudipati 
216a36c61f9SKrishna Gudipati 	switch (event) {
217a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
218a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi);
219a36c61f9SKrishna Gudipati 		break;
220a36c61f9SKrishna Gudipati 
221a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
222a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
223a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
224a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
225a36c61f9SKrishna Gudipati 		break;
226a36c61f9SKrishna Gudipati 
227a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
228a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
229a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
230a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
231a36c61f9SKrishna Gudipati 		break;
232a36c61f9SKrishna Gudipati 
233bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
234bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
235bc0e2c2aSKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
236bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
237bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
238bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_del_timeout);
239bc0e2c2aSKrishna Gudipati 		break;
240a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
241bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
242a36c61f9SKrishna Gudipati 		/* query the NS */
243a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
244bc0e2c2aSKrishna Gudipati 		WARN_ON(!(bfa_fcport_get_topology(rport->port->fcs->bfa) !=
245bc0e2c2aSKrishna Gudipati 					BFA_PORT_TOPOLOGY_LOOP));
246a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
247a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
248a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
249a36c61f9SKrishna Gudipati 		break;
250a36c61f9SKrishna Gudipati 
251a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
252a36c61f9SKrishna Gudipati 		rport->pid = 0;
253a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
254a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
255a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
256a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
257a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
258a36c61f9SKrishna Gudipati 		break;
259a36c61f9SKrishna Gudipati 
260a36c61f9SKrishna Gudipati 
261a36c61f9SKrishna Gudipati 	default:
262a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
263a36c61f9SKrishna Gudipati 	}
264a36c61f9SKrishna Gudipati }
265a36c61f9SKrishna Gudipati 
2665fbe25c7SJing Huang /*
267a36c61f9SKrishna Gudipati  *		PLOGI is being sent.
268a36c61f9SKrishna Gudipati  */
269a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)270a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s *rport,
271a36c61f9SKrishna Gudipati 	 enum rport_event event)
272a36c61f9SKrishna Gudipati {
273a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
274a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
275a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
276a36c61f9SKrishna Gudipati 
277a36c61f9SKrishna Gudipati 	switch (event) {
278a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
27961ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
28061ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
281a36c61f9SKrishna Gudipati 		break;
282a36c61f9SKrishna Gudipati 
283a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
284a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
285a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
286a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
287a36c61f9SKrishna Gudipati 		break;
288a36c61f9SKrishna Gudipati 
289a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
290d7be54ccSKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
291bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
2925fbe25c7SJing Huang 		/*
293a36c61f9SKrishna Gudipati 		 * Ignore, SCN is possibly online notification.
294a36c61f9SKrishna Gudipati 		 */
295a36c61f9SKrishna Gudipati 		break;
296a36c61f9SKrishna Gudipati 
297bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
298bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
299bc0e2c2aSKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
300bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
301bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
302bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_del_timeout);
303bc0e2c2aSKrishna Gudipati 		break;
304bc0e2c2aSKrishna Gudipati 
305a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
306a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
307a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
308a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
309a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
310a36c61f9SKrishna Gudipati 		break;
311a36c61f9SKrishna Gudipati 
312a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
313a36c61f9SKrishna Gudipati 		rport->pid = 0;
314a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
315a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
316a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
317a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
318a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
319a36c61f9SKrishna Gudipati 		break;
320a36c61f9SKrishna Gudipati 
321a36c61f9SKrishna Gudipati 	case RPSM_EVENT_HCB_OFFLINE:
3225fbe25c7SJing Huang 		/*
323a36c61f9SKrishna Gudipati 		 * Ignore BFA callback, on a PLOGI receive we call bfa offline.
324a36c61f9SKrishna Gudipati 		 */
325a36c61f9SKrishna Gudipati 		break;
326a36c61f9SKrishna Gudipati 
327a36c61f9SKrishna Gudipati 	default:
328a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
329a36c61f9SKrishna Gudipati 	}
330a36c61f9SKrishna Gudipati }
331a36c61f9SKrishna Gudipati 
3325fbe25c7SJing Huang /*
333a36c61f9SKrishna Gudipati  *		PLOGI is sent.
334a36c61f9SKrishna Gudipati  */
335a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s * rport,enum rport_event event)336a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
337a36c61f9SKrishna Gudipati 			enum rport_event event)
338a36c61f9SKrishna Gudipati {
339a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
340a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
341a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
342a36c61f9SKrishna Gudipati 
343a36c61f9SKrishna Gudipati 	switch (event) {
344a36c61f9SKrishna Gudipati 	case RPSM_EVENT_TIMEOUT:
345a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
346a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogi(rport, NULL);
347a36c61f9SKrishna Gudipati 		break;
348a36c61f9SKrishna Gudipati 
349a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
350a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
351a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
352a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
353a36c61f9SKrishna Gudipati 		break;
354a36c61f9SKrishna Gudipati 
355a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
356a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
357a36c61f9SKrishna Gudipati 		break;
358a36c61f9SKrishna Gudipati 
359a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
360a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
361a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
362a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
363a36c61f9SKrishna Gudipati 		break;
364a36c61f9SKrishna Gudipati 
365bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
366bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
367a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
368bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
369bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
370bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_del_timeout);
371bc0e2c2aSKrishna Gudipati 		break;
372bc0e2c2aSKrishna Gudipati 
373bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
374bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
375bc0e2c2aSKrishna Gudipati 		bfa_timer_stop(&rport->timer);
376bc0e2c2aSKrishna Gudipati 		WARN_ON(!(bfa_fcport_get_topology(rport->port->fcs->bfa) !=
377bc0e2c2aSKrishna Gudipati 					BFA_PORT_TOPOLOGY_LOOP));
378a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
379a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
380a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
381a36c61f9SKrishna Gudipati 		break;
382a36c61f9SKrishna Gudipati 
383a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
384a36c61f9SKrishna Gudipati 		rport->pid = 0;
385a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
386a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
387a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
388a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
389a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
390a36c61f9SKrishna Gudipati 		break;
391a36c61f9SKrishna Gudipati 
392a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
39361ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
394a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
39561ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
396a36c61f9SKrishna Gudipati 		break;
397a36c61f9SKrishna Gudipati 
398a36c61f9SKrishna Gudipati 	default:
399a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
400a36c61f9SKrishna Gudipati 	}
401a36c61f9SKrishna Gudipati }
402a36c61f9SKrishna Gudipati 
4035fbe25c7SJing Huang /*
404a36c61f9SKrishna Gudipati  *		PLOGI is sent.
405a36c61f9SKrishna Gudipati  */
406a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s * rport,enum rport_event event)407a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event)
408a36c61f9SKrishna Gudipati {
409a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
410a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
411a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
412a36c61f9SKrishna Gudipati 
413a36c61f9SKrishna Gudipati 	switch (event) {
414a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ACCEPTED:
41561ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
416a36c61f9SKrishna Gudipati 		rport->plogi_retries = 0;
41761ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
418a36c61f9SKrishna Gudipati 		break;
419a36c61f9SKrishna Gudipati 
420a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
421a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
422df561f66SGustavo A. R. Silva 		fallthrough;
423a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
424a36c61f9SKrishna Gudipati 		if (rport->prlo == BFA_TRUE)
425a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
426a36c61f9SKrishna Gudipati 
427a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
428df561f66SGustavo A. R. Silva 		fallthrough;
429a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FAILED:
430a36c61f9SKrishna Gudipati 		if (rport->plogi_retries < BFA_FCS_RPORT_MAX_RETRIES) {
431a36c61f9SKrishna Gudipati 			rport->plogi_retries++;
432a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_retry);
433a36c61f9SKrishna Gudipati 			bfa_timer_start(rport->fcs->bfa, &rport->timer,
434a36c61f9SKrishna Gudipati 					bfa_fcs_rport_timeout, rport,
435a36c61f9SKrishna Gudipati 					BFA_FCS_RETRY_TIMEOUT);
436a36c61f9SKrishna Gudipati 		} else {
437a36c61f9SKrishna Gudipati 			bfa_stats(rport->port, rport_del_max_plogi_retry);
438ee1a4a42SKrishna Gudipati 			rport->old_pid = rport->pid;
439a36c61f9SKrishna Gudipati 			rport->pid = 0;
440a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
441a36c61f9SKrishna Gudipati 			bfa_timer_start(rport->fcs->bfa, &rport->timer,
442a36c61f9SKrishna Gudipati 					bfa_fcs_rport_timeout, rport,
443a36c61f9SKrishna Gudipati 					bfa_fcs_rport_del_timeout);
444a36c61f9SKrishna Gudipati 		}
445a36c61f9SKrishna Gudipati 		break;
446a36c61f9SKrishna Gudipati 
447bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
448bc0e2c2aSKrishna Gudipati 		break;
449bc0e2c2aSKrishna Gudipati 
450bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
451bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
452bc0e2c2aSKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
453bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
454bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
455bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_del_timeout);
456bc0e2c2aSKrishna Gudipati 		break;
457bc0e2c2aSKrishna Gudipati 
458a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RETRY:
459a36c61f9SKrishna Gudipati 		rport->plogi_retries = 0;
460a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_retry);
461a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
462a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
463a36c61f9SKrishna Gudipati 				(FC_RA_TOV * 1000));
464a36c61f9SKrishna Gudipati 		break;
465a36c61f9SKrishna Gudipati 
466a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
467a36c61f9SKrishna Gudipati 		rport->pid = 0;
468a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
469a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
470a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
471a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
472a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
473a36c61f9SKrishna Gudipati 		break;
474a36c61f9SKrishna Gudipati 
475a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
476bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
477a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
478bc0e2c2aSKrishna Gudipati 		WARN_ON(!(bfa_fcport_get_topology(rport->port->fcs->bfa) !=
479bc0e2c2aSKrishna Gudipati 					BFA_PORT_TOPOLOGY_LOOP));
480a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
481a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
482a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
483a36c61f9SKrishna Gudipati 		break;
484a36c61f9SKrishna Gudipati 
485a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
486a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
487a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
488a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
489a36c61f9SKrishna Gudipati 		break;
490a36c61f9SKrishna Gudipati 
491a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
492a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
493a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
494a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
495a36c61f9SKrishna Gudipati 		break;
496a36c61f9SKrishna Gudipati 
497a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
49861ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
499a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
50061ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
501a36c61f9SKrishna Gudipati 		break;
502a36c61f9SKrishna Gudipati 
503a36c61f9SKrishna Gudipati 	default:
504a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
505a36c61f9SKrishna Gudipati 	}
506a36c61f9SKrishna Gudipati }
507a36c61f9SKrishna Gudipati 
5085fbe25c7SJing Huang /*
50961ba4394SKrishna Gudipati  * PLOGI is done. Await bfa_fcs_itnim to ascertain the scsi function
51061ba4394SKrishna Gudipati  */
51161ba4394SKrishna Gudipati static void
bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s * rport,enum rport_event event)51261ba4394SKrishna Gudipati bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s *rport,
51361ba4394SKrishna Gudipati 				enum rport_event event)
51461ba4394SKrishna Gudipati {
51561ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
51661ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
51761ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, event);
51861ba4394SKrishna Gudipati 
51961ba4394SKrishna Gudipati 	switch (event) {
52061ba4394SKrishna Gudipati 	case RPSM_EVENT_FC4_FCS_ONLINE:
52161ba4394SKrishna Gudipati 		if (rport->scsi_function == BFA_RPORT_INITIATOR) {
52261ba4394SKrishna Gudipati 			if (!BFA_FCS_PID_IS_WKA(rport->pid))
52361ba4394SKrishna Gudipati 				bfa_fcs_rpf_rport_online(rport);
52461ba4394SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_online);
52561ba4394SKrishna Gudipati 			break;
52661ba4394SKrishna Gudipati 		}
52761ba4394SKrishna Gudipati 
52861ba4394SKrishna Gudipati 		if (!rport->bfa_rport)
52961ba4394SKrishna Gudipati 			rport->bfa_rport =
53061ba4394SKrishna Gudipati 				bfa_rport_create(rport->fcs->bfa, rport);
53161ba4394SKrishna Gudipati 
53261ba4394SKrishna Gudipati 		if (rport->bfa_rport) {
53361ba4394SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online);
53461ba4394SKrishna Gudipati 			bfa_fcs_rport_hal_online(rport);
53561ba4394SKrishna Gudipati 		} else {
53661ba4394SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
53761ba4394SKrishna Gudipati 			bfa_fcs_rport_fcs_offline_action(rport);
53861ba4394SKrishna Gudipati 		}
53961ba4394SKrishna Gudipati 		break;
54061ba4394SKrishna Gudipati 
54161ba4394SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
54261ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
54361ba4394SKrishna Gudipati 		rport->plogi_pending = BFA_TRUE;
54461ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
54561ba4394SKrishna Gudipati 		break;
54661ba4394SKrishna Gudipati 
54761ba4394SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
54861ba4394SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
54961ba4394SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
550bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
551bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
55261ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
55361ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
55461ba4394SKrishna Gudipati 		break;
55561ba4394SKrishna Gudipati 
55661ba4394SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
55761ba4394SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
55861ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
55961ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
56061ba4394SKrishna Gudipati 		break;
56161ba4394SKrishna Gudipati 
56261ba4394SKrishna Gudipati 	case RPSM_EVENT_DELETE:
56361ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
56461ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
56561ba4394SKrishna Gudipati 		break;
56661ba4394SKrishna Gudipati 
56761ba4394SKrishna Gudipati 	default:
56861ba4394SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
56961ba4394SKrishna Gudipati 		break;
57061ba4394SKrishna Gudipati 	}
57161ba4394SKrishna Gudipati }
57261ba4394SKrishna Gudipati 
57361ba4394SKrishna Gudipati /*
574a36c61f9SKrishna Gudipati  *		PLOGI is complete. Awaiting BFA rport online callback. FC-4s
575a36c61f9SKrishna Gudipati  *		are offline.
576a36c61f9SKrishna Gudipati  */
577a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s * rport,enum rport_event event)578a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport,
579a36c61f9SKrishna Gudipati 			enum rport_event event)
580a36c61f9SKrishna Gudipati {
581a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
582a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
583a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
584a36c61f9SKrishna Gudipati 
585a36c61f9SKrishna Gudipati 	switch (event) {
586a36c61f9SKrishna Gudipati 	case RPSM_EVENT_HCB_ONLINE:
587a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_online);
58861ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_online_action(rport);
589a36c61f9SKrishna Gudipati 		break;
590a36c61f9SKrishna Gudipati 
591d7be54ccSKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
592a36c61f9SKrishna Gudipati 		break;
593a36c61f9SKrishna Gudipati 
59461ba4394SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
595a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
59661ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
59761ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
598a36c61f9SKrishna Gudipati 		break;
599a36c61f9SKrishna Gudipati 
600bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
601a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
602a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
603bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
60461ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
60561ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
606a36c61f9SKrishna Gudipati 		break;
607a36c61f9SKrishna Gudipati 
608a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
609d7be54ccSKrishna Gudipati 		rport->plogi_pending = BFA_TRUE;
61061ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
61161ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
612a36c61f9SKrishna Gudipati 		break;
613a36c61f9SKrishna Gudipati 
614a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
61561ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
61661ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
617a36c61f9SKrishna Gudipati 		break;
618a36c61f9SKrishna Gudipati 
619a36c61f9SKrishna Gudipati 	default:
620a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
621a36c61f9SKrishna Gudipati 	}
622a36c61f9SKrishna Gudipati }
623a36c61f9SKrishna Gudipati 
6245fbe25c7SJing Huang /*
625a36c61f9SKrishna Gudipati  *		Rport is ONLINE. FC-4s active.
626a36c61f9SKrishna Gudipati  */
627a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s * rport,enum rport_event event)628a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event)
629a36c61f9SKrishna Gudipati {
630a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
631a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
632a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
633a36c61f9SKrishna Gudipati 
634a36c61f9SKrishna Gudipati 	switch (event) {
635bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
636a36c61f9SKrishna Gudipati 		if (bfa_fcs_fabric_is_switched(rport->port->fabric)) {
637a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport,
638a36c61f9SKrishna Gudipati 					 bfa_fcs_rport_sm_nsquery_sending);
639a36c61f9SKrishna Gudipati 			rport->ns_retries = 0;
640a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_nsdisc(rport, NULL);
641a36c61f9SKrishna Gudipati 		} else {
642bc0e2c2aSKrishna Gudipati 			bfa_sm_set_state(rport,
643bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_sm_adisc_online_sending);
644a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_adisc(rport, NULL);
645a36c61f9SKrishna Gudipati 		}
646a36c61f9SKrishna Gudipati 		break;
647a36c61f9SKrishna Gudipati 
648a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
649a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
650a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
651bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
652a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
65361ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
654a36c61f9SKrishna Gudipati 		break;
655a36c61f9SKrishna Gudipati 
656a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
657a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
65861ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
659a36c61f9SKrishna Gudipati 		break;
660a36c61f9SKrishna Gudipati 
661a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
662a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
663a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
66461ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
665a36c61f9SKrishna Gudipati 		break;
666a36c61f9SKrishna Gudipati 
667bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
668a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
669a36c61f9SKrishna Gudipati 		break;
670a36c61f9SKrishna Gudipati 
671a36c61f9SKrishna Gudipati 	default:
672a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
673a36c61f9SKrishna Gudipati 	}
674a36c61f9SKrishna Gudipati }
675a36c61f9SKrishna Gudipati 
6765fbe25c7SJing Huang /*
677a36c61f9SKrishna Gudipati  *		An SCN event is received in ONLINE state. NS query is being sent
678a36c61f9SKrishna Gudipati  *		prior to ADISC authentication with rport. FC-4s are paused.
679a36c61f9SKrishna Gudipati  */
680a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)681a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport,
682a36c61f9SKrishna Gudipati 	 enum rport_event event)
683a36c61f9SKrishna Gudipati {
684a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
685a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
686a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
687a36c61f9SKrishna Gudipati 
688a36c61f9SKrishna Gudipati 	switch (event) {
689a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
690a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsquery);
691a36c61f9SKrishna Gudipati 		break;
692a36c61f9SKrishna Gudipati 
693a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
694a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
695a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
69661ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
697a36c61f9SKrishna Gudipati 		break;
698a36c61f9SKrishna Gudipati 
699bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
7005fbe25c7SJing Huang 		/*
701a36c61f9SKrishna Gudipati 		 * ignore SCN, wait for response to query itself
702a36c61f9SKrishna Gudipati 		 */
703a36c61f9SKrishna Gudipati 		break;
704a36c61f9SKrishna Gudipati 
705a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
706a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
707a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
708a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
70961ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
710a36c61f9SKrishna Gudipati 		break;
711a36c61f9SKrishna Gudipati 
712a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
713a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
714a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
715a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
716a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
717a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
71861ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
719a36c61f9SKrishna Gudipati 		break;
720a36c61f9SKrishna Gudipati 
721a36c61f9SKrishna Gudipati 	default:
722a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
723a36c61f9SKrishna Gudipati 	}
724a36c61f9SKrishna Gudipati }
725a36c61f9SKrishna Gudipati 
7265fbe25c7SJing Huang /*
727a36c61f9SKrishna Gudipati  *	An SCN event is received in ONLINE state. NS query is sent to rport.
728a36c61f9SKrishna Gudipati  *	FC-4s are paused.
729a36c61f9SKrishna Gudipati  */
730a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s * rport,enum rport_event event)731a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
732a36c61f9SKrishna Gudipati {
733a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
734a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
735a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
736a36c61f9SKrishna Gudipati 
737a36c61f9SKrishna Gudipati 	switch (event) {
738a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ACCEPTED:
739bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_adisc_online_sending);
740a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_adisc(rport, NULL);
741a36c61f9SKrishna Gudipati 		break;
742a36c61f9SKrishna Gudipati 
743a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FAILED:
744a36c61f9SKrishna Gudipati 		rport->ns_retries++;
745a36c61f9SKrishna Gudipati 		if (rport->ns_retries < BFA_FCS_RPORT_MAX_RETRIES) {
746a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport,
747a36c61f9SKrishna Gudipati 					 bfa_fcs_rport_sm_nsquery_sending);
748a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_nsdisc(rport, NULL);
749a36c61f9SKrishna Gudipati 		} else {
750a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
75161ba4394SKrishna Gudipati 			bfa_fcs_rport_hal_offline_action(rport);
752a36c61f9SKrishna Gudipati 		}
753a36c61f9SKrishna Gudipati 		break;
754a36c61f9SKrishna Gudipati 
755a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
756a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
757a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
75861ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
759a36c61f9SKrishna Gudipati 		break;
760a36c61f9SKrishna Gudipati 
761bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
762a36c61f9SKrishna Gudipati 		break;
763a36c61f9SKrishna Gudipati 
764a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
765a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
766a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
767a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
76861ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
769a36c61f9SKrishna Gudipati 		break;
770a36c61f9SKrishna Gudipati 
771a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
772a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
773a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
774a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
775a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
776a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
77761ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
778a36c61f9SKrishna Gudipati 		break;
779a36c61f9SKrishna Gudipati 
780a36c61f9SKrishna Gudipati 	default:
781a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
782a36c61f9SKrishna Gudipati 	}
783a36c61f9SKrishna Gudipati }
784a36c61f9SKrishna Gudipati 
7855fbe25c7SJing Huang /*
786a36c61f9SKrishna Gudipati  *	An SCN event is received in ONLINE state. ADISC is being sent for
787a36c61f9SKrishna Gudipati  *	authenticating with rport. FC-4s are paused.
788a36c61f9SKrishna Gudipati  */
789a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_adisc_online_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)790bc0e2c2aSKrishna Gudipati bfa_fcs_rport_sm_adisc_online_sending(struct bfa_fcs_rport_s *rport,
791a36c61f9SKrishna Gudipati 	 enum rport_event event)
792a36c61f9SKrishna Gudipati {
793a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
794a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
795a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
796a36c61f9SKrishna Gudipati 
797a36c61f9SKrishna Gudipati 	switch (event) {
798a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
799bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_adisc_online);
800a36c61f9SKrishna Gudipati 		break;
801a36c61f9SKrishna Gudipati 
802a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
803a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
804a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
80561ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
806a36c61f9SKrishna Gudipati 		break;
807a36c61f9SKrishna Gudipati 
808a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
809a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
810a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
811a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
81261ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
813a36c61f9SKrishna Gudipati 		break;
814a36c61f9SKrishna Gudipati 
815a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
816a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
817a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
818a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
81961ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
820a36c61f9SKrishna Gudipati 		break;
821a36c61f9SKrishna Gudipati 
822bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
823a36c61f9SKrishna Gudipati 		break;
824a36c61f9SKrishna Gudipati 
825a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
826a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
827a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
82861ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
829a36c61f9SKrishna Gudipati 		break;
830a36c61f9SKrishna Gudipati 
831a36c61f9SKrishna Gudipati 	default:
832a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
833a36c61f9SKrishna Gudipati 	}
834a36c61f9SKrishna Gudipati }
835a36c61f9SKrishna Gudipati 
8365fbe25c7SJing Huang /*
837a36c61f9SKrishna Gudipati  *		An SCN event is received in ONLINE state. ADISC is to rport.
838a36c61f9SKrishna Gudipati  *		FC-4s are paused.
839a36c61f9SKrishna Gudipati  */
840a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_adisc_online(struct bfa_fcs_rport_s * rport,enum rport_event event)841bc0e2c2aSKrishna Gudipati bfa_fcs_rport_sm_adisc_online(struct bfa_fcs_rport_s *rport,
842bc0e2c2aSKrishna Gudipati 				enum rport_event event)
843a36c61f9SKrishna Gudipati {
844a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
845a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
846a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
847a36c61f9SKrishna Gudipati 
848a36c61f9SKrishna Gudipati 	switch (event) {
849a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ACCEPTED:
850a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_online);
851a36c61f9SKrishna Gudipati 		break;
852a36c61f9SKrishna Gudipati 
853a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
8545fbe25c7SJing Huang 		/*
855a36c61f9SKrishna Gudipati 		 * Too complex to cleanup FC-4 & rport and then acc to PLOGI.
856a36c61f9SKrishna Gudipati 		 * At least go offline when a PLOGI is received.
857a36c61f9SKrishna Gudipati 		 */
858a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
859df561f66SGustavo A. R. Silva 		fallthrough;
860a36c61f9SKrishna Gudipati 
861a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FAILED:
862a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
863a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
86461ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
865a36c61f9SKrishna Gudipati 		break;
866a36c61f9SKrishna Gudipati 
867a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
868a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
869a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
87061ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
871a36c61f9SKrishna Gudipati 		break;
872a36c61f9SKrishna Gudipati 
873bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
8745fbe25c7SJing Huang 		/*
875a36c61f9SKrishna Gudipati 		 * already processing RSCN
876a36c61f9SKrishna Gudipati 		 */
877a36c61f9SKrishna Gudipati 		break;
878a36c61f9SKrishna Gudipati 
879a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
880a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
881a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
88261ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
883a36c61f9SKrishna Gudipati 		break;
884a36c61f9SKrishna Gudipati 
885a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
886a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
887a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
888a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
88961ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline_action(rport);
890a36c61f9SKrishna Gudipati 		break;
891a36c61f9SKrishna Gudipati 
892a36c61f9SKrishna Gudipati 	default:
893a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
894a36c61f9SKrishna Gudipati 	}
895a36c61f9SKrishna Gudipati }
896a36c61f9SKrishna Gudipati 
8975fbe25c7SJing Huang /*
898bc0e2c2aSKrishna Gudipati  * ADISC is being sent for authenticating with rport
899bc0e2c2aSKrishna Gudipati  * Already did offline actions.
900bc0e2c2aSKrishna Gudipati  */
901bc0e2c2aSKrishna Gudipati static void
bfa_fcs_rport_sm_adisc_offline_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)902bc0e2c2aSKrishna Gudipati bfa_fcs_rport_sm_adisc_offline_sending(struct bfa_fcs_rport_s *rport,
903bc0e2c2aSKrishna Gudipati 	enum rport_event event)
904bc0e2c2aSKrishna Gudipati {
905bc0e2c2aSKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
906bc0e2c2aSKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
907bc0e2c2aSKrishna Gudipati 	bfa_trc(rport->fcs, event);
908bc0e2c2aSKrishna Gudipati 
909bc0e2c2aSKrishna Gudipati 	switch (event) {
910bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
911bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_adisc_offline);
912bc0e2c2aSKrishna Gudipati 		break;
913bc0e2c2aSKrishna Gudipati 
914bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_DELETE:
915bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
916bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
917bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
918bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
919bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
920bc0e2c2aSKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa,
921bc0e2c2aSKrishna Gudipati 			&rport->fcxp_wqe);
922bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
923bc0e2c2aSKrishna Gudipati 			bfa_fcs_rport_timeout, rport,
924bc0e2c2aSKrishna Gudipati 			bfa_fcs_rport_del_timeout);
925bc0e2c2aSKrishna Gudipati 		break;
926bc0e2c2aSKrishna Gudipati 
927bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
928bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
929bc0e2c2aSKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
930bc0e2c2aSKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
931bc0e2c2aSKrishna Gudipati 		break;
932bc0e2c2aSKrishna Gudipati 
933bc0e2c2aSKrishna Gudipati 	default:
934bc0e2c2aSKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
935bc0e2c2aSKrishna Gudipati 	}
936bc0e2c2aSKrishna Gudipati }
937bc0e2c2aSKrishna Gudipati 
938bc0e2c2aSKrishna Gudipati /*
939bc0e2c2aSKrishna Gudipati  * ADISC to rport
940bc0e2c2aSKrishna Gudipati  * Already did offline actions
941bc0e2c2aSKrishna Gudipati  */
942bc0e2c2aSKrishna Gudipati static void
bfa_fcs_rport_sm_adisc_offline(struct bfa_fcs_rport_s * rport,enum rport_event event)943bc0e2c2aSKrishna Gudipati bfa_fcs_rport_sm_adisc_offline(struct bfa_fcs_rport_s *rport,
944bc0e2c2aSKrishna Gudipati 			enum rport_event event)
945bc0e2c2aSKrishna Gudipati {
946bc0e2c2aSKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
947bc0e2c2aSKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
948bc0e2c2aSKrishna Gudipati 	bfa_trc(rport->fcs, event);
949bc0e2c2aSKrishna Gudipati 
950bc0e2c2aSKrishna Gudipati 	switch (event) {
951bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_ACCEPTED:
952bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online);
953bc0e2c2aSKrishna Gudipati 		bfa_fcs_rport_hal_online(rport);
954bc0e2c2aSKrishna Gudipati 		break;
955bc0e2c2aSKrishna Gudipati 
956bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
957bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
958bc0e2c2aSKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
959bc0e2c2aSKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
960bc0e2c2aSKrishna Gudipati 		break;
961bc0e2c2aSKrishna Gudipati 
962bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAILED:
963bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
964bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
965bc0e2c2aSKrishna Gudipati 			bfa_fcs_rport_timeout, rport,
966bc0e2c2aSKrishna Gudipati 			bfa_fcs_rport_del_timeout);
967bc0e2c2aSKrishna Gudipati 		break;
968bc0e2c2aSKrishna Gudipati 
969bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_DELETE:
970bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
971bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
972bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
973bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
974bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
975bc0e2c2aSKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
976bc0e2c2aSKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
977bc0e2c2aSKrishna Gudipati 			bfa_fcs_rport_timeout, rport,
978bc0e2c2aSKrishna Gudipati 			bfa_fcs_rport_del_timeout);
979bc0e2c2aSKrishna Gudipati 		break;
980bc0e2c2aSKrishna Gudipati 
981bc0e2c2aSKrishna Gudipati 	default:
982bc0e2c2aSKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
983bc0e2c2aSKrishna Gudipati 	}
984bc0e2c2aSKrishna Gudipati }
985bc0e2c2aSKrishna Gudipati 
986bc0e2c2aSKrishna Gudipati /*
987a36c61f9SKrishna Gudipati  * Rport has sent LOGO. Awaiting FC-4 offline completion callback.
988a36c61f9SKrishna Gudipati  */
989a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s * rport,enum rport_event event)990a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s *rport,
991a36c61f9SKrishna Gudipati 			enum rport_event event)
992a36c61f9SKrishna Gudipati {
993a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
994a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
995a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
996a36c61f9SKrishna Gudipati 
997a36c61f9SKrishna Gudipati 	switch (event) {
998a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FC4_OFFLINE:
999a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logorcv);
100061ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline(rport);
1001a36c61f9SKrishna Gudipati 		break;
1002a36c61f9SKrishna Gudipati 
1003a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
100461ba4394SKrishna Gudipati 		if (rport->pid && (rport->prlo == BFA_TRUE))
100561ba4394SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
100661ba4394SKrishna Gudipati 		if (rport->pid && (rport->prlo == BFA_FALSE))
100761ba4394SKrishna Gudipati 			bfa_fcs_rport_send_logo_acc(rport);
100861ba4394SKrishna Gudipati 
100961ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_off_delete);
1010a36c61f9SKrishna Gudipati 		break;
1011a36c61f9SKrishna Gudipati 
1012bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1013bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
101461ba4394SKrishna Gudipati 	case RPSM_EVENT_HCB_ONLINE:
1015a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
1016a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
1017a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1018a36c61f9SKrishna Gudipati 		break;
1019a36c61f9SKrishna Gudipati 
1020a36c61f9SKrishna Gudipati 	default:
1021a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1022a36c61f9SKrishna Gudipati 	}
1023a36c61f9SKrishna Gudipati }
1024a36c61f9SKrishna Gudipati 
10255fbe25c7SJing Huang /*
1026a36c61f9SKrishna Gudipati  *		LOGO needs to be sent to rport. Awaiting FC-4 offline completion
1027a36c61f9SKrishna Gudipati  *		callback.
1028a36c61f9SKrishna Gudipati  */
1029a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_fc4_logosend(struct bfa_fcs_rport_s * rport,enum rport_event event)1030a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_fc4_logosend(struct bfa_fcs_rport_s *rport,
1031a36c61f9SKrishna Gudipati 	 enum rport_event event)
1032a36c61f9SKrishna Gudipati {
1033a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1034a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1035a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1036a36c61f9SKrishna Gudipati 
1037a36c61f9SKrishna Gudipati 	switch (event) {
1038a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FC4_OFFLINE:
1039a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logosend);
104061ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline(rport);
104161ba4394SKrishna Gudipati 		break;
104261ba4394SKrishna Gudipati 
104361ba4394SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
104461ba4394SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
1045df561f66SGustavo A. R. Silva 		fallthrough;
104661ba4394SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
104761ba4394SKrishna Gudipati 		if (rport->prlo == BFA_TRUE)
104861ba4394SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
104961ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_off_delete);
105061ba4394SKrishna Gudipati 		break;
105161ba4394SKrishna Gudipati 
105261ba4394SKrishna Gudipati 	case RPSM_EVENT_HCB_ONLINE:
105361ba4394SKrishna Gudipati 	case RPSM_EVENT_DELETE:
105461ba4394SKrishna Gudipati 		/* Rport is being deleted */
1055a36c61f9SKrishna Gudipati 		break;
1056a36c61f9SKrishna Gudipati 
1057a36c61f9SKrishna Gudipati 	default:
1058a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1059a36c61f9SKrishna Gudipati 	}
1060a36c61f9SKrishna Gudipati }
1061a36c61f9SKrishna Gudipati 
10625fbe25c7SJing Huang /*
1063a36c61f9SKrishna Gudipati  *	Rport is going offline. Awaiting FC-4 offline completion callback.
1064a36c61f9SKrishna Gudipati  */
1065a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s * rport,enum rport_event event)1066a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport,
1067a36c61f9SKrishna Gudipati 			enum rport_event event)
1068a36c61f9SKrishna Gudipati {
1069a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1070a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1071a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1072a36c61f9SKrishna Gudipati 
1073a36c61f9SKrishna Gudipati 	switch (event) {
1074a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FC4_OFFLINE:
1075a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_offline);
107661ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline(rport);
1077a36c61f9SKrishna Gudipati 		break;
1078a36c61f9SKrishna Gudipati 
1079bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1080bc0e2c2aSKrishna Gudipati 		break;
108161ba4394SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
108261ba4394SKrishna Gudipati 		/*
108361ba4394SKrishna Gudipati 		 * Rport is going offline. Just ack the logo
108461ba4394SKrishna Gudipati 		 */
108561ba4394SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
108661ba4394SKrishna Gudipati 		break;
108761ba4394SKrishna Gudipati 
108861ba4394SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
108961ba4394SKrishna Gudipati 		bfa_fcs_rport_send_prlo_acc(rport);
109061ba4394SKrishna Gudipati 		break;
109161ba4394SKrishna Gudipati 
1092bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
109361ba4394SKrishna Gudipati 	case RPSM_EVENT_HCB_ONLINE:
1094bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
1095a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
1096a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
10975fbe25c7SJing Huang 		/*
1098a36c61f9SKrishna Gudipati 		 * rport is already going offline.
1099a36c61f9SKrishna Gudipati 		 * SCN - ignore and wait till transitioning to offline state
1100a36c61f9SKrishna Gudipati 		 */
1101a36c61f9SKrishna Gudipati 		break;
1102a36c61f9SKrishna Gudipati 
1103a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
1104a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
1105a36c61f9SKrishna Gudipati 		break;
1106a36c61f9SKrishna Gudipati 
1107a36c61f9SKrishna Gudipati 	default:
1108a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1109a36c61f9SKrishna Gudipati 	}
1110a36c61f9SKrishna Gudipati }
1111a36c61f9SKrishna Gudipati 
11125fbe25c7SJing Huang /*
1113a36c61f9SKrishna Gudipati  *		Rport is offline. FC-4s are offline. Awaiting BFA rport offline
1114a36c61f9SKrishna Gudipati  *		callback.
1115a36c61f9SKrishna Gudipati  */
1116a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s * rport,enum rport_event event)1117a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport,
1118a36c61f9SKrishna Gudipati 				enum rport_event event)
1119a36c61f9SKrishna Gudipati {
1120a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1121a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1122a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1123a36c61f9SKrishna Gudipati 
1124a36c61f9SKrishna Gudipati 	switch (event) {
1125a36c61f9SKrishna Gudipati 	case RPSM_EVENT_HCB_OFFLINE:
1126d7be54ccSKrishna Gudipati 		if (bfa_fcs_lport_is_online(rport->port) &&
1127d7be54ccSKrishna Gudipati 		    (rport->plogi_pending)) {
1128d7be54ccSKrishna Gudipati 			rport->plogi_pending = BFA_FALSE;
1129d7be54ccSKrishna Gudipati 			bfa_sm_set_state(rport,
1130d7be54ccSKrishna Gudipati 				bfa_fcs_rport_sm_plogiacc_sending);
1131d7be54ccSKrishna Gudipati 			bfa_fcs_rport_send_plogiacc(rport, NULL);
1132d7be54ccSKrishna Gudipati 			break;
1133d7be54ccSKrishna Gudipati 		}
1134df561f66SGustavo A. R. Silva 		fallthrough;
1135d7be54ccSKrishna Gudipati 
1136a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
113761ba4394SKrishna Gudipati 		if (!bfa_fcs_lport_is_online(rport->port)) {
113861ba4394SKrishna Gudipati 			rport->pid = 0;
113961ba4394SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
114061ba4394SKrishna Gudipati 			bfa_timer_start(rport->fcs->bfa, &rport->timer,
114161ba4394SKrishna Gudipati 					bfa_fcs_rport_timeout, rport,
114261ba4394SKrishna Gudipati 					bfa_fcs_rport_del_timeout);
114361ba4394SKrishna Gudipati 			break;
114461ba4394SKrishna Gudipati 		}
1145a36c61f9SKrishna Gudipati 		if (bfa_fcs_fabric_is_switched(rport->port->fabric)) {
1146a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport,
1147a36c61f9SKrishna Gudipati 				bfa_fcs_rport_sm_nsdisc_sending);
1148a36c61f9SKrishna Gudipati 			rport->ns_retries = 0;
1149a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_nsdisc(rport, NULL);
1150bc0e2c2aSKrishna Gudipati 		} else if (bfa_fcport_get_topology(rport->port->fcs->bfa) ==
1151bc0e2c2aSKrishna Gudipati 					BFA_PORT_TOPOLOGY_LOOP) {
1152bc0e2c2aSKrishna Gudipati 			if (rport->scn_online) {
1153bc0e2c2aSKrishna Gudipati 				bfa_sm_set_state(rport,
1154bc0e2c2aSKrishna Gudipati 					bfa_fcs_rport_sm_adisc_offline_sending);
1155bc0e2c2aSKrishna Gudipati 				bfa_fcs_rport_send_adisc(rport, NULL);
1156bc0e2c2aSKrishna Gudipati 			} else {
1157bc0e2c2aSKrishna Gudipati 				bfa_sm_set_state(rport,
1158bc0e2c2aSKrishna Gudipati 					bfa_fcs_rport_sm_offline);
1159bc0e2c2aSKrishna Gudipati 				bfa_timer_start(rport->fcs->bfa, &rport->timer,
1160bc0e2c2aSKrishna Gudipati 					bfa_fcs_rport_timeout, rport,
1161bc0e2c2aSKrishna Gudipati 					bfa_fcs_rport_del_timeout);
1162bc0e2c2aSKrishna Gudipati 			}
1163a36c61f9SKrishna Gudipati 		} else {
116461ba4394SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
1165a36c61f9SKrishna Gudipati 			rport->plogi_retries = 0;
1166a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_plogi(rport, NULL);
1167a36c61f9SKrishna Gudipati 		}
1168a36c61f9SKrishna Gudipati 		break;
1169a36c61f9SKrishna Gudipati 
1170a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
1171a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1172a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1173a36c61f9SKrishna Gudipati 		break;
1174a36c61f9SKrishna Gudipati 
1175bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1176bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
1177bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
1178a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
1179a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
1180d7be54ccSKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
1181d7be54ccSKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
11825fbe25c7SJing Huang 		/*
1183a36c61f9SKrishna Gudipati 		 * Ignore, already offline.
1184a36c61f9SKrishna Gudipati 		 */
1185a36c61f9SKrishna Gudipati 		break;
1186a36c61f9SKrishna Gudipati 
1187a36c61f9SKrishna Gudipati 	default:
1188a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1189a36c61f9SKrishna Gudipati 	}
1190a36c61f9SKrishna Gudipati }
1191a36c61f9SKrishna Gudipati 
11925fbe25c7SJing Huang /*
1193a36c61f9SKrishna Gudipati  *		Rport is offline. FC-4s are offline. Awaiting BFA rport offline
1194a36c61f9SKrishna Gudipati  *		callback to send LOGO accept.
1195a36c61f9SKrishna Gudipati  */
1196a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s * rport,enum rport_event event)1197a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s *rport,
1198a36c61f9SKrishna Gudipati 			enum rport_event event)
1199a36c61f9SKrishna Gudipati {
1200a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1201a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1202a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1203a36c61f9SKrishna Gudipati 
1204a36c61f9SKrishna Gudipati 	switch (event) {
1205a36c61f9SKrishna Gudipati 	case RPSM_EVENT_HCB_OFFLINE:
1206a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1207a36c61f9SKrishna Gudipati 		if (rport->pid && (rport->prlo == BFA_TRUE))
1208a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
1209a36c61f9SKrishna Gudipati 		if (rport->pid && (rport->prlo == BFA_FALSE))
1210a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_logo_acc(rport);
1211a36c61f9SKrishna Gudipati 		/*
1212a36c61f9SKrishna Gudipati 		 * If the lport is online and if the rport is not a well
1213a36c61f9SKrishna Gudipati 		 * known address port,
1214a36c61f9SKrishna Gudipati 		 * we try to re-discover the r-port.
1215a36c61f9SKrishna Gudipati 		 */
1216a36c61f9SKrishna Gudipati 		if (bfa_fcs_lport_is_online(rport->port) &&
1217a36c61f9SKrishna Gudipati 			(!BFA_FCS_PID_IS_WKA(rport->pid))) {
1218d7be54ccSKrishna Gudipati 			if (bfa_fcs_fabric_is_switched(rport->port->fabric)) {
1219a36c61f9SKrishna Gudipati 				bfa_sm_set_state(rport,
1220a36c61f9SKrishna Gudipati 					bfa_fcs_rport_sm_nsdisc_sending);
1221a36c61f9SKrishna Gudipati 				rport->ns_retries = 0;
1222a36c61f9SKrishna Gudipati 				bfa_fcs_rport_send_nsdisc(rport, NULL);
1223a36c61f9SKrishna Gudipati 			} else {
1224d7be54ccSKrishna Gudipati 				/* For N2N  Direct Attach, try to re-login */
1225d7be54ccSKrishna Gudipati 				bfa_sm_set_state(rport,
1226d7be54ccSKrishna Gudipati 					bfa_fcs_rport_sm_plogi_sending);
1227d7be54ccSKrishna Gudipati 				rport->plogi_retries = 0;
1228d7be54ccSKrishna Gudipati 				bfa_fcs_rport_send_plogi(rport, NULL);
1229d7be54ccSKrishna Gudipati 			}
1230d7be54ccSKrishna Gudipati 		} else {
1231a36c61f9SKrishna Gudipati 			/*
1232a36c61f9SKrishna Gudipati 			 * if it is not a well known address, reset the
1233a36c61f9SKrishna Gudipati 			 * pid to 0.
1234a36c61f9SKrishna Gudipati 			 */
1235a36c61f9SKrishna Gudipati 			if (!BFA_FCS_PID_IS_WKA(rport->pid))
1236a36c61f9SKrishna Gudipati 				rport->pid = 0;
1237a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
1238a36c61f9SKrishna Gudipati 			bfa_timer_start(rport->fcs->bfa, &rport->timer,
1239a36c61f9SKrishna Gudipati 					bfa_fcs_rport_timeout, rport,
1240a36c61f9SKrishna Gudipati 					bfa_fcs_rport_del_timeout);
1241a36c61f9SKrishna Gudipati 		}
1242a36c61f9SKrishna Gudipati 		break;
1243a36c61f9SKrishna Gudipati 
1244a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
124561ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_delete_pending);
124661ba4394SKrishna Gudipati 		if (rport->pid && (rport->prlo == BFA_TRUE))
124761ba4394SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
124861ba4394SKrishna Gudipati 		if (rport->pid && (rport->prlo == BFA_FALSE))
124961ba4394SKrishna Gudipati 			bfa_fcs_rport_send_logo_acc(rport);
1250a36c61f9SKrishna Gudipati 		break;
1251a36c61f9SKrishna Gudipati 
1252a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
1253a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_offline);
1254a36c61f9SKrishna Gudipati 		break;
1255a36c61f9SKrishna Gudipati 
1256bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1257bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
1258a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
1259a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
12605fbe25c7SJing Huang 		/*
1261a36c61f9SKrishna Gudipati 		 * Ignore - already processing a LOGO.
1262a36c61f9SKrishna Gudipati 		 */
1263a36c61f9SKrishna Gudipati 		break;
1264a36c61f9SKrishna Gudipati 
1265a36c61f9SKrishna Gudipati 	default:
1266a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1267a36c61f9SKrishna Gudipati 	}
1268a36c61f9SKrishna Gudipati }
1269a36c61f9SKrishna Gudipati 
12705fbe25c7SJing Huang /*
1271a36c61f9SKrishna Gudipati  *		Rport is being deleted. FC-4s are offline.
1272a36c61f9SKrishna Gudipati  *  Awaiting BFA rport offline
1273a36c61f9SKrishna Gudipati  *		callback to send LOGO.
1274a36c61f9SKrishna Gudipati  */
1275a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s * rport,enum rport_event event)1276a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s *rport,
1277a36c61f9SKrishna Gudipati 		 enum rport_event event)
1278a36c61f9SKrishna Gudipati {
1279a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1280a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1281a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1282a36c61f9SKrishna Gudipati 
1283a36c61f9SKrishna Gudipati 	switch (event) {
1284a36c61f9SKrishna Gudipati 	case RPSM_EVENT_HCB_OFFLINE:
1285a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_logo_sending);
1286a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_logo(rport, NULL);
1287a36c61f9SKrishna Gudipati 		break;
1288a36c61f9SKrishna Gudipati 
1289a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
129061ba4394SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
1291df561f66SGustavo A. R. Silva 		fallthrough;
1292a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
129361ba4394SKrishna Gudipati 		if (rport->prlo == BFA_TRUE)
129461ba4394SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
129561ba4394SKrishna Gudipati 
129661ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_delete_pending);
129761ba4394SKrishna Gudipati 		break;
129861ba4394SKrishna Gudipati 
1299bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1300bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
1301a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1302a36c61f9SKrishna Gudipati 		break;
1303a36c61f9SKrishna Gudipati 
1304a36c61f9SKrishna Gudipati 	default:
1305a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1306a36c61f9SKrishna Gudipati 	}
1307a36c61f9SKrishna Gudipati }
1308a36c61f9SKrishna Gudipati 
13095fbe25c7SJing Huang /*
1310a36c61f9SKrishna Gudipati  *		Rport is being deleted. FC-4s are offline. LOGO is being sent.
1311a36c61f9SKrishna Gudipati  */
1312a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)1313a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s *rport,
1314a36c61f9SKrishna Gudipati 	 enum rport_event event)
1315a36c61f9SKrishna Gudipati {
1316a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1317a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1318a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1319a36c61f9SKrishna Gudipati 
1320a36c61f9SKrishna Gudipati 	switch (event) {
1321a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
1322a36c61f9SKrishna Gudipati 		/* Once LOGO is sent, we donot wait for the response */
1323a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1324a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1325a36c61f9SKrishna Gudipati 		break;
1326a36c61f9SKrishna Gudipati 
1327bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1328bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
1329bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
1330a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1331a36c61f9SKrishna Gudipati 		break;
1332a36c61f9SKrishna Gudipati 
1333a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
133461ba4394SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
1335df561f66SGustavo A. R. Silva 		fallthrough;
1336a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
133761ba4394SKrishna Gudipati 		if (rport->prlo == BFA_TRUE)
133861ba4394SKrishna Gudipati 			bfa_fcs_rport_send_prlo_acc(rport);
133961ba4394SKrishna Gudipati 
1340a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1341a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
1342a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1343a36c61f9SKrishna Gudipati 		break;
1344a36c61f9SKrishna Gudipati 
1345a36c61f9SKrishna Gudipati 	default:
1346a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1347a36c61f9SKrishna Gudipati 	}
1348a36c61f9SKrishna Gudipati }
1349a36c61f9SKrishna Gudipati 
13505fbe25c7SJing Huang /*
1351a36c61f9SKrishna Gudipati  *		Rport is offline. FC-4s are offline. BFA rport is offline.
1352a36c61f9SKrishna Gudipati  *		Timer active to delete stale rport.
1353a36c61f9SKrishna Gudipati  */
1354a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s * rport,enum rport_event event)1355a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event)
1356a36c61f9SKrishna Gudipati {
1357a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1358a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1359a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1360a36c61f9SKrishna Gudipati 
1361a36c61f9SKrishna Gudipati 	switch (event) {
1362a36c61f9SKrishna Gudipati 	case RPSM_EVENT_TIMEOUT:
1363a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1364a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1365a36c61f9SKrishna Gudipati 		break;
1366a36c61f9SKrishna Gudipati 
1367bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
1368a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1369a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1370bc0e2c2aSKrishna Gudipati 		WARN_ON(!(bfa_fcport_get_topology(rport->port->fcs->bfa) !=
1371bc0e2c2aSKrishna Gudipati 					BFA_PORT_TOPOLOGY_LOOP));
1372bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
1373a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
1374a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
1375a36c61f9SKrishna Gudipati 		break;
1376a36c61f9SKrishna Gudipati 
1377a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
1378a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1379a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1380a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1381a36c61f9SKrishna Gudipati 		break;
1382a36c61f9SKrishna Gudipati 
1383a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
1384a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
1385a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1386a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
1387a36c61f9SKrishna Gudipati 		break;
1388a36c61f9SKrishna Gudipati 
1389a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
1390a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
1391a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
1392bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_OFFLINE:
1393a36c61f9SKrishna Gudipati 		break;
1394a36c61f9SKrishna Gudipati 
1395a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
139661ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1397a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
139861ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
1399a36c61f9SKrishna Gudipati 		break;
1400a36c61f9SKrishna Gudipati 
1401bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_SCN_ONLINE:
1402bc0e2c2aSKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1403bc0e2c2aSKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
1404bc0e2c2aSKrishna Gudipati 		bfa_fcs_rport_send_plogi(rport, NULL);
1405bc0e2c2aSKrishna Gudipati 		break;
1406bc0e2c2aSKrishna Gudipati 
1407a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_SEND:
1408a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1409a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
1410a36c61f9SKrishna Gudipati 		rport->plogi_retries = 0;
1411a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogi(rport, NULL);
1412a36c61f9SKrishna Gudipati 		break;
1413a36c61f9SKrishna Gudipati 
1414a36c61f9SKrishna Gudipati 	default:
1415a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1416a36c61f9SKrishna Gudipati 	}
1417a36c61f9SKrishna Gudipati }
1418a36c61f9SKrishna Gudipati 
14195fbe25c7SJing Huang /*
1420a36c61f9SKrishna Gudipati  *	Rport address has changed. Nameserver discovery request is being sent.
1421a36c61f9SKrishna Gudipati  */
1422a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s * rport,enum rport_event event)1423a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s *rport,
1424a36c61f9SKrishna Gudipati 	 enum rport_event event)
1425a36c61f9SKrishna Gudipati {
1426a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1427a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1428a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1429a36c61f9SKrishna Gudipati 
1430a36c61f9SKrishna Gudipati 	switch (event) {
1431a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FCXP_SENT:
1432a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sent);
1433a36c61f9SKrishna Gudipati 		break;
1434a36c61f9SKrishna Gudipati 
1435a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
1436a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1437a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
1438a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1439a36c61f9SKrishna Gudipati 		break;
1440a36c61f9SKrishna Gudipati 
1441a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
1442a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
1443a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
1444a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
1445a36c61f9SKrishna Gudipati 		break;
1446a36c61f9SKrishna Gudipati 
1447bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
1448a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
1449a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
1450a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_SEND:
1451a36c61f9SKrishna Gudipati 		break;
1452a36c61f9SKrishna Gudipati 
1453a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1454a36c61f9SKrishna Gudipati 		rport->ns_retries = 0; /* reset the retry count */
1455a36c61f9SKrishna Gudipati 		break;
1456a36c61f9SKrishna Gudipati 
1457a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
1458a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
1459a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
1460a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
1461a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
1462a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
1463a36c61f9SKrishna Gudipati 		break;
1464a36c61f9SKrishna Gudipati 
1465a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
146661ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1467a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
146861ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
1469a36c61f9SKrishna Gudipati 		break;
1470a36c61f9SKrishna Gudipati 
1471a36c61f9SKrishna Gudipati 	default:
1472a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1473a36c61f9SKrishna Gudipati 	}
1474a36c61f9SKrishna Gudipati }
1475a36c61f9SKrishna Gudipati 
14765fbe25c7SJing Huang /*
1477a36c61f9SKrishna Gudipati  *		Nameserver discovery failed. Waiting for timeout to retry.
1478a36c61f9SKrishna Gudipati  */
1479a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s * rport,enum rport_event event)1480a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s *rport,
1481a36c61f9SKrishna Gudipati 	 enum rport_event event)
1482a36c61f9SKrishna Gudipati {
1483a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1484a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1485a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1486a36c61f9SKrishna Gudipati 
1487a36c61f9SKrishna Gudipati 	switch (event) {
1488a36c61f9SKrishna Gudipati 	case RPSM_EVENT_TIMEOUT:
1489a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
1490a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
1491a36c61f9SKrishna Gudipati 		break;
1492a36c61f9SKrishna Gudipati 
1493bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
1494a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1495a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_nsdisc_sending);
1496a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1497a36c61f9SKrishna Gudipati 		rport->ns_retries = 0;
1498a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_nsdisc(rport, NULL);
1499a36c61f9SKrishna Gudipati 		break;
1500a36c61f9SKrishna Gudipati 
1501a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
1502a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1503a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1504a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1505a36c61f9SKrishna Gudipati 		break;
1506a36c61f9SKrishna Gudipati 
1507a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
1508a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
1509a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1510a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
1511a36c61f9SKrishna Gudipati 		break;
1512a36c61f9SKrishna Gudipati 
1513a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
1514a36c61f9SKrishna Gudipati 		rport->pid = 0;
1515a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
1516a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
1517a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
1518a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
1519a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
1520a36c61f9SKrishna Gudipati 		break;
1521a36c61f9SKrishna Gudipati 
1522a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
1523a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
1524a36c61f9SKrishna Gudipati 		break;
1525a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
1526a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_prlo_acc(rport);
1527a36c61f9SKrishna Gudipati 		break;
1528a36c61f9SKrishna Gudipati 
1529a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
153061ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1531a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rport->timer);
153261ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
1533a36c61f9SKrishna Gudipati 		break;
1534a36c61f9SKrishna Gudipati 
1535a36c61f9SKrishna Gudipati 	default:
1536a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1537a36c61f9SKrishna Gudipati 	}
1538a36c61f9SKrishna Gudipati }
1539a36c61f9SKrishna Gudipati 
15405fbe25c7SJing Huang /*
1541a36c61f9SKrishna Gudipati  *		Rport address has changed. Nameserver discovery request is sent.
1542a36c61f9SKrishna Gudipati  */
1543a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s * rport,enum rport_event event)1544a36c61f9SKrishna Gudipati bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
1545a36c61f9SKrishna Gudipati 			enum rport_event event)
1546a36c61f9SKrishna Gudipati {
1547a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1548a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1549a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1550a36c61f9SKrishna Gudipati 
1551a36c61f9SKrishna Gudipati 	switch (event) {
1552a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ACCEPTED:
1553a36c61f9SKrishna Gudipati 	case RPSM_EVENT_ADDRESS_CHANGE:
1554a36c61f9SKrishna Gudipati 		if (rport->pid) {
1555a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
1556a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_plogi(rport, NULL);
1557a36c61f9SKrishna Gudipati 		} else {
1558a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport,
1559a36c61f9SKrishna Gudipati 				 bfa_fcs_rport_sm_nsdisc_sending);
1560a36c61f9SKrishna Gudipati 			rport->ns_retries = 0;
1561a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_nsdisc(rport, NULL);
1562a36c61f9SKrishna Gudipati 		}
1563a36c61f9SKrishna Gudipati 		break;
1564a36c61f9SKrishna Gudipati 
1565a36c61f9SKrishna Gudipati 	case RPSM_EVENT_FAILED:
1566a36c61f9SKrishna Gudipati 		rport->ns_retries++;
1567a36c61f9SKrishna Gudipati 		if (rport->ns_retries < BFA_FCS_RPORT_MAX_RETRIES) {
1568a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport,
1569a36c61f9SKrishna Gudipati 				 bfa_fcs_rport_sm_nsdisc_sending);
1570a36c61f9SKrishna Gudipati 			bfa_fcs_rport_send_nsdisc(rport, NULL);
1571a36c61f9SKrishna Gudipati 		} else {
1572ee1a4a42SKrishna Gudipati 			rport->old_pid = rport->pid;
1573a36c61f9SKrishna Gudipati 			rport->pid = 0;
1574a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
1575a36c61f9SKrishna Gudipati 			bfa_timer_start(rport->fcs->bfa, &rport->timer,
1576a36c61f9SKrishna Gudipati 					bfa_fcs_rport_timeout, rport,
1577a36c61f9SKrishna Gudipati 					bfa_fcs_rport_del_timeout);
1578f71ded01SJason Yan 		}
1579a36c61f9SKrishna Gudipati 		break;
1580a36c61f9SKrishna Gudipati 
1581a36c61f9SKrishna Gudipati 	case RPSM_EVENT_DELETE:
1582a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1583a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
1584a36c61f9SKrishna Gudipati 		bfa_fcs_rport_free(rport);
1585a36c61f9SKrishna Gudipati 		break;
1586a36c61f9SKrishna Gudipati 
1587a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
1588a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending);
1589a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
1590a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_plogiacc(rport, NULL);
1591a36c61f9SKrishna Gudipati 		break;
1592a36c61f9SKrishna Gudipati 
1593a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
1594a36c61f9SKrishna Gudipati 		rport->pid = 0;
1595a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
1596a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
1597a36c61f9SKrishna Gudipati 		bfa_timer_start(rport->fcs->bfa, &rport->timer,
1598a36c61f9SKrishna Gudipati 				bfa_fcs_rport_timeout, rport,
1599a36c61f9SKrishna Gudipati 				bfa_fcs_rport_del_timeout);
1600a36c61f9SKrishna Gudipati 		break;
1601a36c61f9SKrishna Gudipati 
1602a36c61f9SKrishna Gudipati 
1603a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PRLO_RCVD:
1604a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_prlo_acc(rport);
1605a36c61f9SKrishna Gudipati 		break;
1606bc0e2c2aSKrishna Gudipati 	case RPSM_EVENT_FAB_SCN:
16075fbe25c7SJing Huang 		/*
1608a36c61f9SKrishna Gudipati 		 * ignore, wait for NS query response
1609a36c61f9SKrishna Gudipati 		 */
1610a36c61f9SKrishna Gudipati 		break;
1611a36c61f9SKrishna Gudipati 
1612a36c61f9SKrishna Gudipati 	case RPSM_EVENT_LOGO_RCVD:
16135fbe25c7SJing Huang 		/*
1614a36c61f9SKrishna Gudipati 		 * Not logged-in yet. Accept LOGO.
1615a36c61f9SKrishna Gudipati 		 */
1616a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_logo_acc(rport);
1617a36c61f9SKrishna Gudipati 		break;
1618a36c61f9SKrishna Gudipati 
1619a36c61f9SKrishna Gudipati 	case RPSM_EVENT_PLOGI_COMP:
162061ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1621a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rport->fcxp);
162261ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_online_action(rport);
1623a36c61f9SKrishna Gudipati 		break;
1624a36c61f9SKrishna Gudipati 
1625a36c61f9SKrishna Gudipati 	default:
1626a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
1627a36c61f9SKrishna Gudipati 	}
1628a36c61f9SKrishna Gudipati }
1629a36c61f9SKrishna Gudipati 
163061ba4394SKrishna Gudipati /*
163161ba4394SKrishna Gudipati  * Rport needs to be deleted
163261ba4394SKrishna Gudipati  * waiting for ITNIM clean up to finish
163361ba4394SKrishna Gudipati  */
163461ba4394SKrishna Gudipati static void
bfa_fcs_rport_sm_fc4_off_delete(struct bfa_fcs_rport_s * rport,enum rport_event event)163561ba4394SKrishna Gudipati bfa_fcs_rport_sm_fc4_off_delete(struct bfa_fcs_rport_s *rport,
163661ba4394SKrishna Gudipati 				enum rport_event event)
163761ba4394SKrishna Gudipati {
163861ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
163961ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
164061ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, event);
1641a36c61f9SKrishna Gudipati 
164261ba4394SKrishna Gudipati 	switch (event) {
164361ba4394SKrishna Gudipati 	case RPSM_EVENT_FC4_OFFLINE:
164461ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_delete_pending);
164561ba4394SKrishna Gudipati 		bfa_fcs_rport_hal_offline(rport);
164661ba4394SKrishna Gudipati 		break;
164761ba4394SKrishna Gudipati 
164861ba4394SKrishna Gudipati 	case RPSM_EVENT_DELETE:
164961ba4394SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
165061ba4394SKrishna Gudipati 		/* Ignore these events */
165161ba4394SKrishna Gudipati 		break;
165261ba4394SKrishna Gudipati 
165361ba4394SKrishna Gudipati 	default:
165461ba4394SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
165561ba4394SKrishna Gudipati 		break;
165661ba4394SKrishna Gudipati 	}
165761ba4394SKrishna Gudipati }
165861ba4394SKrishna Gudipati 
165961ba4394SKrishna Gudipati /*
166061ba4394SKrishna Gudipati  * RPort needs to be deleted
166161ba4394SKrishna Gudipati  * waiting for BFA/FW to finish current processing
166261ba4394SKrishna Gudipati  */
166361ba4394SKrishna Gudipati static void
bfa_fcs_rport_sm_delete_pending(struct bfa_fcs_rport_s * rport,enum rport_event event)166461ba4394SKrishna Gudipati bfa_fcs_rport_sm_delete_pending(struct bfa_fcs_rport_s *rport,
166561ba4394SKrishna Gudipati 				enum rport_event event)
166661ba4394SKrishna Gudipati {
166761ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
166861ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
166961ba4394SKrishna Gudipati 	bfa_trc(rport->fcs, event);
167061ba4394SKrishna Gudipati 
167161ba4394SKrishna Gudipati 	switch (event) {
167261ba4394SKrishna Gudipati 	case RPSM_EVENT_HCB_OFFLINE:
167361ba4394SKrishna Gudipati 		bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
167461ba4394SKrishna Gudipati 		bfa_fcs_rport_free(rport);
167561ba4394SKrishna Gudipati 		break;
167661ba4394SKrishna Gudipati 
167761ba4394SKrishna Gudipati 	case RPSM_EVENT_DELETE:
167861ba4394SKrishna Gudipati 	case RPSM_EVENT_LOGO_IMP:
167961ba4394SKrishna Gudipati 	case RPSM_EVENT_PLOGI_RCVD:
168061ba4394SKrishna Gudipati 		/* Ignore these events */
168161ba4394SKrishna Gudipati 		break;
168261ba4394SKrishna Gudipati 
168361ba4394SKrishna Gudipati 	default:
168461ba4394SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
168561ba4394SKrishna Gudipati 	}
168661ba4394SKrishna Gudipati }
1687a36c61f9SKrishna Gudipati 
16885fbe25c7SJing Huang /*
1689a36c61f9SKrishna Gudipati  *  fcs_rport_private FCS RPORT provate functions
1690a36c61f9SKrishna Gudipati  */
1691a36c61f9SKrishna Gudipati 
1692a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_plogi(void * rport_cbarg,struct bfa_fcxp_s * fcxp_alloced)1693a36c61f9SKrishna Gudipati bfa_fcs_rport_send_plogi(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced)
1694a36c61f9SKrishna Gudipati {
1695a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rport_cbarg;
1696a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
1697a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
1698a36c61f9SKrishna Gudipati 	int		len;
1699a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
1700a36c61f9SKrishna Gudipati 
1701a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1702a36c61f9SKrishna Gudipati 
1703c3f1b123SKrishna Gudipati 	fcxp = fcxp_alloced ? fcxp_alloced :
1704c3f1b123SKrishna Gudipati 	       bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE);
1705a36c61f9SKrishna Gudipati 	if (!fcxp) {
1706a36c61f9SKrishna Gudipati 		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &rport->fcxp_wqe,
1707c3f1b123SKrishna Gudipati 				bfa_fcs_rport_send_plogi, rport, BFA_TRUE);
1708a36c61f9SKrishna Gudipati 		return;
1709a36c61f9SKrishna Gudipati 	}
1710a36c61f9SKrishna Gudipati 	rport->fcxp = fcxp;
1711a36c61f9SKrishna Gudipati 
1712a36c61f9SKrishna Gudipati 	len = fc_plogi_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid,
1713a36c61f9SKrishna Gudipati 				bfa_fcs_lport_get_fcid(port), 0,
1714a36c61f9SKrishna Gudipati 				port->port_cfg.pwwn, port->port_cfg.nwwn,
1715be540a99SKrishna Gudipati 				bfa_fcport_get_maxfrsize(port->fcs->bfa),
1716be540a99SKrishna Gudipati 				bfa_fcport_get_rx_bbcredit(port->fcs->bfa));
1717a36c61f9SKrishna Gudipati 
1718a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
1719a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, bfa_fcs_rport_plogi_response,
1720a36c61f9SKrishna Gudipati 			(void *)rport, FC_MAX_PDUSZ, FC_ELS_TOV);
1721a36c61f9SKrishna Gudipati 
1722a36c61f9SKrishna Gudipati 	rport->stats.plogis++;
1723a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FCXP_SENT);
1724a36c61f9SKrishna Gudipati }
1725a36c61f9SKrishna Gudipati 
1726a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_plogi_response(void * fcsarg,struct bfa_fcxp_s * fcxp,void * cbarg,bfa_status_t req_status,u32 rsp_len,u32 resid_len,struct fchs_s * rsp_fchs)1727a36c61f9SKrishna Gudipati bfa_fcs_rport_plogi_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
1728a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
1729a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs)
1730a36c61f9SKrishna Gudipati {
1731a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
1732a36c61f9SKrishna Gudipati 	struct fc_logi_s	*plogi_rsp;
1733a36c61f9SKrishna Gudipati 	struct fc_ls_rjt_s	*ls_rjt;
1734a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *twin;
1735a36c61f9SKrishna Gudipati 	struct list_head	*qe;
1736a36c61f9SKrishna Gudipati 
1737a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1738a36c61f9SKrishna Gudipati 
1739a36c61f9SKrishna Gudipati 	/*
1740a36c61f9SKrishna Gudipati 	 * Sanity Checks
1741a36c61f9SKrishna Gudipati 	 */
1742a36c61f9SKrishna Gudipati 	if (req_status != BFA_STATUS_OK) {
1743a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, req_status);
1744a36c61f9SKrishna Gudipati 		rport->stats.plogi_failed++;
1745a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
1746a36c61f9SKrishna Gudipati 		return;
1747a36c61f9SKrishna Gudipati 	}
1748a36c61f9SKrishna Gudipati 
1749a36c61f9SKrishna Gudipati 	plogi_rsp = (struct fc_logi_s *) BFA_FCXP_RSP_PLD(fcxp);
1750a36c61f9SKrishna Gudipati 
17515fbe25c7SJing Huang 	/*
1752a36c61f9SKrishna Gudipati 	 * Check for failure first.
1753a36c61f9SKrishna Gudipati 	 */
1754a36c61f9SKrishna Gudipati 	if (plogi_rsp->els_cmd.els_code != FC_ELS_ACC) {
1755a36c61f9SKrishna Gudipati 		ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp);
1756a36c61f9SKrishna Gudipati 
1757a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, ls_rjt->reason_code);
1758a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, ls_rjt->reason_code_expl);
1759a36c61f9SKrishna Gudipati 
1760a36c61f9SKrishna Gudipati 		if ((ls_rjt->reason_code == FC_LS_RJT_RSN_UNABLE_TO_PERF_CMD) &&
1761a36c61f9SKrishna Gudipati 		 (ls_rjt->reason_code_expl == FC_LS_RJT_EXP_INSUFF_RES)) {
1762a36c61f9SKrishna Gudipati 			rport->stats.rjt_insuff_res++;
1763a36c61f9SKrishna Gudipati 			bfa_sm_send_event(rport, RPSM_EVENT_PLOGI_RETRY);
1764a36c61f9SKrishna Gudipati 			return;
1765a36c61f9SKrishna Gudipati 		}
1766a36c61f9SKrishna Gudipati 
1767a36c61f9SKrishna Gudipati 		rport->stats.plogi_rejects++;
1768a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
1769a36c61f9SKrishna Gudipati 		return;
1770a36c61f9SKrishna Gudipati 	}
1771a36c61f9SKrishna Gudipati 
17725fbe25c7SJing Huang 	/*
1773a36c61f9SKrishna Gudipati 	 * PLOGI is complete. Make sure this device is not one of the known
1774a36c61f9SKrishna Gudipati 	 * device with a new FC port address.
1775a36c61f9SKrishna Gudipati 	 */
1776a36c61f9SKrishna Gudipati 	list_for_each(qe, &rport->port->rport_q) {
1777a36c61f9SKrishna Gudipati 		twin = (struct bfa_fcs_rport_s *) qe;
1778a36c61f9SKrishna Gudipati 		if (twin == rport)
1779a36c61f9SKrishna Gudipati 			continue;
1780a36c61f9SKrishna Gudipati 		if (!rport->pwwn && (plogi_rsp->port_name == twin->pwwn)) {
1781a36c61f9SKrishna Gudipati 			bfa_trc(rport->fcs, twin->pid);
1782a36c61f9SKrishna Gudipati 			bfa_trc(rport->fcs, rport->pid);
1783a36c61f9SKrishna Gudipati 
1784a36c61f9SKrishna Gudipati 			/* Update plogi stats in twin */
1785a36c61f9SKrishna Gudipati 			twin->stats.plogis  += rport->stats.plogis;
1786a36c61f9SKrishna Gudipati 			twin->stats.plogi_rejects  +=
1787a36c61f9SKrishna Gudipati 				 rport->stats.plogi_rejects;
1788a36c61f9SKrishna Gudipati 			twin->stats.plogi_timeouts  +=
1789a36c61f9SKrishna Gudipati 				 rport->stats.plogi_timeouts;
1790a36c61f9SKrishna Gudipati 			twin->stats.plogi_failed +=
1791a36c61f9SKrishna Gudipati 				 rport->stats.plogi_failed;
1792a36c61f9SKrishna Gudipati 			twin->stats.plogi_rcvd	  += rport->stats.plogi_rcvd;
1793a36c61f9SKrishna Gudipati 			twin->stats.plogi_accs++;
1794a36c61f9SKrishna Gudipati 
1795f7f73812SMaggie Zhang 			bfa_sm_send_event(rport, RPSM_EVENT_DELETE);
1796a36c61f9SKrishna Gudipati 
1797a36c61f9SKrishna Gudipati 			bfa_fcs_rport_update(twin, plogi_rsp);
1798a36c61f9SKrishna Gudipati 			twin->pid = rsp_fchs->s_id;
1799a36c61f9SKrishna Gudipati 			bfa_sm_send_event(twin, RPSM_EVENT_PLOGI_COMP);
1800a36c61f9SKrishna Gudipati 			return;
1801a36c61f9SKrishna Gudipati 		}
1802a36c61f9SKrishna Gudipati 	}
1803a36c61f9SKrishna Gudipati 
18045fbe25c7SJing Huang 	/*
1805a36c61f9SKrishna Gudipati 	 * Normal login path -- no evil twins.
1806a36c61f9SKrishna Gudipati 	 */
1807a36c61f9SKrishna Gudipati 	rport->stats.plogi_accs++;
1808a36c61f9SKrishna Gudipati 	bfa_fcs_rport_update(rport, plogi_rsp);
1809a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_ACCEPTED);
1810a36c61f9SKrishna Gudipati }
1811a36c61f9SKrishna Gudipati 
1812a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_plogiacc(void * rport_cbarg,struct bfa_fcxp_s * fcxp_alloced)1813a36c61f9SKrishna Gudipati bfa_fcs_rport_send_plogiacc(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced)
1814a36c61f9SKrishna Gudipati {
1815a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rport_cbarg;
1816a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
1817a36c61f9SKrishna Gudipati 	struct fchs_s		fchs;
1818a36c61f9SKrishna Gudipati 	int		len;
1819a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
1820a36c61f9SKrishna Gudipati 
1821a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1822a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->reply_oxid);
1823a36c61f9SKrishna Gudipati 
1824c3f1b123SKrishna Gudipati 	fcxp = fcxp_alloced ? fcxp_alloced :
1825c3f1b123SKrishna Gudipati 	       bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
1826a36c61f9SKrishna Gudipati 	if (!fcxp) {
1827a36c61f9SKrishna Gudipati 		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &rport->fcxp_wqe,
1828c3f1b123SKrishna Gudipati 				bfa_fcs_rport_send_plogiacc, rport, BFA_FALSE);
1829a36c61f9SKrishna Gudipati 		return;
1830a36c61f9SKrishna Gudipati 	}
1831a36c61f9SKrishna Gudipati 	rport->fcxp = fcxp;
1832a36c61f9SKrishna Gudipati 
1833a36c61f9SKrishna Gudipati 	len = fc_plogi_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
1834a36c61f9SKrishna Gudipati 				 rport->pid, bfa_fcs_lport_get_fcid(port),
1835a36c61f9SKrishna Gudipati 				 rport->reply_oxid, port->port_cfg.pwwn,
1836a36c61f9SKrishna Gudipati 				 port->port_cfg.nwwn,
1837be540a99SKrishna Gudipati 				 bfa_fcport_get_maxfrsize(port->fcs->bfa),
1838be540a99SKrishna Gudipati 				 bfa_fcport_get_rx_bbcredit(port->fcs->bfa));
1839a36c61f9SKrishna Gudipati 
1840a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
1841a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0);
1842a36c61f9SKrishna Gudipati 
1843a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FCXP_SENT);
1844a36c61f9SKrishna Gudipati }
1845a36c61f9SKrishna Gudipati 
1846a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_adisc(void * rport_cbarg,struct bfa_fcxp_s * fcxp_alloced)1847a36c61f9SKrishna Gudipati bfa_fcs_rport_send_adisc(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced)
1848a36c61f9SKrishna Gudipati {
1849a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rport_cbarg;
1850a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
1851a36c61f9SKrishna Gudipati 	struct fchs_s		fchs;
1852a36c61f9SKrishna Gudipati 	int		len;
1853a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
1854a36c61f9SKrishna Gudipati 
1855a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1856a36c61f9SKrishna Gudipati 
1857c3f1b123SKrishna Gudipati 	fcxp = fcxp_alloced ? fcxp_alloced :
1858c3f1b123SKrishna Gudipati 	       bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE);
1859a36c61f9SKrishna Gudipati 	if (!fcxp) {
1860a36c61f9SKrishna Gudipati 		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &rport->fcxp_wqe,
1861c3f1b123SKrishna Gudipati 				bfa_fcs_rport_send_adisc, rport, BFA_TRUE);
1862a36c61f9SKrishna Gudipati 		return;
1863a36c61f9SKrishna Gudipati 	}
1864a36c61f9SKrishna Gudipati 	rport->fcxp = fcxp;
1865a36c61f9SKrishna Gudipati 
1866a36c61f9SKrishna Gudipati 	len = fc_adisc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid,
1867a36c61f9SKrishna Gudipati 				bfa_fcs_lport_get_fcid(port), 0,
1868a36c61f9SKrishna Gudipati 				port->port_cfg.pwwn, port->port_cfg.nwwn);
1869a36c61f9SKrishna Gudipati 
1870a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
1871a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, bfa_fcs_rport_adisc_response,
1872a36c61f9SKrishna Gudipati 			rport, FC_MAX_PDUSZ, FC_ELS_TOV);
1873a36c61f9SKrishna Gudipati 
1874a36c61f9SKrishna Gudipati 	rport->stats.adisc_sent++;
1875a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FCXP_SENT);
1876a36c61f9SKrishna Gudipati }
1877a36c61f9SKrishna Gudipati 
1878a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_adisc_response(void * fcsarg,struct bfa_fcxp_s * fcxp,void * cbarg,bfa_status_t req_status,u32 rsp_len,u32 resid_len,struct fchs_s * rsp_fchs)1879a36c61f9SKrishna Gudipati bfa_fcs_rport_adisc_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
1880a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
1881a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs)
1882a36c61f9SKrishna Gudipati {
1883a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
1884a36c61f9SKrishna Gudipati 	void		*pld = bfa_fcxp_get_rspbuf(fcxp);
1885a36c61f9SKrishna Gudipati 	struct fc_ls_rjt_s	*ls_rjt;
1886a36c61f9SKrishna Gudipati 
1887a36c61f9SKrishna Gudipati 	if (req_status != BFA_STATUS_OK) {
1888a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, req_status);
1889a36c61f9SKrishna Gudipati 		rport->stats.adisc_failed++;
1890a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
1891a36c61f9SKrishna Gudipati 		return;
1892a36c61f9SKrishna Gudipati 	}
1893a36c61f9SKrishna Gudipati 
1894a36c61f9SKrishna Gudipati 	if (fc_adisc_rsp_parse((struct fc_adisc_s *)pld, rsp_len, rport->pwwn,
1895a36c61f9SKrishna Gudipati 				rport->nwwn)  == FC_PARSE_OK) {
1896a36c61f9SKrishna Gudipati 		rport->stats.adisc_accs++;
1897a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_ACCEPTED);
1898a36c61f9SKrishna Gudipati 		return;
1899a36c61f9SKrishna Gudipati 	}
1900a36c61f9SKrishna Gudipati 
1901a36c61f9SKrishna Gudipati 	rport->stats.adisc_rejects++;
1902a36c61f9SKrishna Gudipati 	ls_rjt = pld;
1903a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, ls_rjt->els_cmd.els_code);
1904a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, ls_rjt->reason_code);
1905a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, ls_rjt->reason_code_expl);
1906a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
1907a36c61f9SKrishna Gudipati }
1908a36c61f9SKrishna Gudipati 
1909a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_nsdisc(void * rport_cbarg,struct bfa_fcxp_s * fcxp_alloced)1910a36c61f9SKrishna Gudipati bfa_fcs_rport_send_nsdisc(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced)
1911a36c61f9SKrishna Gudipati {
1912a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rport_cbarg;
1913a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
1914a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
1915a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
1916a36c61f9SKrishna Gudipati 	int		len;
1917a36c61f9SKrishna Gudipati 	bfa_cb_fcxp_send_t cbfn;
1918a36c61f9SKrishna Gudipati 
1919a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
1920a36c61f9SKrishna Gudipati 
1921c3f1b123SKrishna Gudipati 	fcxp = fcxp_alloced ? fcxp_alloced :
1922c3f1b123SKrishna Gudipati 	       bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE);
1923a36c61f9SKrishna Gudipati 	if (!fcxp) {
1924a36c61f9SKrishna Gudipati 		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &rport->fcxp_wqe,
1925c3f1b123SKrishna Gudipati 				bfa_fcs_rport_send_nsdisc, rport, BFA_TRUE);
1926a36c61f9SKrishna Gudipati 		return;
1927a36c61f9SKrishna Gudipati 	}
1928a36c61f9SKrishna Gudipati 	rport->fcxp = fcxp;
1929a36c61f9SKrishna Gudipati 
1930a36c61f9SKrishna Gudipati 	if (rport->pwwn) {
1931a36c61f9SKrishna Gudipati 		len = fc_gidpn_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
1932a36c61f9SKrishna Gudipati 				bfa_fcs_lport_get_fcid(port), 0, rport->pwwn);
1933a36c61f9SKrishna Gudipati 		cbfn = bfa_fcs_rport_gidpn_response;
1934a36c61f9SKrishna Gudipati 	} else {
1935a36c61f9SKrishna Gudipati 		len = fc_gpnid_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
1936a36c61f9SKrishna Gudipati 				bfa_fcs_lport_get_fcid(port), 0, rport->pid);
1937a36c61f9SKrishna Gudipati 		cbfn = bfa_fcs_rport_gpnid_response;
1938a36c61f9SKrishna Gudipati 	}
1939a36c61f9SKrishna Gudipati 
1940a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
1941a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, cbfn,
1942a36c61f9SKrishna Gudipati 			(void *)rport, FC_MAX_PDUSZ, FC_FCCT_TOV);
1943a36c61f9SKrishna Gudipati 
1944a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FCXP_SENT);
1945a36c61f9SKrishna Gudipati }
1946a36c61f9SKrishna Gudipati 
1947a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_gidpn_response(void * fcsarg,struct bfa_fcxp_s * fcxp,void * cbarg,bfa_status_t req_status,u32 rsp_len,u32 resid_len,struct fchs_s * rsp_fchs)1948a36c61f9SKrishna Gudipati bfa_fcs_rport_gidpn_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
1949a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
1950a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs)
1951a36c61f9SKrishna Gudipati {
1952a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
1953a36c61f9SKrishna Gudipati 	struct ct_hdr_s	*cthdr;
1954a36c61f9SKrishna Gudipati 	struct fcgs_gidpn_resp_s	*gidpn_rsp;
1955a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s	*twin;
1956a36c61f9SKrishna Gudipati 	struct list_head	*qe;
1957a36c61f9SKrishna Gudipati 
1958a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
1959a36c61f9SKrishna Gudipati 
1960a36c61f9SKrishna Gudipati 	cthdr = (struct ct_hdr_s *) BFA_FCXP_RSP_PLD(fcxp);
1961ba816ea8SJing Huang 	cthdr->cmd_rsp_code = be16_to_cpu(cthdr->cmd_rsp_code);
1962a36c61f9SKrishna Gudipati 
1963a36c61f9SKrishna Gudipati 	if (cthdr->cmd_rsp_code == CT_RSP_ACCEPT) {
1964a36c61f9SKrishna Gudipati 		/* Check if the pid is the same as before. */
1965a36c61f9SKrishna Gudipati 		gidpn_rsp = (struct fcgs_gidpn_resp_s *) (cthdr + 1);
1966a36c61f9SKrishna Gudipati 
1967a36c61f9SKrishna Gudipati 		if (gidpn_rsp->dap == rport->pid) {
1968a36c61f9SKrishna Gudipati 			/* Device is online  */
1969a36c61f9SKrishna Gudipati 			bfa_sm_send_event(rport, RPSM_EVENT_ACCEPTED);
1970a36c61f9SKrishna Gudipati 		} else {
1971a36c61f9SKrishna Gudipati 			/*
1972a36c61f9SKrishna Gudipati 			 * Device's PID has changed. We need to cleanup
1973a36c61f9SKrishna Gudipati 			 * and re-login. If there is another device with
1974a36c61f9SKrishna Gudipati 			 * the the newly discovered pid, send an scn notice
1975a36c61f9SKrishna Gudipati 			 * so that its new pid can be discovered.
1976a36c61f9SKrishna Gudipati 			 */
1977a36c61f9SKrishna Gudipati 			list_for_each(qe, &rport->port->rport_q) {
1978a36c61f9SKrishna Gudipati 				twin = (struct bfa_fcs_rport_s *) qe;
1979a36c61f9SKrishna Gudipati 				if (twin == rport)
1980a36c61f9SKrishna Gudipati 					continue;
1981a36c61f9SKrishna Gudipati 				if (gidpn_rsp->dap == twin->pid) {
1982a36c61f9SKrishna Gudipati 					bfa_trc(rport->fcs, twin->pid);
1983a36c61f9SKrishna Gudipati 					bfa_trc(rport->fcs, rport->pid);
1984a36c61f9SKrishna Gudipati 
1985a36c61f9SKrishna Gudipati 					twin->pid = 0;
1986a36c61f9SKrishna Gudipati 					bfa_sm_send_event(twin,
1987a36c61f9SKrishna Gudipati 					 RPSM_EVENT_ADDRESS_CHANGE);
1988a36c61f9SKrishna Gudipati 				}
1989a36c61f9SKrishna Gudipati 			}
1990a36c61f9SKrishna Gudipati 			rport->pid = gidpn_rsp->dap;
1991a36c61f9SKrishna Gudipati 			bfa_sm_send_event(rport, RPSM_EVENT_ADDRESS_CHANGE);
1992a36c61f9SKrishna Gudipati 		}
1993a36c61f9SKrishna Gudipati 		return;
1994a36c61f9SKrishna Gudipati 	}
1995a36c61f9SKrishna Gudipati 
1996a36c61f9SKrishna Gudipati 	/*
1997a36c61f9SKrishna Gudipati 	 * Reject Response
1998a36c61f9SKrishna Gudipati 	 */
1999a36c61f9SKrishna Gudipati 	switch (cthdr->reason_code) {
2000a36c61f9SKrishna Gudipati 	case CT_RSN_LOGICAL_BUSY:
2001a36c61f9SKrishna Gudipati 		/*
2002a36c61f9SKrishna Gudipati 		 * Need to retry
2003a36c61f9SKrishna Gudipati 		 */
2004a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_TIMEOUT);
2005a36c61f9SKrishna Gudipati 		break;
2006a36c61f9SKrishna Gudipati 
2007a36c61f9SKrishna Gudipati 	case CT_RSN_UNABLE_TO_PERF:
2008a36c61f9SKrishna Gudipati 		/*
2009a36c61f9SKrishna Gudipati 		 * device doesn't exist : Start timer to cleanup this later.
2010a36c61f9SKrishna Gudipati 		 */
2011a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
2012a36c61f9SKrishna Gudipati 		break;
2013a36c61f9SKrishna Gudipati 
2014a36c61f9SKrishna Gudipati 	default:
2015a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
2016a36c61f9SKrishna Gudipati 		break;
2017a36c61f9SKrishna Gudipati 	}
2018a36c61f9SKrishna Gudipati }
2019a36c61f9SKrishna Gudipati 
2020a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_gpnid_response(void * fcsarg,struct bfa_fcxp_s * fcxp,void * cbarg,bfa_status_t req_status,u32 rsp_len,u32 resid_len,struct fchs_s * rsp_fchs)2021a36c61f9SKrishna Gudipati bfa_fcs_rport_gpnid_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
2022a36c61f9SKrishna Gudipati 				bfa_status_t req_status, u32 rsp_len,
2023a36c61f9SKrishna Gudipati 				u32 resid_len, struct fchs_s *rsp_fchs)
2024a36c61f9SKrishna Gudipati {
2025a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
2026a36c61f9SKrishna Gudipati 	struct ct_hdr_s	*cthdr;
2027a36c61f9SKrishna Gudipati 
2028a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
2029a36c61f9SKrishna Gudipati 
2030a36c61f9SKrishna Gudipati 	cthdr = (struct ct_hdr_s *) BFA_FCXP_RSP_PLD(fcxp);
2031ba816ea8SJing Huang 	cthdr->cmd_rsp_code = be16_to_cpu(cthdr->cmd_rsp_code);
2032a36c61f9SKrishna Gudipati 
2033a36c61f9SKrishna Gudipati 	if (cthdr->cmd_rsp_code == CT_RSP_ACCEPT) {
2034a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_ACCEPTED);
2035a36c61f9SKrishna Gudipati 		return;
2036a36c61f9SKrishna Gudipati 	}
2037a36c61f9SKrishna Gudipati 
2038a36c61f9SKrishna Gudipati 	/*
2039a36c61f9SKrishna Gudipati 	 * Reject Response
2040a36c61f9SKrishna Gudipati 	 */
2041a36c61f9SKrishna Gudipati 	switch (cthdr->reason_code) {
2042a36c61f9SKrishna Gudipati 	case CT_RSN_LOGICAL_BUSY:
2043a36c61f9SKrishna Gudipati 		/*
2044a36c61f9SKrishna Gudipati 		 * Need to retry
2045a36c61f9SKrishna Gudipati 		 */
2046a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_TIMEOUT);
2047a36c61f9SKrishna Gudipati 		break;
2048a36c61f9SKrishna Gudipati 
2049a36c61f9SKrishna Gudipati 	case CT_RSN_UNABLE_TO_PERF:
2050a36c61f9SKrishna Gudipati 		/*
2051a36c61f9SKrishna Gudipati 		 * device doesn't exist : Start timer to cleanup this later.
2052a36c61f9SKrishna Gudipati 		 */
2053a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
2054a36c61f9SKrishna Gudipati 		break;
2055a36c61f9SKrishna Gudipati 
2056a36c61f9SKrishna Gudipati 	default:
2057a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rport, RPSM_EVENT_FAILED);
2058a36c61f9SKrishna Gudipati 		break;
2059a36c61f9SKrishna Gudipati 	}
2060a36c61f9SKrishna Gudipati }
2061a36c61f9SKrishna Gudipati 
20625fbe25c7SJing Huang /*
2063a36c61f9SKrishna Gudipati  *	Called to send a logout to the rport.
2064a36c61f9SKrishna Gudipati  */
2065a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_logo(void * rport_cbarg,struct bfa_fcxp_s * fcxp_alloced)2066a36c61f9SKrishna Gudipati bfa_fcs_rport_send_logo(void *rport_cbarg, struct bfa_fcxp_s *fcxp_alloced)
2067a36c61f9SKrishna Gudipati {
2068a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rport_cbarg;
2069a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port;
2070a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2071a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2072a36c61f9SKrishna Gudipati 	u16	len;
2073a36c61f9SKrishna Gudipati 
2074a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
2075a36c61f9SKrishna Gudipati 
2076a36c61f9SKrishna Gudipati 	port = rport->port;
2077a36c61f9SKrishna Gudipati 
2078c3f1b123SKrishna Gudipati 	fcxp = fcxp_alloced ? fcxp_alloced :
2079c3f1b123SKrishna Gudipati 	       bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
2080a36c61f9SKrishna Gudipati 	if (!fcxp) {
2081a36c61f9SKrishna Gudipati 		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &rport->fcxp_wqe,
2082c3f1b123SKrishna Gudipati 				bfa_fcs_rport_send_logo, rport, BFA_FALSE);
2083a36c61f9SKrishna Gudipati 		return;
2084a36c61f9SKrishna Gudipati 	}
2085a36c61f9SKrishna Gudipati 	rport->fcxp = fcxp;
2086a36c61f9SKrishna Gudipati 
2087a36c61f9SKrishna Gudipati 	len = fc_logo_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid,
2088a36c61f9SKrishna Gudipati 				bfa_fcs_lport_get_fcid(port), 0,
2089a36c61f9SKrishna Gudipati 				bfa_fcs_lport_get_pwwn(port));
2090a36c61f9SKrishna Gudipati 
2091a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
2092a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, NULL,
2093a36c61f9SKrishna Gudipati 			rport, FC_MAX_PDUSZ, FC_ELS_TOV);
2094a36c61f9SKrishna Gudipati 
2095a36c61f9SKrishna Gudipati 	rport->stats.logos++;
2096a36c61f9SKrishna Gudipati 	bfa_fcxp_discard(rport->fcxp);
2097a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FCXP_SENT);
2098a36c61f9SKrishna Gudipati }
2099a36c61f9SKrishna Gudipati 
21005fbe25c7SJing Huang /*
2101a36c61f9SKrishna Gudipati  *	Send ACC for a LOGO received.
2102a36c61f9SKrishna Gudipati  */
2103a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_logo_acc(void * rport_cbarg)2104a36c61f9SKrishna Gudipati bfa_fcs_rport_send_logo_acc(void *rport_cbarg)
2105a36c61f9SKrishna Gudipati {
2106a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rport_cbarg;
2107a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port;
2108a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2109a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2110a36c61f9SKrishna Gudipati 	u16	len;
2111a36c61f9SKrishna Gudipati 
2112a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
2113a36c61f9SKrishna Gudipati 
2114a36c61f9SKrishna Gudipati 	port = rport->port;
2115a36c61f9SKrishna Gudipati 
2116c3f1b123SKrishna Gudipati 	fcxp = bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
2117a36c61f9SKrishna Gudipati 	if (!fcxp)
2118a36c61f9SKrishna Gudipati 		return;
2119a36c61f9SKrishna Gudipati 
2120a36c61f9SKrishna Gudipati 	rport->stats.logo_rcvd++;
2121a36c61f9SKrishna Gudipati 	len = fc_logo_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
2122a36c61f9SKrishna Gudipati 				rport->pid, bfa_fcs_lport_get_fcid(port),
2123a36c61f9SKrishna Gudipati 				rport->reply_oxid);
2124a36c61f9SKrishna Gudipati 
2125a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
2126a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0);
2127a36c61f9SKrishna Gudipati }
2128a36c61f9SKrishna Gudipati 
21295fbe25c7SJing Huang /*
2130a36c61f9SKrishna Gudipati  *	brief
2131a36c61f9SKrishna Gudipati  *	This routine will be called by bfa_timer on timer timeouts.
2132a36c61f9SKrishna Gudipati  *
2133a36c61f9SKrishna Gudipati  *	param[in]	rport			- pointer to bfa_fcs_lport_ns_t.
2134a36c61f9SKrishna Gudipati  *	param[out]	rport_status	- pointer to return vport status in
2135a36c61f9SKrishna Gudipati  *
2136a36c61f9SKrishna Gudipati  *	return
2137a36c61f9SKrishna Gudipati  *		void
2138a36c61f9SKrishna Gudipati  *
2139a36c61f9SKrishna Gudipati  *	Special Considerations:
2140a36c61f9SKrishna Gudipati  *
2141a36c61f9SKrishna Gudipati  *	note
2142a36c61f9SKrishna Gudipati  */
2143a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_timeout(void * arg)2144a36c61f9SKrishna Gudipati bfa_fcs_rport_timeout(void *arg)
2145a36c61f9SKrishna Gudipati {
2146a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) arg;
2147a36c61f9SKrishna Gudipati 
2148a36c61f9SKrishna Gudipati 	rport->stats.plogi_timeouts++;
2149a36c61f9SKrishna Gudipati 	bfa_stats(rport->port, rport_plogi_timeouts);
2150a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_TIMEOUT);
2151a36c61f9SKrishna Gudipati }
2152a36c61f9SKrishna Gudipati 
2153a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_process_prli(struct bfa_fcs_rport_s * rport,struct fchs_s * rx_fchs,u16 len)2154a36c61f9SKrishna Gudipati bfa_fcs_rport_process_prli(struct bfa_fcs_rport_s *rport,
2155a36c61f9SKrishna Gudipati 			struct fchs_s *rx_fchs, u16 len)
2156a36c61f9SKrishna Gudipati {
2157a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2158a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2159a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2160a36c61f9SKrishna Gudipati 	struct fc_prli_s	*prli;
2161a36c61f9SKrishna Gudipati 
2162a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rx_fchs->s_id);
2163a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rx_fchs->d_id);
2164a36c61f9SKrishna Gudipati 
2165a36c61f9SKrishna Gudipati 	rport->stats.prli_rcvd++;
2166a36c61f9SKrishna Gudipati 
2167a36c61f9SKrishna Gudipati 	/*
2168a36c61f9SKrishna Gudipati 	 * We are in Initiator Mode
2169a36c61f9SKrishna Gudipati 	 */
2170a36c61f9SKrishna Gudipati 	prli = (struct fc_prli_s *) (rx_fchs + 1);
2171a36c61f9SKrishna Gudipati 
2172a36c61f9SKrishna Gudipati 	if (prli->parampage.servparams.target) {
2173a36c61f9SKrishna Gudipati 		/*
2174a36c61f9SKrishna Gudipati 		 * PRLI from a target ?
2175a36c61f9SKrishna Gudipati 		 * Send the Acc.
2176a36c61f9SKrishna Gudipati 		 * PRLI sent by us will be used to transition the IT nexus,
2177a36c61f9SKrishna Gudipati 		 * once the response is received from the target.
2178a36c61f9SKrishna Gudipati 		 */
2179a36c61f9SKrishna Gudipati 		bfa_trc(port->fcs, rx_fchs->s_id);
2180a36c61f9SKrishna Gudipati 		rport->scsi_function = BFA_RPORT_TARGET;
2181a36c61f9SKrishna Gudipati 	} else {
2182a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, prli->parampage.type);
2183a36c61f9SKrishna Gudipati 		rport->scsi_function = BFA_RPORT_INITIATOR;
2184a36c61f9SKrishna Gudipati 		bfa_fcs_itnim_is_initiator(rport->itnim);
2185a36c61f9SKrishna Gudipati 	}
2186a36c61f9SKrishna Gudipati 
2187c3f1b123SKrishna Gudipati 	fcxp = bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
2188a36c61f9SKrishna Gudipati 	if (!fcxp)
2189a36c61f9SKrishna Gudipati 		return;
2190a36c61f9SKrishna Gudipati 
2191a36c61f9SKrishna Gudipati 	len = fc_prli_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
2192a36c61f9SKrishna Gudipati 				rx_fchs->s_id, bfa_fcs_lport_get_fcid(port),
2193a36c61f9SKrishna Gudipati 				rx_fchs->ox_id, port->port_cfg.roles);
2194a36c61f9SKrishna Gudipati 
2195a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
2196a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0);
2197a36c61f9SKrishna Gudipati }
2198a36c61f9SKrishna Gudipati 
2199a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_process_rpsc(struct bfa_fcs_rport_s * rport,struct fchs_s * rx_fchs,u16 len)2200a36c61f9SKrishna Gudipati bfa_fcs_rport_process_rpsc(struct bfa_fcs_rport_s *rport,
2201a36c61f9SKrishna Gudipati 			struct fchs_s *rx_fchs, u16 len)
2202a36c61f9SKrishna Gudipati {
2203a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2204a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2205a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2206a36c61f9SKrishna Gudipati 	struct fc_rpsc_speed_info_s speeds;
2207a36c61f9SKrishna Gudipati 	struct bfa_port_attr_s pport_attr;
2208a36c61f9SKrishna Gudipati 
2209a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rx_fchs->s_id);
2210a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rx_fchs->d_id);
2211a36c61f9SKrishna Gudipati 
2212a36c61f9SKrishna Gudipati 	rport->stats.rpsc_rcvd++;
2213a36c61f9SKrishna Gudipati 	speeds.port_speed_cap =
2214a36c61f9SKrishna Gudipati 		RPSC_SPEED_CAP_1G | RPSC_SPEED_CAP_2G | RPSC_SPEED_CAP_4G |
2215a36c61f9SKrishna Gudipati 		RPSC_SPEED_CAP_8G;
2216a36c61f9SKrishna Gudipati 
2217a36c61f9SKrishna Gudipati 	/*
2218a36c61f9SKrishna Gudipati 	 * get curent speed from pport attributes from BFA
2219a36c61f9SKrishna Gudipati 	 */
2220a36c61f9SKrishna Gudipati 	bfa_fcport_get_attr(port->fcs->bfa, &pport_attr);
2221a36c61f9SKrishna Gudipati 
2222a36c61f9SKrishna Gudipati 	speeds.port_op_speed = fc_bfa_speed_to_rpsc_operspeed(pport_attr.speed);
2223a36c61f9SKrishna Gudipati 
2224c3f1b123SKrishna Gudipati 	fcxp = bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
2225a36c61f9SKrishna Gudipati 	if (!fcxp)
2226a36c61f9SKrishna Gudipati 		return;
2227a36c61f9SKrishna Gudipati 
2228a36c61f9SKrishna Gudipati 	len = fc_rpsc_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
2229a36c61f9SKrishna Gudipati 				rx_fchs->s_id, bfa_fcs_lport_get_fcid(port),
2230a36c61f9SKrishna Gudipati 				rx_fchs->ox_id, &speeds);
2231a36c61f9SKrishna Gudipati 
2232a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
2233a36c61f9SKrishna Gudipati 			FC_CLASS_3, len, &fchs, NULL, NULL, FC_MAX_PDUSZ, 0);
2234a36c61f9SKrishna Gudipati }
2235a36c61f9SKrishna Gudipati 
2236a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s * rport,struct fchs_s * rx_fchs,u16 len)2237a36c61f9SKrishna Gudipati bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s *rport,
2238a36c61f9SKrishna Gudipati 			struct fchs_s *rx_fchs, u16 len)
2239a36c61f9SKrishna Gudipati {
2240a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2241a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2242a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2243a36c61f9SKrishna Gudipati 
2244a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rx_fchs->s_id);
2245a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rx_fchs->d_id);
2246a36c61f9SKrishna Gudipati 
2247a36c61f9SKrishna Gudipati 	rport->stats.adisc_rcvd++;
2248a36c61f9SKrishna Gudipati 
2249a36c61f9SKrishna Gudipati 	/*
2250a36c61f9SKrishna Gudipati 	 * Accept if the itnim for this rport is online.
2251a36c61f9SKrishna Gudipati 	 * Else reject the ADISC.
2252a36c61f9SKrishna Gudipati 	 */
2253a36c61f9SKrishna Gudipati 	if (bfa_fcs_itnim_get_online_state(rport->itnim) == BFA_STATUS_OK) {
2254a36c61f9SKrishna Gudipati 
2255c3f1b123SKrishna Gudipati 		fcxp = bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
2256a36c61f9SKrishna Gudipati 		if (!fcxp)
2257a36c61f9SKrishna Gudipati 			return;
2258a36c61f9SKrishna Gudipati 
2259a36c61f9SKrishna Gudipati 		len = fc_adisc_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
2260a36c61f9SKrishna Gudipati 			 rx_fchs->s_id, bfa_fcs_lport_get_fcid(port),
2261a36c61f9SKrishna Gudipati 			 rx_fchs->ox_id, port->port_cfg.pwwn,
2262a36c61f9SKrishna Gudipati 			 port->port_cfg.nwwn);
2263a36c61f9SKrishna Gudipati 
2264a36c61f9SKrishna Gudipati 		bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag,
2265a36c61f9SKrishna Gudipati 				BFA_FALSE, FC_CLASS_3, len, &fchs, NULL, NULL,
2266a36c61f9SKrishna Gudipati 				FC_MAX_PDUSZ, 0);
2267a36c61f9SKrishna Gudipati 	} else {
2268a36c61f9SKrishna Gudipati 		rport->stats.adisc_rejected++;
2269a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_ls_rjt(rport, rx_fchs,
2270a36c61f9SKrishna Gudipati 					  FC_LS_RJT_RSN_UNABLE_TO_PERF_CMD,
2271a36c61f9SKrishna Gudipati 					  FC_LS_RJT_EXP_LOGIN_REQUIRED);
2272a36c61f9SKrishna Gudipati 	}
2273a36c61f9SKrishna Gudipati }
2274a36c61f9SKrishna Gudipati 
2275a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s * rport)2276a36c61f9SKrishna Gudipati bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport)
2277a36c61f9SKrishna Gudipati {
2278a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2279a36c61f9SKrishna Gudipati 	struct bfa_rport_info_s rport_info;
2280a36c61f9SKrishna Gudipati 
2281a36c61f9SKrishna Gudipati 	rport_info.pid = rport->pid;
2282a36c61f9SKrishna Gudipati 	rport_info.local_pid = port->pid;
2283a36c61f9SKrishna Gudipati 	rport_info.lp_tag = port->lp_tag;
2284a36c61f9SKrishna Gudipati 	rport_info.vf_id = port->fabric->vf_id;
2285a36c61f9SKrishna Gudipati 	rport_info.vf_en = port->fabric->is_vf;
2286a36c61f9SKrishna Gudipati 	rport_info.fc_class = rport->fc_cos;
2287a36c61f9SKrishna Gudipati 	rport_info.cisc = rport->cisc;
2288a36c61f9SKrishna Gudipati 	rport_info.max_frmsz = rport->maxfrsize;
2289a36c61f9SKrishna Gudipati 	bfa_rport_online(rport->bfa_rport, &rport_info);
2290a36c61f9SKrishna Gudipati }
2291a36c61f9SKrishna Gudipati 
229261ba4394SKrishna Gudipati static void
bfa_fcs_rport_hal_offline(struct bfa_fcs_rport_s * rport)229361ba4394SKrishna Gudipati bfa_fcs_rport_hal_offline(struct bfa_fcs_rport_s *rport)
229461ba4394SKrishna Gudipati {
229561ba4394SKrishna Gudipati 	if (rport->bfa_rport)
229661ba4394SKrishna Gudipati 		bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE);
229761ba4394SKrishna Gudipati 	else
229861ba4394SKrishna Gudipati 		bfa_cb_rport_offline(rport);
229961ba4394SKrishna Gudipati }
230061ba4394SKrishna Gudipati 
2301a36c61f9SKrishna Gudipati static struct bfa_fcs_rport_s *
bfa_fcs_rport_alloc(struct bfa_fcs_lport_s * port,wwn_t pwwn,u32 rpid)2302a36c61f9SKrishna Gudipati bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid)
2303a36c61f9SKrishna Gudipati {
2304a36c61f9SKrishna Gudipati 	struct bfa_fcs_s	*fcs = port->fcs;
2305a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
2306a36c61f9SKrishna Gudipati 	struct bfad_rport_s	*rport_drv;
2307a36c61f9SKrishna Gudipati 
23085fbe25c7SJing Huang 	/*
2309a36c61f9SKrishna Gudipati 	 * allocate rport
2310a36c61f9SKrishna Gudipati 	 */
231161ba4394SKrishna Gudipati 	if (fcs->num_rport_logins >= bfa_fcs_rport_max_logins) {
231261ba4394SKrishna Gudipati 		bfa_trc(fcs, rpid);
231361ba4394SKrishna Gudipati 		return NULL;
231461ba4394SKrishna Gudipati 	}
231561ba4394SKrishna Gudipati 
2316a36c61f9SKrishna Gudipati 	if (bfa_fcb_rport_alloc(fcs->bfad, &rport, &rport_drv)
2317a36c61f9SKrishna Gudipati 		!= BFA_STATUS_OK) {
2318a36c61f9SKrishna Gudipati 		bfa_trc(fcs, rpid);
2319a36c61f9SKrishna Gudipati 		return NULL;
2320a36c61f9SKrishna Gudipati 	}
2321a36c61f9SKrishna Gudipati 
2322a36c61f9SKrishna Gudipati 	/*
2323a36c61f9SKrishna Gudipati 	 * Initialize r-port
2324a36c61f9SKrishna Gudipati 	 */
2325a36c61f9SKrishna Gudipati 	rport->port = port;
2326a36c61f9SKrishna Gudipati 	rport->fcs = fcs;
2327a36c61f9SKrishna Gudipati 	rport->rp_drv = rport_drv;
2328a36c61f9SKrishna Gudipati 	rport->pid = rpid;
2329a36c61f9SKrishna Gudipati 	rport->pwwn = pwwn;
2330ee1a4a42SKrishna Gudipati 	rport->old_pid = 0;
2331a36c61f9SKrishna Gudipati 
233261ba4394SKrishna Gudipati 	rport->bfa_rport = NULL;
2333a36c61f9SKrishna Gudipati 
23345fbe25c7SJing Huang 	/*
2335a36c61f9SKrishna Gudipati 	 * allocate FC-4s
2336a36c61f9SKrishna Gudipati 	 */
2337d4b671c5SJing Huang 	WARN_ON(!bfa_fcs_lport_is_initiator(port));
2338a36c61f9SKrishna Gudipati 
2339a36c61f9SKrishna Gudipati 	if (bfa_fcs_lport_is_initiator(port)) {
2340a36c61f9SKrishna Gudipati 		rport->itnim = bfa_fcs_itnim_create(rport);
2341a36c61f9SKrishna Gudipati 		if (!rport->itnim) {
2342a36c61f9SKrishna Gudipati 			bfa_trc(fcs, rpid);
2343a36c61f9SKrishna Gudipati 			kfree(rport_drv);
2344a36c61f9SKrishna Gudipati 			return NULL;
2345a36c61f9SKrishna Gudipati 		}
2346a36c61f9SKrishna Gudipati 	}
2347a36c61f9SKrishna Gudipati 
2348a36c61f9SKrishna Gudipati 	bfa_fcs_lport_add_rport(port, rport);
234961ba4394SKrishna Gudipati 	fcs->num_rport_logins++;
2350a36c61f9SKrishna Gudipati 
2351a36c61f9SKrishna Gudipati 	bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
2352a36c61f9SKrishna Gudipati 
2353a36c61f9SKrishna Gudipati 	/* Initialize the Rport Features(RPF) Sub Module  */
2354a36c61f9SKrishna Gudipati 	if (!BFA_FCS_PID_IS_WKA(rport->pid))
2355a36c61f9SKrishna Gudipati 		bfa_fcs_rpf_init(rport);
2356a36c61f9SKrishna Gudipati 
2357a36c61f9SKrishna Gudipati 	return rport;
2358a36c61f9SKrishna Gudipati }
2359a36c61f9SKrishna Gudipati 
2360a36c61f9SKrishna Gudipati 
2361a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_free(struct bfa_fcs_rport_s * rport)2362a36c61f9SKrishna Gudipati bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport)
2363a36c61f9SKrishna Gudipati {
2364a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
236561ba4394SKrishna Gudipati 	struct bfa_fcs_s *fcs = port->fcs;
2366a36c61f9SKrishna Gudipati 
23675fbe25c7SJing Huang 	/*
2368a36c61f9SKrishna Gudipati 	 * - delete FC-4s
2369a36c61f9SKrishna Gudipati 	 * - delete BFA rport
2370a36c61f9SKrishna Gudipati 	 * - remove from queue of rports
2371a36c61f9SKrishna Gudipati 	 */
237261ba4394SKrishna Gudipati 	rport->plogi_pending = BFA_FALSE;
237361ba4394SKrishna Gudipati 
2374a36c61f9SKrishna Gudipati 	if (bfa_fcs_lport_is_initiator(port)) {
2375a36c61f9SKrishna Gudipati 		bfa_fcs_itnim_delete(rport->itnim);
2376a36c61f9SKrishna Gudipati 		if (rport->pid != 0 && !BFA_FCS_PID_IS_WKA(rport->pid))
2377a36c61f9SKrishna Gudipati 			bfa_fcs_rpf_rport_offline(rport);
2378a36c61f9SKrishna Gudipati 	}
2379a36c61f9SKrishna Gudipati 
238061ba4394SKrishna Gudipati 	if (rport->bfa_rport) {
2381f7f73812SMaggie Zhang 		bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_DELETE);
238261ba4394SKrishna Gudipati 		rport->bfa_rport = NULL;
238361ba4394SKrishna Gudipati 	}
238461ba4394SKrishna Gudipati 
2385a36c61f9SKrishna Gudipati 	bfa_fcs_lport_del_rport(port, rport);
238661ba4394SKrishna Gudipati 	fcs->num_rport_logins--;
2387a36c61f9SKrishna Gudipati 	kfree(rport->rp_drv);
2388a36c61f9SKrishna Gudipati }
2389a36c61f9SKrishna Gudipati 
2390a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_aen_post(struct bfa_fcs_rport_s * rport,enum bfa_rport_aen_event event,struct bfa_rport_aen_data_s * data)23917826f304SKrishna Gudipati bfa_fcs_rport_aen_post(struct bfa_fcs_rport_s *rport,
23927826f304SKrishna Gudipati 			enum bfa_rport_aen_event event,
23937826f304SKrishna Gudipati 			struct bfa_rport_aen_data_s *data)
23947826f304SKrishna Gudipati {
23957826f304SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
23967826f304SKrishna Gudipati 	struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad;
23977826f304SKrishna Gudipati 	struct bfa_aen_entry_s  *aen_entry;
23987826f304SKrishna Gudipati 
23997826f304SKrishna Gudipati 	bfad_get_aen_entry(bfad, aen_entry);
24007826f304SKrishna Gudipati 	if (!aen_entry)
24017826f304SKrishna Gudipati 		return;
24027826f304SKrishna Gudipati 
24037826f304SKrishna Gudipati 	if (event == BFA_RPORT_AEN_QOS_PRIO)
24047826f304SKrishna Gudipati 		aen_entry->aen_data.rport.priv.qos = data->priv.qos;
24057826f304SKrishna Gudipati 	else if (event == BFA_RPORT_AEN_QOS_FLOWID)
24067826f304SKrishna Gudipati 		aen_entry->aen_data.rport.priv.qos = data->priv.qos;
24077826f304SKrishna Gudipati 
24087826f304SKrishna Gudipati 	aen_entry->aen_data.rport.vf_id = rport->port->fabric->vf_id;
24097826f304SKrishna Gudipati 	aen_entry->aen_data.rport.ppwwn = bfa_fcs_lport_get_pwwn(
24107826f304SKrishna Gudipati 					bfa_fcs_get_base_port(rport->fcs));
24117826f304SKrishna Gudipati 	aen_entry->aen_data.rport.lpwwn = bfa_fcs_lport_get_pwwn(rport->port);
24127826f304SKrishna Gudipati 	aen_entry->aen_data.rport.rpwwn = rport->pwwn;
24137826f304SKrishna Gudipati 
24147826f304SKrishna Gudipati 	/* Send the AEN notification */
24157826f304SKrishna Gudipati 	bfad_im_post_vendor_event(aen_entry, bfad, ++rport->fcs->fcs_aen_seq,
24167826f304SKrishna Gudipati 				  BFA_AEN_CAT_RPORT, event);
24177826f304SKrishna Gudipati }
24187826f304SKrishna Gudipati 
24197826f304SKrishna Gudipati static void
bfa_fcs_rport_fcs_online_action(struct bfa_fcs_rport_s * rport)242061ba4394SKrishna Gudipati bfa_fcs_rport_fcs_online_action(struct bfa_fcs_rport_s *rport)
242161ba4394SKrishna Gudipati {
242261ba4394SKrishna Gudipati 	if ((!rport->pid) || (!rport->pwwn)) {
242361ba4394SKrishna Gudipati 		bfa_trc(rport->fcs, rport->pid);
242461ba4394SKrishna Gudipati 		bfa_sm_fault(rport->fcs, rport->pid);
242561ba4394SKrishna Gudipati 	}
242661ba4394SKrishna Gudipati 
242761ba4394SKrishna Gudipati 	bfa_sm_send_event(rport->itnim, BFA_FCS_ITNIM_SM_FCS_ONLINE);
242861ba4394SKrishna Gudipati }
242961ba4394SKrishna Gudipati 
243061ba4394SKrishna Gudipati static void
bfa_fcs_rport_hal_online_action(struct bfa_fcs_rport_s * rport)243161ba4394SKrishna Gudipati bfa_fcs_rport_hal_online_action(struct bfa_fcs_rport_s *rport)
2432a36c61f9SKrishna Gudipati {
2433a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2434a36c61f9SKrishna Gudipati 	struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad;
2435a36c61f9SKrishna Gudipati 	char	lpwwn_buf[BFA_STRING_32];
2436a36c61f9SKrishna Gudipati 	char	rpwwn_buf[BFA_STRING_32];
2437a36c61f9SKrishna Gudipati 
2438a36c61f9SKrishna Gudipati 	rport->stats.onlines++;
2439a36c61f9SKrishna Gudipati 
2440d7be54ccSKrishna Gudipati 	if ((!rport->pid) || (!rport->pwwn)) {
2441d7be54ccSKrishna Gudipati 		bfa_trc(rport->fcs, rport->pid);
2442d7be54ccSKrishna Gudipati 		bfa_sm_fault(rport->fcs, rport->pid);
2443d7be54ccSKrishna Gudipati 	}
2444d7be54ccSKrishna Gudipati 
2445a36c61f9SKrishna Gudipati 	if (bfa_fcs_lport_is_initiator(port)) {
244661ba4394SKrishna Gudipati 		bfa_fcs_itnim_brp_online(rport->itnim);
2447a36c61f9SKrishna Gudipati 		if (!BFA_FCS_PID_IS_WKA(rport->pid))
2448a36c61f9SKrishna Gudipati 			bfa_fcs_rpf_rport_online(rport);
2449f71ded01SJason Yan 	}
2450a36c61f9SKrishna Gudipati 
2451a36c61f9SKrishna Gudipati 	wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(port));
2452a36c61f9SKrishna Gudipati 	wwn2str(rpwwn_buf, rport->pwwn);
24537826f304SKrishna Gudipati 	if (!BFA_FCS_PID_IS_WKA(rport->pid)) {
245488166242SJing Huang 		BFA_LOG(KERN_INFO, bfad, bfa_log_level,
2455a36c61f9SKrishna Gudipati 		"Remote port (WWN = %s) online for logical port (WWN = %s)\n",
2456a36c61f9SKrishna Gudipati 		rpwwn_buf, lpwwn_buf);
24577826f304SKrishna Gudipati 		bfa_fcs_rport_aen_post(rport, BFA_RPORT_AEN_ONLINE, NULL);
24587826f304SKrishna Gudipati 	}
2459a36c61f9SKrishna Gudipati }
2460a36c61f9SKrishna Gudipati 
2461a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_fcs_offline_action(struct bfa_fcs_rport_s * rport)246261ba4394SKrishna Gudipati bfa_fcs_rport_fcs_offline_action(struct bfa_fcs_rport_s *rport)
246361ba4394SKrishna Gudipati {
246461ba4394SKrishna Gudipati 	if (!BFA_FCS_PID_IS_WKA(rport->pid))
246561ba4394SKrishna Gudipati 		bfa_fcs_rpf_rport_offline(rport);
246661ba4394SKrishna Gudipati 
246761ba4394SKrishna Gudipati 	bfa_fcs_itnim_rport_offline(rport->itnim);
246861ba4394SKrishna Gudipati }
246961ba4394SKrishna Gudipati 
247061ba4394SKrishna Gudipati static void
bfa_fcs_rport_hal_offline_action(struct bfa_fcs_rport_s * rport)247161ba4394SKrishna Gudipati bfa_fcs_rport_hal_offline_action(struct bfa_fcs_rport_s *rport)
2472a36c61f9SKrishna Gudipati {
2473a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2474a36c61f9SKrishna Gudipati 	struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad;
2475a36c61f9SKrishna Gudipati 	char	lpwwn_buf[BFA_STRING_32];
2476a36c61f9SKrishna Gudipati 	char	rpwwn_buf[BFA_STRING_32];
2477a36c61f9SKrishna Gudipati 
247861ba4394SKrishna Gudipati 	if (!rport->bfa_rport) {
247961ba4394SKrishna Gudipati 		bfa_fcs_rport_fcs_offline_action(rport);
248061ba4394SKrishna Gudipati 		return;
248161ba4394SKrishna Gudipati 	}
248261ba4394SKrishna Gudipati 
2483a36c61f9SKrishna Gudipati 	rport->stats.offlines++;
2484a36c61f9SKrishna Gudipati 
2485a36c61f9SKrishna Gudipati 	wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(port));
2486a36c61f9SKrishna Gudipati 	wwn2str(rpwwn_buf, rport->pwwn);
2487a36c61f9SKrishna Gudipati 	if (!BFA_FCS_PID_IS_WKA(rport->pid)) {
24887826f304SKrishna Gudipati 		if (bfa_fcs_lport_is_online(rport->port) == BFA_TRUE) {
248988166242SJing Huang 			BFA_LOG(KERN_ERR, bfad, bfa_log_level,
2490a36c61f9SKrishna Gudipati 				"Remote port (WWN = %s) connectivity lost for "
2491a36c61f9SKrishna Gudipati 				"logical port (WWN = %s)\n",
2492a36c61f9SKrishna Gudipati 				rpwwn_buf, lpwwn_buf);
24937826f304SKrishna Gudipati 			bfa_fcs_rport_aen_post(rport,
24947826f304SKrishna Gudipati 				BFA_RPORT_AEN_DISCONNECT, NULL);
24957826f304SKrishna Gudipati 		} else {
249688166242SJing Huang 			BFA_LOG(KERN_INFO, bfad, bfa_log_level,
2497a36c61f9SKrishna Gudipati 				"Remote port (WWN = %s) offlined by "
2498a36c61f9SKrishna Gudipati 				"logical port (WWN = %s)\n",
2499a36c61f9SKrishna Gudipati 				rpwwn_buf, lpwwn_buf);
25007826f304SKrishna Gudipati 			bfa_fcs_rport_aen_post(rport,
25017826f304SKrishna Gudipati 				BFA_RPORT_AEN_OFFLINE, NULL);
25027826f304SKrishna Gudipati 		}
2503a36c61f9SKrishna Gudipati 	}
2504a36c61f9SKrishna Gudipati 
2505a36c61f9SKrishna Gudipati 	if (bfa_fcs_lport_is_initiator(port)) {
2506a36c61f9SKrishna Gudipati 		bfa_fcs_itnim_rport_offline(rport->itnim);
2507a36c61f9SKrishna Gudipati 		if (!BFA_FCS_PID_IS_WKA(rport->pid))
2508a36c61f9SKrishna Gudipati 			bfa_fcs_rpf_rport_offline(rport);
2509a36c61f9SKrishna Gudipati 	}
2510a36c61f9SKrishna Gudipati }
2511a36c61f9SKrishna Gudipati 
25125fbe25c7SJing Huang /*
2513a36c61f9SKrishna Gudipati  * Update rport parameters from PLOGI or PLOGI accept.
2514a36c61f9SKrishna Gudipati  */
2515a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_update(struct bfa_fcs_rport_s * rport,struct fc_logi_s * plogi)2516a36c61f9SKrishna Gudipati bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport, struct fc_logi_s *plogi)
2517a36c61f9SKrishna Gudipati {
2518a36c61f9SKrishna Gudipati 	bfa_fcs_lport_t *port = rport->port;
2519a36c61f9SKrishna Gudipati 
25205fbe25c7SJing Huang 	/*
2521a36c61f9SKrishna Gudipati 	 * - port name
2522a36c61f9SKrishna Gudipati 	 * - node name
2523a36c61f9SKrishna Gudipati 	 */
2524a36c61f9SKrishna Gudipati 	rport->pwwn = plogi->port_name;
2525a36c61f9SKrishna Gudipati 	rport->nwwn = plogi->node_name;
2526a36c61f9SKrishna Gudipati 
25275fbe25c7SJing Huang 	/*
2528a36c61f9SKrishna Gudipati 	 * - class of service
2529a36c61f9SKrishna Gudipati 	 */
2530a36c61f9SKrishna Gudipati 	rport->fc_cos = 0;
2531a36c61f9SKrishna Gudipati 	if (plogi->class3.class_valid)
2532a36c61f9SKrishna Gudipati 		rport->fc_cos = FC_CLASS_3;
2533a36c61f9SKrishna Gudipati 
2534a36c61f9SKrishna Gudipati 	if (plogi->class2.class_valid)
2535a36c61f9SKrishna Gudipati 		rport->fc_cos |= FC_CLASS_2;
2536a36c61f9SKrishna Gudipati 
25375fbe25c7SJing Huang 	/*
2538a36c61f9SKrishna Gudipati 	 * - CISC
2539a36c61f9SKrishna Gudipati 	 * - MAX receive frame size
2540a36c61f9SKrishna Gudipati 	 */
2541a36c61f9SKrishna Gudipati 	rport->cisc = plogi->csp.cisc;
2542bd5a0260SKrishna Gudipati 	if (be16_to_cpu(plogi->class3.rxsz) < be16_to_cpu(plogi->csp.rxsz))
2543ba816ea8SJing Huang 		rport->maxfrsize = be16_to_cpu(plogi->class3.rxsz);
2544bd5a0260SKrishna Gudipati 	else
2545bd5a0260SKrishna Gudipati 		rport->maxfrsize = be16_to_cpu(plogi->csp.rxsz);
2546a36c61f9SKrishna Gudipati 
2547ba816ea8SJing Huang 	bfa_trc(port->fcs, be16_to_cpu(plogi->csp.bbcred));
2548a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, port->fabric->bb_credit);
25495fbe25c7SJing Huang 	/*
2550a36c61f9SKrishna Gudipati 	 * Direct Attach P2P mode :
2551a36c61f9SKrishna Gudipati 	 * This is to handle a bug (233476) in IBM targets in Direct Attach
2552a36c61f9SKrishna Gudipati 	 *  Mode. Basically, in FLOGI Accept the target would have
2553a36c61f9SKrishna Gudipati 	 * erroneously set the BB Credit to the value used in the FLOGI
2554a36c61f9SKrishna Gudipati 	 * sent by the HBA. It uses the correct value (its own BB credit)
2555a36c61f9SKrishna Gudipati 	 * in PLOGI.
2556a36c61f9SKrishna Gudipati 	 */
2557a36c61f9SKrishna Gudipati 	if ((!bfa_fcs_fabric_is_switched(port->fabric))	 &&
2558ba816ea8SJing Huang 		(be16_to_cpu(plogi->csp.bbcred) < port->fabric->bb_credit)) {
2559a36c61f9SKrishna Gudipati 
2560ba816ea8SJing Huang 		bfa_trc(port->fcs, be16_to_cpu(plogi->csp.bbcred));
2561a36c61f9SKrishna Gudipati 		bfa_trc(port->fcs, port->fabric->bb_credit);
2562a36c61f9SKrishna Gudipati 
2563ba816ea8SJing Huang 		port->fabric->bb_credit = be16_to_cpu(plogi->csp.bbcred);
2564a36c61f9SKrishna Gudipati 		bfa_fcport_set_tx_bbcredit(port->fcs->bfa,
2565bbe37a67SVijaya Mohan Guvva 					  port->fabric->bb_credit);
2566a36c61f9SKrishna Gudipati 	}
2567a36c61f9SKrishna Gudipati 
2568a36c61f9SKrishna Gudipati }
2569a36c61f9SKrishna Gudipati 
25705fbe25c7SJing Huang /*
2571a36c61f9SKrishna Gudipati  *	Called to handle LOGO received from an existing remote port.
2572a36c61f9SKrishna Gudipati  */
2573a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_process_logo(struct bfa_fcs_rport_s * rport,struct fchs_s * fchs)2574a36c61f9SKrishna Gudipati bfa_fcs_rport_process_logo(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs)
2575a36c61f9SKrishna Gudipati {
2576a36c61f9SKrishna Gudipati 	rport->reply_oxid = fchs->ox_id;
2577a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->reply_oxid);
2578a36c61f9SKrishna Gudipati 
2579a36c61f9SKrishna Gudipati 	rport->prlo = BFA_FALSE;
2580a36c61f9SKrishna Gudipati 	rport->stats.logo_rcvd++;
2581a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_LOGO_RCVD);
2582a36c61f9SKrishna Gudipati }
2583a36c61f9SKrishna Gudipati 
2584a36c61f9SKrishna Gudipati 
2585a36c61f9SKrishna Gudipati 
25865fbe25c7SJing Huang /*
2587a36c61f9SKrishna Gudipati  *  fcs_rport_public FCS rport public interfaces
2588a36c61f9SKrishna Gudipati  */
2589a36c61f9SKrishna Gudipati 
25905fbe25c7SJing Huang /*
2591a36c61f9SKrishna Gudipati  *	Called by bport/vport to create a remote port instance for a discovered
2592a36c61f9SKrishna Gudipati  *	remote device.
2593a36c61f9SKrishna Gudipati  *
2594a36c61f9SKrishna Gudipati  * @param[in] port	- base port or vport
2595a36c61f9SKrishna Gudipati  * @param[in] rpid	- remote port ID
2596a36c61f9SKrishna Gudipati  *
2597a36c61f9SKrishna Gudipati  * @return None
2598a36c61f9SKrishna Gudipati  */
2599a36c61f9SKrishna Gudipati struct bfa_fcs_rport_s *
bfa_fcs_rport_create(struct bfa_fcs_lport_s * port,u32 rpid)2600a36c61f9SKrishna Gudipati bfa_fcs_rport_create(struct bfa_fcs_lport_s *port, u32 rpid)
2601a36c61f9SKrishna Gudipati {
2602a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
2603a36c61f9SKrishna Gudipati 
2604a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rpid);
2605a36c61f9SKrishna Gudipati 	rport = bfa_fcs_rport_alloc(port, WWN_NULL, rpid);
2606a36c61f9SKrishna Gudipati 	if (!rport)
2607a36c61f9SKrishna Gudipati 		return NULL;
2608a36c61f9SKrishna Gudipati 
2609a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_PLOGI_SEND);
2610a36c61f9SKrishna Gudipati 	return rport;
2611a36c61f9SKrishna Gudipati }
2612a36c61f9SKrishna Gudipati 
26135fbe25c7SJing Huang /*
2614a36c61f9SKrishna Gudipati  * Called to create a rport for which only the wwn is known.
2615a36c61f9SKrishna Gudipati  *
2616a36c61f9SKrishna Gudipati  * @param[in] port	- base port
2617a36c61f9SKrishna Gudipati  * @param[in] rpwwn	- remote port wwn
2618a36c61f9SKrishna Gudipati  *
2619a36c61f9SKrishna Gudipati  * @return None
2620a36c61f9SKrishna Gudipati  */
2621a36c61f9SKrishna Gudipati struct bfa_fcs_rport_s *
bfa_fcs_rport_create_by_wwn(struct bfa_fcs_lport_s * port,wwn_t rpwwn)2622a36c61f9SKrishna Gudipati bfa_fcs_rport_create_by_wwn(struct bfa_fcs_lport_s *port, wwn_t rpwwn)
2623a36c61f9SKrishna Gudipati {
2624a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
2625a36c61f9SKrishna Gudipati 	bfa_trc(port->fcs, rpwwn);
2626a36c61f9SKrishna Gudipati 	rport = bfa_fcs_rport_alloc(port, rpwwn, 0);
2627a36c61f9SKrishna Gudipati 	if (!rport)
2628a36c61f9SKrishna Gudipati 		return NULL;
2629a36c61f9SKrishna Gudipati 
2630a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_ADDRESS_DISC);
2631a36c61f9SKrishna Gudipati 	return rport;
2632a36c61f9SKrishna Gudipati }
26335fbe25c7SJing Huang /*
2634a36c61f9SKrishna Gudipati  * Called by bport in private loop topology to indicate that a
2635a36c61f9SKrishna Gudipati  * rport has been discovered and plogi has been completed.
2636a36c61f9SKrishna Gudipati  *
2637a36c61f9SKrishna Gudipati  * @param[in] port	- base port or vport
2638a36c61f9SKrishna Gudipati  * @param[in] rpid	- remote port ID
2639a36c61f9SKrishna Gudipati  */
2640a36c61f9SKrishna Gudipati void
bfa_fcs_rport_start(struct bfa_fcs_lport_s * port,struct fchs_s * fchs,struct fc_logi_s * plogi)2641a36c61f9SKrishna Gudipati bfa_fcs_rport_start(struct bfa_fcs_lport_s *port, struct fchs_s *fchs,
2642a36c61f9SKrishna Gudipati 	 struct fc_logi_s *plogi)
2643a36c61f9SKrishna Gudipati {
2644a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
2645a36c61f9SKrishna Gudipati 
2646a36c61f9SKrishna Gudipati 	rport = bfa_fcs_rport_alloc(port, WWN_NULL, fchs->s_id);
2647a36c61f9SKrishna Gudipati 	if (!rport)
2648a36c61f9SKrishna Gudipati 		return;
2649a36c61f9SKrishna Gudipati 
2650a36c61f9SKrishna Gudipati 	bfa_fcs_rport_update(rport, plogi);
2651a36c61f9SKrishna Gudipati 
2652a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_PLOGI_COMP);
2653a36c61f9SKrishna Gudipati }
2654a36c61f9SKrishna Gudipati 
26555fbe25c7SJing Huang /*
2656a36c61f9SKrishna Gudipati  *	Called by bport/vport to handle PLOGI received from a new remote port.
2657a36c61f9SKrishna Gudipati  *	If an existing rport does a plogi, it will be handled separately.
2658a36c61f9SKrishna Gudipati  */
2659a36c61f9SKrishna Gudipati void
bfa_fcs_rport_plogi_create(struct bfa_fcs_lport_s * port,struct fchs_s * fchs,struct fc_logi_s * plogi)2660a36c61f9SKrishna Gudipati bfa_fcs_rport_plogi_create(struct bfa_fcs_lport_s *port, struct fchs_s *fchs,
2661a36c61f9SKrishna Gudipati 				struct fc_logi_s *plogi)
2662a36c61f9SKrishna Gudipati {
2663a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
2664a36c61f9SKrishna Gudipati 
2665a36c61f9SKrishna Gudipati 	rport = bfa_fcs_rport_alloc(port, plogi->port_name, fchs->s_id);
2666a36c61f9SKrishna Gudipati 	if (!rport)
2667a36c61f9SKrishna Gudipati 		return;
2668a36c61f9SKrishna Gudipati 
2669a36c61f9SKrishna Gudipati 	bfa_fcs_rport_update(rport, plogi);
2670a36c61f9SKrishna Gudipati 
2671a36c61f9SKrishna Gudipati 	rport->reply_oxid = fchs->ox_id;
2672a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->reply_oxid);
2673a36c61f9SKrishna Gudipati 
2674a36c61f9SKrishna Gudipati 	rport->stats.plogi_rcvd++;
2675a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_PLOGI_RCVD);
2676a36c61f9SKrishna Gudipati }
2677a36c61f9SKrishna Gudipati 
26785fbe25c7SJing Huang /*
2679a36c61f9SKrishna Gudipati  *	Called by bport/vport to handle PLOGI received from an existing
2680a36c61f9SKrishna Gudipati  *	 remote port.
2681a36c61f9SKrishna Gudipati  */
2682a36c61f9SKrishna Gudipati void
bfa_fcs_rport_plogi(struct bfa_fcs_rport_s * rport,struct fchs_s * rx_fchs,struct fc_logi_s * plogi)2683a36c61f9SKrishna Gudipati bfa_fcs_rport_plogi(struct bfa_fcs_rport_s *rport, struct fchs_s *rx_fchs,
2684a36c61f9SKrishna Gudipati 			struct fc_logi_s *plogi)
2685a36c61f9SKrishna Gudipati {
26865fbe25c7SJing Huang 	/*
2687a36c61f9SKrishna Gudipati 	 * @todo Handle P2P and initiator-initiator.
2688a36c61f9SKrishna Gudipati 	 */
2689a36c61f9SKrishna Gudipati 
2690a36c61f9SKrishna Gudipati 	bfa_fcs_rport_update(rport, plogi);
2691a36c61f9SKrishna Gudipati 
2692a36c61f9SKrishna Gudipati 	rport->reply_oxid = rx_fchs->ox_id;
2693a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->reply_oxid);
2694a36c61f9SKrishna Gudipati 
2695d7be54ccSKrishna Gudipati 	rport->pid = rx_fchs->s_id;
2696d7be54ccSKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
2697d7be54ccSKrishna Gudipati 
2698a36c61f9SKrishna Gudipati 	rport->stats.plogi_rcvd++;
2699a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_PLOGI_RCVD);
2700a36c61f9SKrishna Gudipati }
2701a36c61f9SKrishna Gudipati 
2702a36c61f9SKrishna Gudipati 
27035fbe25c7SJing Huang /*
2704a36c61f9SKrishna Gudipati  *	Called by bport/vport to notify SCN for the remote port
2705a36c61f9SKrishna Gudipati  */
2706a36c61f9SKrishna Gudipati void
bfa_fcs_rport_scn(struct bfa_fcs_rport_s * rport)2707a36c61f9SKrishna Gudipati bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport)
2708a36c61f9SKrishna Gudipati {
2709a36c61f9SKrishna Gudipati 	rport->stats.rscns++;
2710bc0e2c2aSKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_FAB_SCN);
2711a36c61f9SKrishna Gudipati }
2712a36c61f9SKrishna Gudipati 
27135fbe25c7SJing Huang /*
2714a36c61f9SKrishna Gudipati  *	brief
2715a36c61f9SKrishna Gudipati  *	This routine BFA callback for bfa_rport_online() call.
2716a36c61f9SKrishna Gudipati  *
2717a36c61f9SKrishna Gudipati  *	param[in]	cb_arg	-  rport struct.
2718a36c61f9SKrishna Gudipati  *
2719a36c61f9SKrishna Gudipati  *	return
2720a36c61f9SKrishna Gudipati  *		void
2721a36c61f9SKrishna Gudipati  *
2722a36c61f9SKrishna Gudipati  *	Special Considerations:
2723a36c61f9SKrishna Gudipati  *
2724a36c61f9SKrishna Gudipati  *	note
2725a36c61f9SKrishna Gudipati  */
2726a36c61f9SKrishna Gudipati void
bfa_cb_rport_online(void * cbarg)2727a36c61f9SKrishna Gudipati bfa_cb_rport_online(void *cbarg)
2728a36c61f9SKrishna Gudipati {
2729a36c61f9SKrishna Gudipati 
2730a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
2731a36c61f9SKrishna Gudipati 
2732a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
2733a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_HCB_ONLINE);
2734a36c61f9SKrishna Gudipati }
2735a36c61f9SKrishna Gudipati 
27365fbe25c7SJing Huang /*
2737a36c61f9SKrishna Gudipati  *	brief
2738a36c61f9SKrishna Gudipati  *	This routine BFA callback for bfa_rport_offline() call.
2739a36c61f9SKrishna Gudipati  *
2740a36c61f9SKrishna Gudipati  *	param[in]	rport	-
2741a36c61f9SKrishna Gudipati  *
2742a36c61f9SKrishna Gudipati  *	return
2743a36c61f9SKrishna Gudipati  *		void
2744a36c61f9SKrishna Gudipati  *
2745a36c61f9SKrishna Gudipati  *	Special Considerations:
2746a36c61f9SKrishna Gudipati  *
2747a36c61f9SKrishna Gudipati  *	note
2748a36c61f9SKrishna Gudipati  */
2749a36c61f9SKrishna Gudipati void
bfa_cb_rport_offline(void * cbarg)2750a36c61f9SKrishna Gudipati bfa_cb_rport_offline(void *cbarg)
2751a36c61f9SKrishna Gudipati {
2752a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
2753a36c61f9SKrishna Gudipati 
2754a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
2755a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_HCB_OFFLINE);
2756a36c61f9SKrishna Gudipati }
2757a36c61f9SKrishna Gudipati 
27585fbe25c7SJing Huang /*
2759a36c61f9SKrishna Gudipati  *	brief
2760a36c61f9SKrishna Gudipati  *	This routine is a static BFA callback when there is a QoS flow_id
2761a36c61f9SKrishna Gudipati  *	change notification
2762a36c61f9SKrishna Gudipati  *
2763a36c61f9SKrishna Gudipati  *	param[in]	rport	-
2764a36c61f9SKrishna Gudipati  *
2765a36c61f9SKrishna Gudipati  *	return
2766a36c61f9SKrishna Gudipati  *		void
2767a36c61f9SKrishna Gudipati  *
2768a36c61f9SKrishna Gudipati  *	Special Considerations:
2769a36c61f9SKrishna Gudipati  *
2770a36c61f9SKrishna Gudipati  *	note
2771a36c61f9SKrishna Gudipati  */
2772a36c61f9SKrishna Gudipati void
bfa_cb_rport_qos_scn_flowid(void * cbarg,struct bfa_rport_qos_attr_s old_qos_attr,struct bfa_rport_qos_attr_s new_qos_attr)2773a36c61f9SKrishna Gudipati bfa_cb_rport_qos_scn_flowid(void *cbarg,
2774a36c61f9SKrishna Gudipati 		struct bfa_rport_qos_attr_s old_qos_attr,
2775a36c61f9SKrishna Gudipati 		struct bfa_rport_qos_attr_s new_qos_attr)
2776a36c61f9SKrishna Gudipati {
2777a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
27787826f304SKrishna Gudipati 	struct bfa_rport_aen_data_s aen_data;
2779a36c61f9SKrishna Gudipati 
2780a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
27817826f304SKrishna Gudipati 	aen_data.priv.qos = new_qos_attr;
27827826f304SKrishna Gudipati 	bfa_fcs_rport_aen_post(rport, BFA_RPORT_AEN_QOS_FLOWID, &aen_data);
2783a36c61f9SKrishna Gudipati }
2784a36c61f9SKrishna Gudipati 
2785bc0e2c2aSKrishna Gudipati void
bfa_cb_rport_scn_online(struct bfa_s * bfa)2786bc0e2c2aSKrishna Gudipati bfa_cb_rport_scn_online(struct bfa_s *bfa)
2787bc0e2c2aSKrishna Gudipati {
2788bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_s *fcs = &((struct bfad_s *)bfa->bfad)->bfa_fcs;
2789bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_lport_s *port = bfa_fcs_get_base_port(fcs);
2790bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_rport_s *rp;
2791bc0e2c2aSKrishna Gudipati 	struct list_head *qe;
2792bc0e2c2aSKrishna Gudipati 
2793bc0e2c2aSKrishna Gudipati 	list_for_each(qe, &port->rport_q) {
2794bc0e2c2aSKrishna Gudipati 		rp = (struct bfa_fcs_rport_s *) qe;
2795bc0e2c2aSKrishna Gudipati 		bfa_sm_send_event(rp, RPSM_EVENT_SCN_ONLINE);
2796bc0e2c2aSKrishna Gudipati 		rp->scn_online = BFA_TRUE;
2797bc0e2c2aSKrishna Gudipati 	}
2798bc0e2c2aSKrishna Gudipati 
2799bc0e2c2aSKrishna Gudipati 	if (bfa_fcs_lport_is_online(port))
2800bc0e2c2aSKrishna Gudipati 		bfa_fcs_lport_lip_scn_online(port);
2801bc0e2c2aSKrishna Gudipati }
2802bc0e2c2aSKrishna Gudipati 
2803bc0e2c2aSKrishna Gudipati void
bfa_cb_rport_scn_no_dev(void * rport)2804bc0e2c2aSKrishna Gudipati bfa_cb_rport_scn_no_dev(void *rport)
2805bc0e2c2aSKrishna Gudipati {
2806bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_rport_s *rp = rport;
2807bc0e2c2aSKrishna Gudipati 
2808bc0e2c2aSKrishna Gudipati 	bfa_sm_send_event(rp, RPSM_EVENT_SCN_OFFLINE);
2809bc0e2c2aSKrishna Gudipati 	rp->scn_online = BFA_FALSE;
2810bc0e2c2aSKrishna Gudipati }
2811bc0e2c2aSKrishna Gudipati 
2812bc0e2c2aSKrishna Gudipati void
bfa_cb_rport_scn_offline(struct bfa_s * bfa)2813bc0e2c2aSKrishna Gudipati bfa_cb_rport_scn_offline(struct bfa_s *bfa)
2814bc0e2c2aSKrishna Gudipati {
2815bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_s *fcs = &((struct bfad_s *)bfa->bfad)->bfa_fcs;
2816bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_lport_s *port = bfa_fcs_get_base_port(fcs);
2817bc0e2c2aSKrishna Gudipati 	struct bfa_fcs_rport_s *rp;
2818bc0e2c2aSKrishna Gudipati 	struct list_head *qe;
2819bc0e2c2aSKrishna Gudipati 
2820bc0e2c2aSKrishna Gudipati 	list_for_each(qe, &port->rport_q) {
2821bc0e2c2aSKrishna Gudipati 		rp = (struct bfa_fcs_rport_s *) qe;
2822bc0e2c2aSKrishna Gudipati 		bfa_sm_send_event(rp, RPSM_EVENT_SCN_OFFLINE);
2823bc0e2c2aSKrishna Gudipati 		rp->scn_online = BFA_FALSE;
2824bc0e2c2aSKrishna Gudipati 	}
2825bc0e2c2aSKrishna Gudipati }
2826bc0e2c2aSKrishna Gudipati 
28275fbe25c7SJing Huang /*
2828a36c61f9SKrishna Gudipati  *	brief
2829a36c61f9SKrishna Gudipati  *	This routine is a static BFA callback when there is a QoS priority
2830a36c61f9SKrishna Gudipati  *	change notification
2831a36c61f9SKrishna Gudipati  *
2832a36c61f9SKrishna Gudipati  *	param[in]	rport	-
2833a36c61f9SKrishna Gudipati  *
2834a36c61f9SKrishna Gudipati  *	return
2835a36c61f9SKrishna Gudipati  *		void
2836a36c61f9SKrishna Gudipati  *
2837a36c61f9SKrishna Gudipati  *	Special Considerations:
2838a36c61f9SKrishna Gudipati  *
2839a36c61f9SKrishna Gudipati  *	note
2840a36c61f9SKrishna Gudipati  */
2841a36c61f9SKrishna Gudipati void
bfa_cb_rport_qos_scn_prio(void * cbarg,struct bfa_rport_qos_attr_s old_qos_attr,struct bfa_rport_qos_attr_s new_qos_attr)2842a36c61f9SKrishna Gudipati bfa_cb_rport_qos_scn_prio(void *cbarg,
2843a36c61f9SKrishna Gudipati 		struct bfa_rport_qos_attr_s old_qos_attr,
2844a36c61f9SKrishna Gudipati 		struct bfa_rport_qos_attr_s new_qos_attr)
2845a36c61f9SKrishna Gudipati {
2846a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = (struct bfa_fcs_rport_s *) cbarg;
28477826f304SKrishna Gudipati 	struct bfa_rport_aen_data_s aen_data;
2848a36c61f9SKrishna Gudipati 
2849a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
28507826f304SKrishna Gudipati 	aen_data.priv.qos = new_qos_attr;
28517826f304SKrishna Gudipati 	bfa_fcs_rport_aen_post(rport, BFA_RPORT_AEN_QOS_PRIO, &aen_data);
2852a36c61f9SKrishna Gudipati }
2853a36c61f9SKrishna Gudipati 
28545fbe25c7SJing Huang /*
2855a36c61f9SKrishna Gudipati  *		Called to process any unsolicted frames from this remote port
2856a36c61f9SKrishna Gudipati  */
2857a36c61f9SKrishna Gudipati void
bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s * rport,struct fchs_s * fchs,u16 len)2858a36c61f9SKrishna Gudipati bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport,
2859a36c61f9SKrishna Gudipati 			struct fchs_s *fchs, u16 len)
2860a36c61f9SKrishna Gudipati {
2861a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2862a36c61f9SKrishna Gudipati 	struct fc_els_cmd_s	*els_cmd;
2863a36c61f9SKrishna Gudipati 
2864a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, fchs->s_id);
2865a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, fchs->d_id);
2866a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, fchs->type);
2867a36c61f9SKrishna Gudipati 
2868a36c61f9SKrishna Gudipati 	if (fchs->type != FC_TYPE_ELS)
2869a36c61f9SKrishna Gudipati 		return;
2870a36c61f9SKrishna Gudipati 
2871a36c61f9SKrishna Gudipati 	els_cmd = (struct fc_els_cmd_s *) (fchs + 1);
2872a36c61f9SKrishna Gudipati 
2873a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, els_cmd->els_code);
2874a36c61f9SKrishna Gudipati 
2875a36c61f9SKrishna Gudipati 	switch (els_cmd->els_code) {
2876a36c61f9SKrishna Gudipati 	case FC_ELS_LOGO:
2877a36c61f9SKrishna Gudipati 		bfa_stats(port, plogi_rcvd);
2878a36c61f9SKrishna Gudipati 		bfa_fcs_rport_process_logo(rport, fchs);
2879a36c61f9SKrishna Gudipati 		break;
2880a36c61f9SKrishna Gudipati 
2881a36c61f9SKrishna Gudipati 	case FC_ELS_ADISC:
2882a36c61f9SKrishna Gudipati 		bfa_stats(port, adisc_rcvd);
2883a36c61f9SKrishna Gudipati 		bfa_fcs_rport_process_adisc(rport, fchs, len);
2884a36c61f9SKrishna Gudipati 		break;
2885a36c61f9SKrishna Gudipati 
2886a36c61f9SKrishna Gudipati 	case FC_ELS_PRLO:
2887a36c61f9SKrishna Gudipati 		bfa_stats(port, prlo_rcvd);
2888a36c61f9SKrishna Gudipati 		if (bfa_fcs_lport_is_initiator(port))
2889a36c61f9SKrishna Gudipati 			bfa_fcs_fcpim_uf_recv(rport->itnim, fchs, len);
2890a36c61f9SKrishna Gudipati 		break;
2891a36c61f9SKrishna Gudipati 
2892a36c61f9SKrishna Gudipati 	case FC_ELS_PRLI:
2893a36c61f9SKrishna Gudipati 		bfa_stats(port, prli_rcvd);
2894a36c61f9SKrishna Gudipati 		bfa_fcs_rport_process_prli(rport, fchs, len);
2895a36c61f9SKrishna Gudipati 		break;
2896a36c61f9SKrishna Gudipati 
2897a36c61f9SKrishna Gudipati 	case FC_ELS_RPSC:
2898a36c61f9SKrishna Gudipati 		bfa_stats(port, rpsc_rcvd);
2899a36c61f9SKrishna Gudipati 		bfa_fcs_rport_process_rpsc(rport, fchs, len);
2900a36c61f9SKrishna Gudipati 		break;
2901a36c61f9SKrishna Gudipati 
2902a36c61f9SKrishna Gudipati 	default:
2903a36c61f9SKrishna Gudipati 		bfa_stats(port, un_handled_els_rcvd);
2904a36c61f9SKrishna Gudipati 		bfa_fcs_rport_send_ls_rjt(rport, fchs,
2905a36c61f9SKrishna Gudipati 					  FC_LS_RJT_RSN_CMD_NOT_SUPP,
2906a36c61f9SKrishna Gudipati 					  FC_LS_RJT_EXP_NO_ADDL_INFO);
2907a36c61f9SKrishna Gudipati 		break;
2908a36c61f9SKrishna Gudipati 	}
2909a36c61f9SKrishna Gudipati }
2910a36c61f9SKrishna Gudipati 
2911a36c61f9SKrishna Gudipati /* send best case  acc to prlo */
2912a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s * rport)2913a36c61f9SKrishna Gudipati bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s *rport)
2914a36c61f9SKrishna Gudipati {
2915a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2916a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2917a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2918a36c61f9SKrishna Gudipati 	int		len;
2919a36c61f9SKrishna Gudipati 
2920a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
2921a36c61f9SKrishna Gudipati 
2922c3f1b123SKrishna Gudipati 	fcxp = bfa_fcs_fcxp_alloc(port->fcs, BFA_FALSE);
2923a36c61f9SKrishna Gudipati 	if (!fcxp)
2924a36c61f9SKrishna Gudipati 		return;
2925a36c61f9SKrishna Gudipati 	len = fc_prlo_acc_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
2926a36c61f9SKrishna Gudipati 			rport->pid, bfa_fcs_lport_get_fcid(port),
2927a36c61f9SKrishna Gudipati 			rport->reply_oxid, 0);
2928a36c61f9SKrishna Gudipati 
2929a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, rport->bfa_rport, port->fabric->vf_id,
2930a36c61f9SKrishna Gudipati 		port->lp_tag, BFA_FALSE, FC_CLASS_3, len, &fchs,
2931a36c61f9SKrishna Gudipati 		NULL, NULL, FC_MAX_PDUSZ, 0);
2932a36c61f9SKrishna Gudipati }
2933a36c61f9SKrishna Gudipati 
2934a36c61f9SKrishna Gudipati /*
2935a36c61f9SKrishna Gudipati  * Send a LS reject
2936a36c61f9SKrishna Gudipati  */
2937a36c61f9SKrishna Gudipati static void
bfa_fcs_rport_send_ls_rjt(struct bfa_fcs_rport_s * rport,struct fchs_s * rx_fchs,u8 reason_code,u8 reason_code_expl)2938a36c61f9SKrishna Gudipati bfa_fcs_rport_send_ls_rjt(struct bfa_fcs_rport_s *rport, struct fchs_s *rx_fchs,
2939a36c61f9SKrishna Gudipati 			  u8 reason_code, u8 reason_code_expl)
2940a36c61f9SKrishna Gudipati {
2941a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
2942a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
2943a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
2944a36c61f9SKrishna Gudipati 	int		len;
2945a36c61f9SKrishna Gudipati 
2946a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rx_fchs->s_id);
2947a36c61f9SKrishna Gudipati 
2948c3f1b123SKrishna Gudipati 	fcxp = bfa_fcs_fcxp_alloc(rport->fcs, BFA_FALSE);
2949a36c61f9SKrishna Gudipati 	if (!fcxp)
2950a36c61f9SKrishna Gudipati 		return;
2951a36c61f9SKrishna Gudipati 
2952a36c61f9SKrishna Gudipati 	len = fc_ls_rjt_build(&fchs, bfa_fcxp_get_reqbuf(fcxp),
2953a36c61f9SKrishna Gudipati 				rx_fchs->s_id, bfa_fcs_lport_get_fcid(port),
2954a36c61f9SKrishna Gudipati 				rx_fchs->ox_id, reason_code, reason_code_expl);
2955a36c61f9SKrishna Gudipati 
2956a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag,
2957a36c61f9SKrishna Gudipati 			BFA_FALSE, FC_CLASS_3, len, &fchs, NULL, NULL,
2958a36c61f9SKrishna Gudipati 			FC_MAX_PDUSZ, 0);
2959a36c61f9SKrishna Gudipati }
2960a36c61f9SKrishna Gudipati 
29615fbe25c7SJing Huang /*
2962a36c61f9SKrishna Gudipati  * Return state of rport.
2963a36c61f9SKrishna Gudipati  */
2964a36c61f9SKrishna Gudipati int
bfa_fcs_rport_get_state(struct bfa_fcs_rport_s * rport)2965a36c61f9SKrishna Gudipati bfa_fcs_rport_get_state(struct bfa_fcs_rport_s *rport)
2966a36c61f9SKrishna Gudipati {
2967a36c61f9SKrishna Gudipati 	return bfa_sm_to_state(rport_sm_table, rport->sm);
2968a36c61f9SKrishna Gudipati }
2969a36c61f9SKrishna Gudipati 
2970f7f73812SMaggie Zhang 
29715fbe25c7SJing Huang /*
2972a36c61f9SKrishna Gudipati  *	brief
2973a36c61f9SKrishna Gudipati  *		 Called by the Driver to set rport delete/ageout timeout
2974a36c61f9SKrishna Gudipati  *
2975a36c61f9SKrishna Gudipati  *	param[in]		rport timeout value in seconds.
2976a36c61f9SKrishna Gudipati  *
2977a36c61f9SKrishna Gudipati  *	return None
2978a36c61f9SKrishna Gudipati  */
2979a36c61f9SKrishna Gudipati void
bfa_fcs_rport_set_del_timeout(u8 rport_tmo)2980a36c61f9SKrishna Gudipati bfa_fcs_rport_set_del_timeout(u8 rport_tmo)
2981a36c61f9SKrishna Gudipati {
2982a36c61f9SKrishna Gudipati 	/* convert to Millisecs */
2983a36c61f9SKrishna Gudipati 	if (rport_tmo > 0)
2984a36c61f9SKrishna Gudipati 		bfa_fcs_rport_del_timeout = rport_tmo * 1000;
2985a36c61f9SKrishna Gudipati }
2986a36c61f9SKrishna Gudipati void
bfa_fcs_rport_prlo(struct bfa_fcs_rport_s * rport,__be16 ox_id)298750444a34SMaggie bfa_fcs_rport_prlo(struct bfa_fcs_rport_s *rport, __be16 ox_id)
2988a36c61f9SKrishna Gudipati {
2989a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
2990a36c61f9SKrishna Gudipati 
2991a36c61f9SKrishna Gudipati 	rport->prlo = BFA_TRUE;
2992a36c61f9SKrishna Gudipati 	rport->reply_oxid = ox_id;
2993a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rport, RPSM_EVENT_PRLO_RCVD);
2994a36c61f9SKrishna Gudipati }
2995a36c61f9SKrishna Gudipati 
299661ba4394SKrishna Gudipati /*
299761ba4394SKrishna Gudipati  * Called by BFAD to set the max limit on number of bfa_fcs_rport allocation
299861ba4394SKrishna Gudipati  * which limits number of concurrent logins to remote ports
299961ba4394SKrishna Gudipati  */
300061ba4394SKrishna Gudipati void
bfa_fcs_rport_set_max_logins(u32 max_logins)300161ba4394SKrishna Gudipati bfa_fcs_rport_set_max_logins(u32 max_logins)
300261ba4394SKrishna Gudipati {
300361ba4394SKrishna Gudipati 	if (max_logins > 0)
300461ba4394SKrishna Gudipati 		bfa_fcs_rport_max_logins = max_logins;
300561ba4394SKrishna Gudipati }
300661ba4394SKrishna Gudipati 
300760138066SKrishna Gudipati void
bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s * rport,struct bfa_rport_attr_s * rport_attr)300860138066SKrishna Gudipati bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport,
300960138066SKrishna Gudipati 		struct bfa_rport_attr_s *rport_attr)
301060138066SKrishna Gudipati {
301160138066SKrishna Gudipati 	struct bfa_rport_qos_attr_s qos_attr;
301260138066SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
301360138066SKrishna Gudipati 	bfa_port_speed_t rport_speed = rport->rpf.rpsc_speed;
30147ace27aeSKrishna Gudipati 	struct bfa_port_attr_s port_attr;
30157ace27aeSKrishna Gudipati 
30167ace27aeSKrishna Gudipati 	bfa_fcport_get_attr(rport->fcs->bfa, &port_attr);
3017a36c61f9SKrishna Gudipati 
301860138066SKrishna Gudipati 	memset(rport_attr, 0, sizeof(struct bfa_rport_attr_s));
301960138066SKrishna Gudipati 	memset(&qos_attr, 0, sizeof(struct bfa_rport_qos_attr_s));
302060138066SKrishna Gudipati 
302160138066SKrishna Gudipati 	rport_attr->pid = rport->pid;
302260138066SKrishna Gudipati 	rport_attr->pwwn = rport->pwwn;
302360138066SKrishna Gudipati 	rport_attr->nwwn = rport->nwwn;
302460138066SKrishna Gudipati 	rport_attr->cos_supported = rport->fc_cos;
302560138066SKrishna Gudipati 	rport_attr->df_sz = rport->maxfrsize;
302660138066SKrishna Gudipati 	rport_attr->state = bfa_fcs_rport_get_state(rport);
302760138066SKrishna Gudipati 	rport_attr->fc_cos = rport->fc_cos;
302860138066SKrishna Gudipati 	rport_attr->cisc = rport->cisc;
302960138066SKrishna Gudipati 	rport_attr->scsi_function = rport->scsi_function;
303060138066SKrishna Gudipati 	rport_attr->curr_speed  = rport->rpf.rpsc_speed;
303160138066SKrishna Gudipati 	rport_attr->assigned_speed  = rport->rpf.assigned_speed;
303260138066SKrishna Gudipati 
303361ba4394SKrishna Gudipati 	if (rport->bfa_rport) {
303460138066SKrishna Gudipati 		qos_attr.qos_priority = rport->bfa_rport->qos_attr.qos_priority;
303560138066SKrishna Gudipati 		qos_attr.qos_flow_id =
303660138066SKrishna Gudipati 			cpu_to_be32(rport->bfa_rport->qos_attr.qos_flow_id);
303761ba4394SKrishna Gudipati 	}
303860138066SKrishna Gudipati 	rport_attr->qos_attr = qos_attr;
303960138066SKrishna Gudipati 
304060138066SKrishna Gudipati 	rport_attr->trl_enforced = BFA_FALSE;
304160138066SKrishna Gudipati 	if (bfa_fcport_is_ratelim(port->fcs->bfa) &&
304260138066SKrishna Gudipati 	    (rport->scsi_function == BFA_RPORT_TARGET)) {
304360138066SKrishna Gudipati 		if (rport_speed == BFA_PORT_SPEED_UNKNOWN)
304460138066SKrishna Gudipati 			rport_speed =
304560138066SKrishna Gudipati 				bfa_fcport_get_ratelim_speed(rport->fcs->bfa);
304660138066SKrishna Gudipati 
30477ace27aeSKrishna Gudipati 		if ((bfa_fcs_lport_get_rport_max_speed(port) !=
30487ace27aeSKrishna Gudipati 		    BFA_PORT_SPEED_UNKNOWN) && (rport_speed < port_attr.speed))
304960138066SKrishna Gudipati 			rport_attr->trl_enforced = BFA_TRUE;
305060138066SKrishna Gudipati 	}
305160138066SKrishna Gudipati }
3052a36c61f9SKrishna Gudipati 
30535fbe25c7SJing Huang /*
3054a36c61f9SKrishna Gudipati  * Remote port implementation.
3055a36c61f9SKrishna Gudipati  */
3056a36c61f9SKrishna Gudipati 
30575fbe25c7SJing Huang /*
3058a36c61f9SKrishna Gudipati  *  fcs_rport_api FCS rport API.
3059a36c61f9SKrishna Gudipati  */
3060a36c61f9SKrishna Gudipati 
3061a36c61f9SKrishna Gudipati struct bfa_fcs_rport_s *
bfa_fcs_rport_lookup(struct bfa_fcs_lport_s * port,wwn_t rpwwn)3062a36c61f9SKrishna Gudipati bfa_fcs_rport_lookup(struct bfa_fcs_lport_s *port, wwn_t rpwwn)
3063a36c61f9SKrishna Gudipati {
3064a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
3065a36c61f9SKrishna Gudipati 
3066a36c61f9SKrishna Gudipati 	rport = bfa_fcs_lport_get_rport_by_pwwn(port, rpwwn);
3067a36c61f9SKrishna Gudipati 	if (rport == NULL) {
3068a36c61f9SKrishna Gudipati 		/*
3069a36c61f9SKrishna Gudipati 		 * TBD Error handling
3070a36c61f9SKrishna Gudipati 		 */
3071a36c61f9SKrishna Gudipati 	}
3072a36c61f9SKrishna Gudipati 
3073a36c61f9SKrishna Gudipati 	return rport;
3074a36c61f9SKrishna Gudipati }
3075a36c61f9SKrishna Gudipati 
3076a36c61f9SKrishna Gudipati struct bfa_fcs_rport_s *
bfa_fcs_rport_lookup_by_nwwn(struct bfa_fcs_lport_s * port,wwn_t rnwwn)3077a36c61f9SKrishna Gudipati bfa_fcs_rport_lookup_by_nwwn(struct bfa_fcs_lport_s *port, wwn_t rnwwn)
3078a36c61f9SKrishna Gudipati {
3079a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport;
3080a36c61f9SKrishna Gudipati 
3081a36c61f9SKrishna Gudipati 	rport = bfa_fcs_lport_get_rport_by_nwwn(port, rnwwn);
3082a36c61f9SKrishna Gudipati 	if (rport == NULL) {
3083a36c61f9SKrishna Gudipati 		/*
3084a36c61f9SKrishna Gudipati 		 * TBD Error handling
3085a36c61f9SKrishna Gudipati 		 */
3086a36c61f9SKrishna Gudipati 	}
3087a36c61f9SKrishna Gudipati 
3088a36c61f9SKrishna Gudipati 	return rport;
3089a36c61f9SKrishna Gudipati }
3090a36c61f9SKrishna Gudipati 
3091a36c61f9SKrishna Gudipati /*
3092a36c61f9SKrishna Gudipati  * Remote port features (RPF) implementation.
3093a36c61f9SKrishna Gudipati  */
3094a36c61f9SKrishna Gudipati 
3095a36c61f9SKrishna Gudipati #define BFA_FCS_RPF_RETRIES	(3)
3096a36c61f9SKrishna Gudipati #define BFA_FCS_RPF_RETRY_TIMEOUT  (1000) /* 1 sec (In millisecs) */
3097a36c61f9SKrishna Gudipati 
3098a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_send_rpsc2(void *rport_cbarg,
3099a36c61f9SKrishna Gudipati 				struct bfa_fcxp_s *fcxp_alloced);
3100a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_rpsc2_response(void *fcsarg,
3101a36c61f9SKrishna Gudipati 			struct bfa_fcxp_s *fcxp,
3102a36c61f9SKrishna Gudipati 			void *cbarg,
3103a36c61f9SKrishna Gudipati 			bfa_status_t req_status,
3104a36c61f9SKrishna Gudipati 			u32 rsp_len,
3105a36c61f9SKrishna Gudipati 			u32 resid_len,
3106a36c61f9SKrishna Gudipati 			struct fchs_s *rsp_fchs);
3107a36c61f9SKrishna Gudipati 
3108a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_timeout(void *arg);
3109a36c61f9SKrishna Gudipati 
31105fbe25c7SJing Huang /*
3111a36c61f9SKrishna Gudipati  *  fcs_rport_ftrs_sm FCS rport state machine events
3112a36c61f9SKrishna Gudipati  */
3113a36c61f9SKrishna Gudipati 
3114a36c61f9SKrishna Gudipati enum rpf_event {
3115a36c61f9SKrishna Gudipati 	RPFSM_EVENT_RPORT_OFFLINE  = 1, /* Rport offline		*/
3116a36c61f9SKrishna Gudipati 	RPFSM_EVENT_RPORT_ONLINE   = 2,	/* Rport online			*/
3117a36c61f9SKrishna Gudipati 	RPFSM_EVENT_FCXP_SENT      = 3,	/* Frame from has been sent	*/
3118a36c61f9SKrishna Gudipati 	RPFSM_EVENT_TIMEOUT	   = 4, /* Rport SM timeout event	*/
3119a36c61f9SKrishna Gudipati 	RPFSM_EVENT_RPSC_COMP      = 5,
3120a36c61f9SKrishna Gudipati 	RPFSM_EVENT_RPSC_FAIL      = 6,
3121a36c61f9SKrishna Gudipati 	RPFSM_EVENT_RPSC_ERROR     = 7,
3122a36c61f9SKrishna Gudipati };
3123a36c61f9SKrishna Gudipati 
3124a36c61f9SKrishna Gudipati static void	bfa_fcs_rpf_sm_uninit(struct bfa_fcs_rpf_s *rpf,
3125a36c61f9SKrishna Gudipati 					enum rpf_event event);
3126a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_sm_rpsc_sending(struct bfa_fcs_rpf_s *rpf,
3127a36c61f9SKrishna Gudipati 				       enum rpf_event event);
3128a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s *rpf,
3129a36c61f9SKrishna Gudipati 				       enum rpf_event event);
3130a36c61f9SKrishna Gudipati static void	bfa_fcs_rpf_sm_rpsc_retry(struct bfa_fcs_rpf_s *rpf,
3131a36c61f9SKrishna Gudipati 					enum rpf_event event);
3132a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_sm_offline(struct bfa_fcs_rpf_s *rpf,
3133a36c61f9SKrishna Gudipati 					enum rpf_event event);
3134a36c61f9SKrishna Gudipati static void     bfa_fcs_rpf_sm_online(struct bfa_fcs_rpf_s *rpf,
3135a36c61f9SKrishna Gudipati 					enum rpf_event event);
3136a36c61f9SKrishna Gudipati 
3137a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_sm_uninit(struct bfa_fcs_rpf_s * rpf,enum rpf_event event)3138a36c61f9SKrishna Gudipati bfa_fcs_rpf_sm_uninit(struct bfa_fcs_rpf_s *rpf, enum rpf_event event)
3139a36c61f9SKrishna Gudipati {
3140a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3141a36c61f9SKrishna Gudipati 	struct bfa_fcs_fabric_s *fabric = &rport->fcs->fabric;
3142a36c61f9SKrishna Gudipati 
3143a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
3144a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3145a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
3146a36c61f9SKrishna Gudipati 
3147a36c61f9SKrishna Gudipati 	switch (event) {
3148a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_ONLINE:
3149a36c61f9SKrishna Gudipati 		/* Send RPSC2 to a Brocade fabric only. */
3150a36c61f9SKrishna Gudipati 		if ((!BFA_FCS_PID_IS_WKA(rport->pid)) &&
3151f7f73812SMaggie Zhang 			((rport->port->fabric->lps->brcd_switch) ||
3152a36c61f9SKrishna Gudipati 			(bfa_fcs_fabric_get_switch_oui(fabric) ==
3153a36c61f9SKrishna Gudipati 						BFA_FCS_BRCD_SWITCH_OUI))) {
3154a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc_sending);
3155a36c61f9SKrishna Gudipati 			rpf->rpsc_retries = 0;
3156a36c61f9SKrishna Gudipati 			bfa_fcs_rpf_send_rpsc2(rpf, NULL);
3157a36c61f9SKrishna Gudipati 		}
3158a36c61f9SKrishna Gudipati 		break;
3159a36c61f9SKrishna Gudipati 
3160a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_OFFLINE:
3161a36c61f9SKrishna Gudipati 		break;
3162a36c61f9SKrishna Gudipati 
3163a36c61f9SKrishna Gudipati 	default:
3164a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
3165a36c61f9SKrishna Gudipati 	}
3166a36c61f9SKrishna Gudipati }
3167a36c61f9SKrishna Gudipati 
3168a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_sm_rpsc_sending(struct bfa_fcs_rpf_s * rpf,enum rpf_event event)3169a36c61f9SKrishna Gudipati bfa_fcs_rpf_sm_rpsc_sending(struct bfa_fcs_rpf_s *rpf, enum rpf_event event)
3170a36c61f9SKrishna Gudipati {
3171a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3172a36c61f9SKrishna Gudipati 
3173a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
3174a36c61f9SKrishna Gudipati 
3175a36c61f9SKrishna Gudipati 	switch (event) {
3176a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_FCXP_SENT:
3177a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc);
3178a36c61f9SKrishna Gudipati 		break;
3179a36c61f9SKrishna Gudipati 
3180a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_OFFLINE:
3181a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_offline);
3182a36c61f9SKrishna Gudipati 		bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rpf->fcxp_wqe);
3183a36c61f9SKrishna Gudipati 		rpf->rpsc_retries = 0;
3184a36c61f9SKrishna Gudipati 		break;
3185a36c61f9SKrishna Gudipati 
3186a36c61f9SKrishna Gudipati 	default:
3187a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
3188a36c61f9SKrishna Gudipati 	}
3189a36c61f9SKrishna Gudipati }
3190a36c61f9SKrishna Gudipati 
3191a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s * rpf,enum rpf_event event)3192a36c61f9SKrishna Gudipati bfa_fcs_rpf_sm_rpsc(struct bfa_fcs_rpf_s *rpf, enum rpf_event event)
3193a36c61f9SKrishna Gudipati {
3194a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3195a36c61f9SKrishna Gudipati 
3196a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3197a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
3198a36c61f9SKrishna Gudipati 
3199a36c61f9SKrishna Gudipati 	switch (event) {
3200a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPSC_COMP:
3201a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online);
3202a36c61f9SKrishna Gudipati 		/* Update speed info in f/w via BFA */
3203a36c61f9SKrishna Gudipati 		if (rpf->rpsc_speed != BFA_PORT_SPEED_UNKNOWN)
3204a36c61f9SKrishna Gudipati 			bfa_rport_speed(rport->bfa_rport, rpf->rpsc_speed);
3205a36c61f9SKrishna Gudipati 		else if (rpf->assigned_speed != BFA_PORT_SPEED_UNKNOWN)
3206a36c61f9SKrishna Gudipati 			bfa_rport_speed(rport->bfa_rport, rpf->assigned_speed);
3207a36c61f9SKrishna Gudipati 		break;
3208a36c61f9SKrishna Gudipati 
3209a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPSC_FAIL:
3210a36c61f9SKrishna Gudipati 		/* RPSC not supported by rport */
3211a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online);
3212a36c61f9SKrishna Gudipati 		break;
3213a36c61f9SKrishna Gudipati 
3214a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPSC_ERROR:
3215a36c61f9SKrishna Gudipati 		/* need to retry...delayed a bit. */
3216a36c61f9SKrishna Gudipati 		if (rpf->rpsc_retries++ < BFA_FCS_RPF_RETRIES) {
3217a36c61f9SKrishna Gudipati 			bfa_timer_start(rport->fcs->bfa, &rpf->timer,
3218a36c61f9SKrishna Gudipati 				    bfa_fcs_rpf_timeout, rpf,
3219a36c61f9SKrishna Gudipati 				    BFA_FCS_RPF_RETRY_TIMEOUT);
3220a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc_retry);
3221a36c61f9SKrishna Gudipati 		} else {
3222a36c61f9SKrishna Gudipati 			bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_online);
3223a36c61f9SKrishna Gudipati 		}
3224a36c61f9SKrishna Gudipati 		break;
3225a36c61f9SKrishna Gudipati 
3226a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_OFFLINE:
3227a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_offline);
3228a36c61f9SKrishna Gudipati 		bfa_fcxp_discard(rpf->fcxp);
3229a36c61f9SKrishna Gudipati 		rpf->rpsc_retries = 0;
3230a36c61f9SKrishna Gudipati 		break;
3231a36c61f9SKrishna Gudipati 
3232a36c61f9SKrishna Gudipati 	default:
3233a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
3234a36c61f9SKrishna Gudipati 	}
3235a36c61f9SKrishna Gudipati }
3236a36c61f9SKrishna Gudipati 
3237a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_sm_rpsc_retry(struct bfa_fcs_rpf_s * rpf,enum rpf_event event)3238a36c61f9SKrishna Gudipati bfa_fcs_rpf_sm_rpsc_retry(struct bfa_fcs_rpf_s *rpf, enum rpf_event event)
3239a36c61f9SKrishna Gudipati {
3240a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3241a36c61f9SKrishna Gudipati 
3242a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3243a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
3244a36c61f9SKrishna Gudipati 
3245a36c61f9SKrishna Gudipati 	switch (event) {
3246a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_TIMEOUT:
3247a36c61f9SKrishna Gudipati 		/* re-send the RPSC */
3248a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc_sending);
3249a36c61f9SKrishna Gudipati 		bfa_fcs_rpf_send_rpsc2(rpf, NULL);
3250a36c61f9SKrishna Gudipati 		break;
3251a36c61f9SKrishna Gudipati 
3252a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_OFFLINE:
3253a36c61f9SKrishna Gudipati 		bfa_timer_stop(&rpf->timer);
3254a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_offline);
3255a36c61f9SKrishna Gudipati 		rpf->rpsc_retries = 0;
3256a36c61f9SKrishna Gudipati 		break;
3257a36c61f9SKrishna Gudipati 
3258a36c61f9SKrishna Gudipati 	default:
3259a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
3260a36c61f9SKrishna Gudipati 	}
3261a36c61f9SKrishna Gudipati }
3262a36c61f9SKrishna Gudipati 
3263a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_sm_online(struct bfa_fcs_rpf_s * rpf,enum rpf_event event)3264a36c61f9SKrishna Gudipati bfa_fcs_rpf_sm_online(struct bfa_fcs_rpf_s *rpf, enum rpf_event event)
3265a36c61f9SKrishna Gudipati {
3266a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3267a36c61f9SKrishna Gudipati 
3268a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
3269a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3270a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
3271a36c61f9SKrishna Gudipati 
3272a36c61f9SKrishna Gudipati 	switch (event) {
3273a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_OFFLINE:
3274a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_offline);
3275a36c61f9SKrishna Gudipati 		rpf->rpsc_retries = 0;
3276a36c61f9SKrishna Gudipati 		break;
3277a36c61f9SKrishna Gudipati 
3278a36c61f9SKrishna Gudipati 	default:
3279a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
3280a36c61f9SKrishna Gudipati 	}
3281a36c61f9SKrishna Gudipati }
3282a36c61f9SKrishna Gudipati 
3283a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_sm_offline(struct bfa_fcs_rpf_s * rpf,enum rpf_event event)3284a36c61f9SKrishna Gudipati bfa_fcs_rpf_sm_offline(struct bfa_fcs_rpf_s *rpf, enum rpf_event event)
3285a36c61f9SKrishna Gudipati {
3286a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3287a36c61f9SKrishna Gudipati 
3288a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
3289a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3290a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, event);
3291a36c61f9SKrishna Gudipati 
3292a36c61f9SKrishna Gudipati 	switch (event) {
3293a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_ONLINE:
3294a36c61f9SKrishna Gudipati 		bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_rpsc_sending);
3295a36c61f9SKrishna Gudipati 		bfa_fcs_rpf_send_rpsc2(rpf, NULL);
3296a36c61f9SKrishna Gudipati 		break;
3297a36c61f9SKrishna Gudipati 
3298a36c61f9SKrishna Gudipati 	case RPFSM_EVENT_RPORT_OFFLINE:
3299a36c61f9SKrishna Gudipati 		break;
3300a36c61f9SKrishna Gudipati 
3301a36c61f9SKrishna Gudipati 	default:
3302a36c61f9SKrishna Gudipati 		bfa_sm_fault(rport->fcs, event);
3303a36c61f9SKrishna Gudipati 	}
3304a36c61f9SKrishna Gudipati }
33055fbe25c7SJing Huang /*
3306a36c61f9SKrishna Gudipati  * Called when Rport is created.
3307a36c61f9SKrishna Gudipati  */
3308a36c61f9SKrishna Gudipati void
bfa_fcs_rpf_init(struct bfa_fcs_rport_s * rport)3309a36c61f9SKrishna Gudipati bfa_fcs_rpf_init(struct bfa_fcs_rport_s *rport)
3310a36c61f9SKrishna Gudipati {
3311a36c61f9SKrishna Gudipati 	struct bfa_fcs_rpf_s *rpf = &rport->rpf;
3312a36c61f9SKrishna Gudipati 
3313a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3314a36c61f9SKrishna Gudipati 	rpf->rport = rport;
3315a36c61f9SKrishna Gudipati 
3316a36c61f9SKrishna Gudipati 	bfa_sm_set_state(rpf, bfa_fcs_rpf_sm_uninit);
3317a36c61f9SKrishna Gudipati }
3318a36c61f9SKrishna Gudipati 
33195fbe25c7SJing Huang /*
3320a36c61f9SKrishna Gudipati  * Called when Rport becomes online
3321a36c61f9SKrishna Gudipati  */
3322a36c61f9SKrishna Gudipati void
bfa_fcs_rpf_rport_online(struct bfa_fcs_rport_s * rport)3323a36c61f9SKrishna Gudipati bfa_fcs_rpf_rport_online(struct bfa_fcs_rport_s *rport)
3324a36c61f9SKrishna Gudipati {
3325a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3326a36c61f9SKrishna Gudipati 
3327a36c61f9SKrishna Gudipati 	if (__fcs_min_cfg(rport->port->fcs))
3328a36c61f9SKrishna Gudipati 		return;
3329a36c61f9SKrishna Gudipati 
3330a36c61f9SKrishna Gudipati 	if (bfa_fcs_fabric_is_switched(rport->port->fabric))
3331a36c61f9SKrishna Gudipati 		bfa_sm_send_event(&rport->rpf, RPFSM_EVENT_RPORT_ONLINE);
3332a36c61f9SKrishna Gudipati }
3333a36c61f9SKrishna Gudipati 
33345fbe25c7SJing Huang /*
3335a36c61f9SKrishna Gudipati  * Called when Rport becomes offline
3336a36c61f9SKrishna Gudipati  */
3337a36c61f9SKrishna Gudipati void
bfa_fcs_rpf_rport_offline(struct bfa_fcs_rport_s * rport)3338a36c61f9SKrishna Gudipati bfa_fcs_rpf_rport_offline(struct bfa_fcs_rport_s *rport)
3339a36c61f9SKrishna Gudipati {
3340a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3341a36c61f9SKrishna Gudipati 
3342a36c61f9SKrishna Gudipati 	if (__fcs_min_cfg(rport->port->fcs))
3343a36c61f9SKrishna Gudipati 		return;
3344a36c61f9SKrishna Gudipati 
3345a36c61f9SKrishna Gudipati 	rport->rpf.rpsc_speed = 0;
3346a36c61f9SKrishna Gudipati 	bfa_sm_send_event(&rport->rpf, RPFSM_EVENT_RPORT_OFFLINE);
3347a36c61f9SKrishna Gudipati }
3348a36c61f9SKrishna Gudipati 
3349a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_timeout(void * arg)3350a36c61f9SKrishna Gudipati bfa_fcs_rpf_timeout(void *arg)
3351a36c61f9SKrishna Gudipati {
3352a36c61f9SKrishna Gudipati 	struct bfa_fcs_rpf_s *rpf = (struct bfa_fcs_rpf_s *) arg;
3353a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3354a36c61f9SKrishna Gudipati 
3355a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pid);
3356a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rpf, RPFSM_EVENT_TIMEOUT);
3357a36c61f9SKrishna Gudipati }
3358a36c61f9SKrishna Gudipati 
3359a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_send_rpsc2(void * rpf_cbarg,struct bfa_fcxp_s * fcxp_alloced)3360a36c61f9SKrishna Gudipati bfa_fcs_rpf_send_rpsc2(void *rpf_cbarg, struct bfa_fcxp_s *fcxp_alloced)
3361a36c61f9SKrishna Gudipati {
3362a36c61f9SKrishna Gudipati 	struct bfa_fcs_rpf_s *rpf = (struct bfa_fcs_rpf_s *)rpf_cbarg;
3363a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3364a36c61f9SKrishna Gudipati 	struct bfa_fcs_lport_s *port = rport->port;
3365a36c61f9SKrishna Gudipati 	struct fchs_s	fchs;
3366a36c61f9SKrishna Gudipati 	int		len;
3367a36c61f9SKrishna Gudipati 	struct bfa_fcxp_s *fcxp;
3368a36c61f9SKrishna Gudipati 
3369a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, rport->pwwn);
3370a36c61f9SKrishna Gudipati 
3371c3f1b123SKrishna Gudipati 	fcxp = fcxp_alloced ? fcxp_alloced :
3372c3f1b123SKrishna Gudipati 	       bfa_fcs_fcxp_alloc(port->fcs, BFA_TRUE);
3373a36c61f9SKrishna Gudipati 	if (!fcxp) {
3374a36c61f9SKrishna Gudipati 		bfa_fcs_fcxp_alloc_wait(port->fcs->bfa, &rpf->fcxp_wqe,
3375c3f1b123SKrishna Gudipati 				bfa_fcs_rpf_send_rpsc2, rpf, BFA_TRUE);
3376a36c61f9SKrishna Gudipati 		return;
3377a36c61f9SKrishna Gudipati 	}
3378a36c61f9SKrishna Gudipati 	rpf->fcxp = fcxp;
3379a36c61f9SKrishna Gudipati 
3380a36c61f9SKrishna Gudipati 	len = fc_rpsc2_build(&fchs, bfa_fcxp_get_reqbuf(fcxp), rport->pid,
3381a36c61f9SKrishna Gudipati 			    bfa_fcs_lport_get_fcid(port), &rport->pid, 1);
3382a36c61f9SKrishna Gudipati 
3383a36c61f9SKrishna Gudipati 	bfa_fcxp_send(fcxp, NULL, port->fabric->vf_id, port->lp_tag, BFA_FALSE,
3384a36c61f9SKrishna Gudipati 			  FC_CLASS_3, len, &fchs, bfa_fcs_rpf_rpsc2_response,
3385a36c61f9SKrishna Gudipati 			  rpf, FC_MAX_PDUSZ, FC_ELS_TOV);
3386a36c61f9SKrishna Gudipati 	rport->stats.rpsc_sent++;
3387a36c61f9SKrishna Gudipati 	bfa_sm_send_event(rpf, RPFSM_EVENT_FCXP_SENT);
3388a36c61f9SKrishna Gudipati 
3389a36c61f9SKrishna Gudipati }
3390a36c61f9SKrishna Gudipati 
3391a36c61f9SKrishna Gudipati static void
bfa_fcs_rpf_rpsc2_response(void * fcsarg,struct bfa_fcxp_s * fcxp,void * cbarg,bfa_status_t req_status,u32 rsp_len,u32 resid_len,struct fchs_s * rsp_fchs)3392a36c61f9SKrishna Gudipati bfa_fcs_rpf_rpsc2_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
3393a36c61f9SKrishna Gudipati 			    bfa_status_t req_status, u32 rsp_len,
3394a36c61f9SKrishna Gudipati 			    u32 resid_len, struct fchs_s *rsp_fchs)
3395a36c61f9SKrishna Gudipati {
3396a36c61f9SKrishna Gudipati 	struct bfa_fcs_rpf_s *rpf = (struct bfa_fcs_rpf_s *) cbarg;
3397a36c61f9SKrishna Gudipati 	struct bfa_fcs_rport_s *rport = rpf->rport;
3398a36c61f9SKrishna Gudipati 	struct fc_ls_rjt_s *ls_rjt;
3399a36c61f9SKrishna Gudipati 	struct fc_rpsc2_acc_s *rpsc2_acc;
3400a36c61f9SKrishna Gudipati 	u16	num_ents;
3401a36c61f9SKrishna Gudipati 
3402a36c61f9SKrishna Gudipati 	bfa_trc(rport->fcs, req_status);
3403a36c61f9SKrishna Gudipati 
3404a36c61f9SKrishna Gudipati 	if (req_status != BFA_STATUS_OK) {
3405a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, req_status);
3406a36c61f9SKrishna Gudipati 		if (req_status == BFA_STATUS_ETIMER)
3407a36c61f9SKrishna Gudipati 			rport->stats.rpsc_failed++;
3408a36c61f9SKrishna Gudipati 		bfa_sm_send_event(rpf, RPFSM_EVENT_RPSC_ERROR);
3409a36c61f9SKrishna Gudipati 		return;
3410a36c61f9SKrishna Gudipati 	}
3411a36c61f9SKrishna Gudipati 
3412a36c61f9SKrishna Gudipati 	rpsc2_acc = (struct fc_rpsc2_acc_s *) BFA_FCXP_RSP_PLD(fcxp);
3413a36c61f9SKrishna Gudipati 	if (rpsc2_acc->els_cmd == FC_ELS_ACC) {
3414a36c61f9SKrishna Gudipati 		rport->stats.rpsc_accs++;
3415ba816ea8SJing Huang 		num_ents = be16_to_cpu(rpsc2_acc->num_pids);
3416a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, num_ents);
3417a36c61f9SKrishna Gudipati 		if (num_ents > 0) {
341836ec9712SVijaya Mohan Guvva 			WARN_ON(be32_to_cpu(rpsc2_acc->port_info[0].pid) !=
341936ec9712SVijaya Mohan Guvva 						bfa_ntoh3b(rport->pid));
3420a36c61f9SKrishna Gudipati 			bfa_trc(rport->fcs,
342136ec9712SVijaya Mohan Guvva 				be32_to_cpu(rpsc2_acc->port_info[0].pid));
3422a36c61f9SKrishna Gudipati 			bfa_trc(rport->fcs,
3423ba816ea8SJing Huang 				be16_to_cpu(rpsc2_acc->port_info[0].speed));
3424a36c61f9SKrishna Gudipati 			bfa_trc(rport->fcs,
3425ba816ea8SJing Huang 				be16_to_cpu(rpsc2_acc->port_info[0].index));
3426a36c61f9SKrishna Gudipati 			bfa_trc(rport->fcs,
3427a36c61f9SKrishna Gudipati 				rpsc2_acc->port_info[0].type);
3428a36c61f9SKrishna Gudipati 
3429a36c61f9SKrishna Gudipati 			if (rpsc2_acc->port_info[0].speed == 0) {
3430a36c61f9SKrishna Gudipati 				bfa_sm_send_event(rpf, RPFSM_EVENT_RPSC_ERROR);
3431a36c61f9SKrishna Gudipati 				return;
3432a36c61f9SKrishna Gudipati 			}
3433a36c61f9SKrishna Gudipati 
3434a36c61f9SKrishna Gudipati 			rpf->rpsc_speed = fc_rpsc_operspeed_to_bfa_speed(
3435ba816ea8SJing Huang 				be16_to_cpu(rpsc2_acc->port_info[0].speed));
3436a36c61f9SKrishna Gudipati 
3437a36c61f9SKrishna Gudipati 			bfa_sm_send_event(rpf, RPFSM_EVENT_RPSC_COMP);
3438a36c61f9SKrishna Gudipati 		}
3439a36c61f9SKrishna Gudipati 	} else {
3440a36c61f9SKrishna Gudipati 		ls_rjt = (struct fc_ls_rjt_s *) BFA_FCXP_RSP_PLD(fcxp);
3441a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, ls_rjt->reason_code);
3442a36c61f9SKrishna Gudipati 		bfa_trc(rport->fcs, ls_rjt->reason_code_expl);
3443a36c61f9SKrishna Gudipati 		rport->stats.rpsc_rejects++;
3444a36c61f9SKrishna Gudipati 		if (ls_rjt->reason_code == FC_LS_RJT_RSN_CMD_NOT_SUPP)
3445a36c61f9SKrishna Gudipati 			bfa_sm_send_event(rpf, RPFSM_EVENT_RPSC_FAIL);
3446a36c61f9SKrishna Gudipati 		else
3447a36c61f9SKrishna Gudipati 			bfa_sm_send_event(rpf, RPFSM_EVENT_RPSC_ERROR);
3448a36c61f9SKrishna Gudipati 	}
3449a36c61f9SKrishna Gudipati }
3450