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