aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/bfa/bfa_fcpim.c12
-rw-r--r--drivers/scsi/bfa/bfa_fcs.c8
-rw-r--r--drivers/scsi/bfa/bfa_fcs.h28
-rw-r--r--drivers/scsi/bfa/bfa_fcs_fcpim.c124
-rw-r--r--drivers/scsi/bfa/bfa_fcs_lport.c46
-rw-r--r--drivers/scsi/bfa/bfa_fcs_rport.c421
-rw-r--r--drivers/scsi/bfa/bfa_svc.c11
-rw-r--r--drivers/scsi/bfa/bfad.c4
-rw-r--r--drivers/scsi/bfa/bfad_bsg.c21
9 files changed, 497 insertions, 178 deletions
diff --git a/drivers/scsi/bfa/bfa_fcpim.c b/drivers/scsi/bfa/bfa_fcpim.c
index f0f80e282e39..1633963c66ca 100644
--- a/drivers/scsi/bfa/bfa_fcpim.c
+++ b/drivers/scsi/bfa/bfa_fcpim.c
@@ -1466,7 +1466,13 @@ bfa_status_t
1466bfa_itnim_get_ioprofile(struct bfa_itnim_s *itnim, 1466bfa_itnim_get_ioprofile(struct bfa_itnim_s *itnim,
1467 struct bfa_itnim_ioprofile_s *ioprofile) 1467 struct bfa_itnim_ioprofile_s *ioprofile)
1468{ 1468{
1469 struct bfa_fcpim_s *fcpim = BFA_FCPIM(itnim->bfa); 1469 struct bfa_fcpim_s *fcpim;
1470
1471 if (!itnim)
1472 return BFA_STATUS_NO_FCPIM_NEXUS;
1473
1474 fcpim = BFA_FCPIM(itnim->bfa);
1475
1470 if (!fcpim->io_profile) 1476 if (!fcpim->io_profile)
1471 return BFA_STATUS_IOPROFILE_OFF; 1477 return BFA_STATUS_IOPROFILE_OFF;
1472 1478
@@ -1484,6 +1490,10 @@ void
1484bfa_itnim_clear_stats(struct bfa_itnim_s *itnim) 1490bfa_itnim_clear_stats(struct bfa_itnim_s *itnim)
1485{ 1491{
1486 int j; 1492 int j;
1493
1494 if (!itnim)
1495 return;
1496
1487 memset(&itnim->stats, 0, sizeof(itnim->stats)); 1497 memset(&itnim->stats, 0, sizeof(itnim->stats));
1488 memset(&itnim->ioprofile, 0, sizeof(itnim->ioprofile)); 1498 memset(&itnim->ioprofile, 0, sizeof(itnim->ioprofile));
1489 for (j = 0; j < BFA_IOBUCKET_MAX; j++) 1499 for (j = 0; j < BFA_IOBUCKET_MAX; j++)
diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c
index 2139592aca5e..fd3e84d32bd2 100644
--- a/drivers/scsi/bfa/bfa_fcs.c
+++ b/drivers/scsi/bfa/bfa_fcs.c
@@ -76,6 +76,7 @@ bfa_fcs_attach(struct bfa_fcs_s *fcs, struct bfa_s *bfa, struct bfad_s *bfad,
76 fcs->bfa = bfa; 76 fcs->bfa = bfa;
77 fcs->bfad = bfad; 77 fcs->bfad = bfad;
78 fcs->min_cfg = min_cfg; 78 fcs->min_cfg = min_cfg;
79 fcs->num_rport_logins = 0;
79 80
80 bfa->fcs = BFA_TRUE; 81 bfa->fcs = BFA_TRUE;
81 fcbuild_init(); 82 fcbuild_init();
@@ -1384,8 +1385,11 @@ bfa_fcs_fabric_uf_recv(struct bfa_fcs_fabric_s *fabric, struct fchs_s *fchs,
1384 return; 1385 return;
1385 } 1386 }
1386 } 1387 }
1387 bfa_trc(fabric->fcs, els_cmd->els_code); 1388
1388 bfa_fcs_lport_uf_recv(&fabric->bport, fchs, len); 1389 if (!bfa_fcs_fabric_is_switched(fabric))
1390 bfa_fcs_lport_uf_recv(&fabric->bport, fchs, len);
1391
1392 bfa_trc(fabric->fcs, fchs->type);
1389} 1393}
1390 1394
1391/* 1395/*
diff --git a/drivers/scsi/bfa/bfa_fcs.h b/drivers/scsi/bfa/bfa_fcs.h
index 2b35f1b6e4f4..6c4377cb287f 100644
--- a/drivers/scsi/bfa/bfa_fcs.h
+++ b/drivers/scsi/bfa/bfa_fcs.h
@@ -64,8 +64,7 @@ struct bfa_fcs_s;
64#define BFA_FCS_RETRY_TIMEOUT 2000 64#define BFA_FCS_RETRY_TIMEOUT 2000
65#define BFA_FCS_MAX_NS_RETRIES 5 65#define BFA_FCS_MAX_NS_RETRIES 5
66#define BFA_FCS_PID_IS_WKA(pid) ((bfa_ntoh3b(pid) > 0xFFF000) ? 1 : 0) 66#define BFA_FCS_PID_IS_WKA(pid) ((bfa_ntoh3b(pid) > 0xFFF000) ? 1 : 0)
67 67#define BFA_FCS_MAX_RPORT_LOGINS 1024
68
69 68
70struct bfa_fcs_lport_ns_s { 69struct bfa_fcs_lport_ns_s {
71 bfa_sm_t sm; /* state machine */ 70 bfa_sm_t sm; /* state machine */
@@ -472,7 +471,7 @@ struct bfa_fcs_rport_s *bfa_fcs_rport_lookup(struct bfa_fcs_lport_s *port,
472struct bfa_fcs_rport_s *bfa_fcs_rport_lookup_by_nwwn( 471struct bfa_fcs_rport_s *bfa_fcs_rport_lookup_by_nwwn(
473 struct bfa_fcs_lport_s *port, wwn_t rnwwn); 472 struct bfa_fcs_lport_s *port, wwn_t rnwwn);
474void bfa_fcs_rport_set_del_timeout(u8 rport_tmo); 473void bfa_fcs_rport_set_del_timeout(u8 rport_tmo);
475 474void bfa_fcs_rport_set_max_logins(u32 max_logins);
476void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, 475void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport,
477 struct fchs_s *fchs, u16 len); 476 struct fchs_s *fchs, u16 len);
478void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport); 477void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport);
@@ -606,7 +605,7 @@ bfa_status_t bfa_fcs_itnim_stats_clear(struct bfa_fcs_lport_s *port,
606struct bfa_fcs_itnim_s *bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport); 605struct bfa_fcs_itnim_s *bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport);
607void bfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim); 606void bfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim);
608void bfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim); 607void bfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim);
609void bfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim); 608void bfa_fcs_itnim_brp_online(struct bfa_fcs_itnim_s *itnim);
610bfa_status_t bfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim); 609bfa_status_t bfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim);
611void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim); 610void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim);
612void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, 611void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim,
@@ -690,6 +689,7 @@ struct bfa_fcs_s {
690 struct bfa_fcs_stats_s stats; /* FCS statistics */ 689 struct bfa_fcs_stats_s stats; /* FCS statistics */
691 struct bfa_wc_s wc; /* waiting counter */ 690 struct bfa_wc_s wc; /* waiting counter */
692 int fcs_aen_seq; 691 int fcs_aen_seq;
692 u32 num_rport_logins;
693}; 693};
694 694
695/* 695/*
@@ -744,6 +744,26 @@ enum rport_event {
744 RPSM_EVENT_ADDRESS_DISC = 16, /* Need to Discover rport's PID */ 744 RPSM_EVENT_ADDRESS_DISC = 16, /* Need to Discover rport's PID */
745 RPSM_EVENT_PRLO_RCVD = 17, /* PRLO from remote device */ 745 RPSM_EVENT_PRLO_RCVD = 17, /* PRLO from remote device */
746 RPSM_EVENT_PLOGI_RETRY = 18, /* Retry PLOGI continuously */ 746 RPSM_EVENT_PLOGI_RETRY = 18, /* Retry PLOGI continuously */
747 RPSM_EVENT_FC4_FCS_ONLINE = 19, /*!< FC-4 FCS online complete */
748};
749
750/*
751 * fcs_itnim_sm FCS itnim state machine events
752 */
753enum bfa_fcs_itnim_event {
754 BFA_FCS_ITNIM_SM_FCS_ONLINE = 1, /* rport online event */
755 BFA_FCS_ITNIM_SM_OFFLINE = 2, /* rport offline */
756 BFA_FCS_ITNIM_SM_FRMSENT = 3, /* prli frame is sent */
757 BFA_FCS_ITNIM_SM_RSP_OK = 4, /* good response */
758 BFA_FCS_ITNIM_SM_RSP_ERROR = 5, /* error response */
759 BFA_FCS_ITNIM_SM_TIMEOUT = 6, /* delay timeout */
760 BFA_FCS_ITNIM_SM_HCB_OFFLINE = 7, /* BFA online callback */
761 BFA_FCS_ITNIM_SM_HCB_ONLINE = 8, /* BFA offline callback */
762 BFA_FCS_ITNIM_SM_INITIATOR = 9, /* rport is initiator */
763 BFA_FCS_ITNIM_SM_DELETE = 10, /* delete event from rport */
764 BFA_FCS_ITNIM_SM_PRLO = 11, /* delete event from rport */
765 BFA_FCS_ITNIM_SM_RSP_NOT_SUPP = 12, /* cmd not supported rsp */
766 BFA_FCS_ITNIM_SM_HAL_ONLINE = 13, /*!< bfa rport online event */
747}; 767};
748 768
749/* 769/*
diff --git a/drivers/scsi/bfa/bfa_fcs_fcpim.c b/drivers/scsi/bfa/bfa_fcs_fcpim.c
index 59c062f71f6e..6dc7926a3edd 100644
--- a/drivers/scsi/bfa/bfa_fcs_fcpim.c
+++ b/drivers/scsi/bfa/bfa_fcs_fcpim.c
@@ -40,25 +40,6 @@ static void bfa_fcs_itnim_prli_response(void *fcsarg,
40static void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, 40static void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim,
41 enum bfa_itnim_aen_event event); 41 enum bfa_itnim_aen_event event);
42 42
43/*
44 * fcs_itnim_sm FCS itnim state machine events
45 */
46
47enum bfa_fcs_itnim_event {
48 BFA_FCS_ITNIM_SM_ONLINE = 1, /* rport online event */
49 BFA_FCS_ITNIM_SM_OFFLINE = 2, /* rport offline */
50 BFA_FCS_ITNIM_SM_FRMSENT = 3, /* prli frame is sent */
51 BFA_FCS_ITNIM_SM_RSP_OK = 4, /* good response */
52 BFA_FCS_ITNIM_SM_RSP_ERROR = 5, /* error response */
53 BFA_FCS_ITNIM_SM_TIMEOUT = 6, /* delay timeout */
54 BFA_FCS_ITNIM_SM_HCB_OFFLINE = 7, /* BFA online callback */
55 BFA_FCS_ITNIM_SM_HCB_ONLINE = 8, /* BFA offline callback */
56 BFA_FCS_ITNIM_SM_INITIATOR = 9, /* rport is initiator */
57 BFA_FCS_ITNIM_SM_DELETE = 10, /* delete event from rport */
58 BFA_FCS_ITNIM_SM_PRLO = 11, /* delete event from rport */
59 BFA_FCS_ITNIM_SM_RSP_NOT_SUPP = 12, /* cmd not supported rsp */
60};
61
62static void bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, 43static void bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
63 enum bfa_fcs_itnim_event event); 44 enum bfa_fcs_itnim_event event);
64static void bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, 45static void bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
@@ -69,6 +50,8 @@ static void bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
69 enum bfa_fcs_itnim_event event); 50 enum bfa_fcs_itnim_event event);
70static void bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, 51static void bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
71 enum bfa_fcs_itnim_event event); 52 enum bfa_fcs_itnim_event event);
53static void bfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim,
54 enum bfa_fcs_itnim_event event);
72static void bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, 55static void bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim,
73 enum bfa_fcs_itnim_event event); 56 enum bfa_fcs_itnim_event event);
74static void bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, 57static void bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim,
@@ -99,7 +82,7 @@ bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
99 bfa_trc(itnim->fcs, event); 82 bfa_trc(itnim->fcs, event);
100 83
101 switch (event) { 84 switch (event) {
102 case BFA_FCS_ITNIM_SM_ONLINE: 85 case BFA_FCS_ITNIM_SM_FCS_ONLINE:
103 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 86 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
104 itnim->prli_retries = 0; 87 itnim->prli_retries = 0;
105 bfa_fcs_itnim_send_prli(itnim, NULL); 88 bfa_fcs_itnim_send_prli(itnim, NULL);
@@ -138,6 +121,7 @@ bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim,
138 case BFA_FCS_ITNIM_SM_INITIATOR: 121 case BFA_FCS_ITNIM_SM_INITIATOR:
139 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 122 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
140 bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe); 123 bfa_fcxp_walloc_cancel(itnim->fcs->bfa, &itnim->fcxp_wqe);
124 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
141 break; 125 break;
142 126
143 case BFA_FCS_ITNIM_SM_OFFLINE: 127 case BFA_FCS_ITNIM_SM_OFFLINE:
@@ -166,12 +150,13 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
166 150
167 switch (event) { 151 switch (event) {
168 case BFA_FCS_ITNIM_SM_RSP_OK: 152 case BFA_FCS_ITNIM_SM_RSP_OK:
169 if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR) { 153 if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR)
170 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 154 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
171 } else { 155 else
172 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online); 156 bfa_sm_set_state(itnim,
173 bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec); 157 bfa_fcs_itnim_sm_hal_rport_online);
174 } 158
159 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
175 break; 160 break;
176 161
177 case BFA_FCS_ITNIM_SM_RSP_ERROR: 162 case BFA_FCS_ITNIM_SM_RSP_ERROR:
@@ -194,6 +179,7 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
194 case BFA_FCS_ITNIM_SM_INITIATOR: 179 case BFA_FCS_ITNIM_SM_INITIATOR:
195 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 180 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
196 bfa_fcxp_discard(itnim->fcxp); 181 bfa_fcxp_discard(itnim->fcxp);
182 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
197 break; 183 break;
198 184
199 case BFA_FCS_ITNIM_SM_DELETE: 185 case BFA_FCS_ITNIM_SM_DELETE:
@@ -208,6 +194,44 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
208} 194}
209 195
210static void 196static void
197bfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim,
198 enum bfa_fcs_itnim_event event)
199{
200 bfa_trc(itnim->fcs, itnim->rport->pwwn);
201 bfa_trc(itnim->fcs, event);
202
203 switch (event) {
204 case BFA_FCS_ITNIM_SM_HAL_ONLINE:
205 if (!itnim->bfa_itnim)
206 itnim->bfa_itnim = bfa_itnim_create(itnim->fcs->bfa,
207 itnim->rport->bfa_rport, itnim);
208
209 if (itnim->bfa_itnim) {
210 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online);
211 bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec);
212 } else {
213 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
214 bfa_sm_send_event(itnim->rport, RPSM_EVENT_DELETE);
215 }
216
217 break;
218
219 case BFA_FCS_ITNIM_SM_OFFLINE:
220 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
221 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
222 break;
223
224 case BFA_FCS_ITNIM_SM_DELETE:
225 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
226 bfa_fcs_itnim_free(itnim);
227 break;
228
229 default:
230 bfa_sm_fault(itnim->fcs, event);
231 }
232}
233
234static void
211bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, 235bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
212 enum bfa_fcs_itnim_event event) 236 enum bfa_fcs_itnim_event event)
213{ 237{
@@ -238,6 +262,7 @@ bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
238 case BFA_FCS_ITNIM_SM_INITIATOR: 262 case BFA_FCS_ITNIM_SM_INITIATOR:
239 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 263 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
240 bfa_timer_stop(&itnim->timer); 264 bfa_timer_stop(&itnim->timer);
265 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
241 break; 266 break;
242 267
243 case BFA_FCS_ITNIM_SM_DELETE: 268 case BFA_FCS_ITNIM_SM_DELETE:
@@ -275,9 +300,8 @@ bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim,
275 break; 300 break;
276 301
277 case BFA_FCS_ITNIM_SM_OFFLINE: 302 case BFA_FCS_ITNIM_SM_OFFLINE:
278 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline); 303 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_offline);
279 bfa_itnim_offline(itnim->bfa_itnim); 304 bfa_itnim_offline(itnim->bfa_itnim);
280 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
281 break; 305 break;
282 306
283 case BFA_FCS_ITNIM_SM_DELETE: 307 case BFA_FCS_ITNIM_SM_DELETE:
@@ -372,8 +396,14 @@ bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim,
372 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE); 396 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_OFFLINE);
373 break; 397 break;
374 398
399 /*
400 * fcs_online is expected here for well known initiator ports
401 */
402 case BFA_FCS_ITNIM_SM_FCS_ONLINE:
403 bfa_sm_send_event(itnim->rport, RPSM_EVENT_FC4_FCS_ONLINE);
404 break;
405
375 case BFA_FCS_ITNIM_SM_RSP_ERROR: 406 case BFA_FCS_ITNIM_SM_RSP_ERROR:
376 case BFA_FCS_ITNIM_SM_ONLINE:
377 case BFA_FCS_ITNIM_SM_INITIATOR: 407 case BFA_FCS_ITNIM_SM_INITIATOR:
378 break; 408 break;
379 409
@@ -484,7 +514,7 @@ bfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
484 if (prli_resp->parampage.servparams.initiator) { 514 if (prli_resp->parampage.servparams.initiator) {
485 bfa_trc(itnim->fcs, prli_resp->parampage.type); 515 bfa_trc(itnim->fcs, prli_resp->parampage.type);
486 itnim->rport->scsi_function = 516 itnim->rport->scsi_function =
487 BFA_RPORT_INITIATOR; 517 BFA_RPORT_INITIATOR;
488 itnim->stats.prli_rsp_acc++; 518 itnim->stats.prli_rsp_acc++;
489 itnim->stats.initiator++; 519 itnim->stats.initiator++;
490 bfa_sm_send_event(itnim, 520 bfa_sm_send_event(itnim,
@@ -532,7 +562,11 @@ bfa_fcs_itnim_timeout(void *arg)
532static void 562static void
533bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim) 563bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim)
534{ 564{
535 bfa_itnim_delete(itnim->bfa_itnim); 565 if (itnim->bfa_itnim) {
566 bfa_itnim_delete(itnim->bfa_itnim);
567 itnim->bfa_itnim = NULL;
568 }
569
536 bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv); 570 bfa_fcb_itnim_free(itnim->fcs->bfad, itnim->itnim_drv);
537} 571}
538 572
@@ -553,7 +587,6 @@ bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport)
553 struct bfa_fcs_lport_s *port = rport->port; 587 struct bfa_fcs_lport_s *port = rport->port;
554 struct bfa_fcs_itnim_s *itnim; 588 struct bfa_fcs_itnim_s *itnim;
555 struct bfad_itnim_s *itnim_drv; 589 struct bfad_itnim_s *itnim_drv;
556 struct bfa_itnim_s *bfa_itnim;
557 590
558 /* 591 /*
559 * call bfad to allocate the itnim 592 * call bfad to allocate the itnim
@@ -571,20 +604,7 @@ bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport)
571 itnim->fcs = rport->fcs; 604 itnim->fcs = rport->fcs;
572 itnim->itnim_drv = itnim_drv; 605 itnim->itnim_drv = itnim_drv;
573 606
574 /* 607 itnim->bfa_itnim = NULL;
575 * call BFA to create the itnim
576 */
577 bfa_itnim =
578 bfa_itnim_create(port->fcs->bfa, rport->bfa_rport, itnim);
579
580 if (bfa_itnim == NULL) {
581 bfa_trc(port->fcs, rport->pwwn);
582 bfa_fcb_itnim_free(port->fcs->bfad, itnim_drv);
583 WARN_ON(1);
584 return NULL;
585 }
586
587 itnim->bfa_itnim = bfa_itnim;
588 itnim->seq_rec = BFA_FALSE; 608 itnim->seq_rec = BFA_FALSE;
589 itnim->rec_support = BFA_FALSE; 609 itnim->rec_support = BFA_FALSE;
590 itnim->conf_comp = BFA_FALSE; 610 itnim->conf_comp = BFA_FALSE;
@@ -614,20 +634,12 @@ bfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim)
614 * Notification from rport that PLOGI is complete to initiate FC-4 session. 634 * Notification from rport that PLOGI is complete to initiate FC-4 session.
615 */ 635 */
616void 636void
617bfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim) 637bfa_fcs_itnim_brp_online(struct bfa_fcs_itnim_s *itnim)
618{ 638{
619 itnim->stats.onlines++; 639 itnim->stats.onlines++;
620 640
621 if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid)) { 641 if (!BFA_FCS_PID_IS_WKA(itnim->rport->pid))
622 bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_ONLINE); 642 bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_HAL_ONLINE);
623 } else {
624 /*
625 * For well known addresses, we set the itnim to initiator
626 * state
627 */
628 itnim->stats.initiator++;
629 bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_INITIATOR);
630 }
631} 643}
632 644
633/* 645/*
diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c
index d4a4d534843d..3b75f6fb2de1 100644
--- a/drivers/scsi/bfa/bfa_fcs_lport.c
+++ b/drivers/scsi/bfa/bfa_fcs_lport.c
@@ -4691,6 +4691,10 @@ bfa_fcs_lport_ns_process_gidft_pids(struct bfa_fcs_lport_s *port, u32 *pid_buf,
4691 struct fcgs_gidft_resp_s *gidft_entry; 4691 struct fcgs_gidft_resp_s *gidft_entry;
4692 struct bfa_fcs_rport_s *rport; 4692 struct bfa_fcs_rport_s *rport;
4693 u32 ii; 4693 u32 ii;
4694 struct bfa_fcs_fabric_s *fabric = port->fabric;
4695 struct bfa_fcs_vport_s *vport;
4696 struct list_head *qe;
4697 u8 found = 0;
4694 4698
4695 for (ii = 0; ii < n_pids; ii++) { 4699 for (ii = 0; ii < n_pids; ii++) {
4696 gidft_entry = (struct fcgs_gidft_resp_s *) &pid_buf[ii]; 4700 gidft_entry = (struct fcgs_gidft_resp_s *) &pid_buf[ii];
@@ -4699,6 +4703,29 @@ bfa_fcs_lport_ns_process_gidft_pids(struct bfa_fcs_lport_s *port, u32 *pid_buf,
4699 continue; 4703 continue;
4700 4704
4701 /* 4705 /*
4706 * Ignore PID if it is of base port
4707 * (Avoid vports discovering base port as remote port)
4708 */
4709 if (gidft_entry->pid == fabric->bport.pid)
4710 continue;
4711
4712 /*
4713 * Ignore PID if it is of vport created on the same base port
4714 * (Avoid vport discovering every other vport created on the
4715 * same port as remote port)
4716 */
4717 list_for_each(qe, &fabric->vport_q) {
4718 vport = (struct bfa_fcs_vport_s *) qe;
4719 if (vport->lport.pid == gidft_entry->pid)
4720 found = 1;
4721 }
4722
4723 if (found) {
4724 found = 0;
4725 continue;
4726 }
4727
4728 /*
4702 * Check if this rport already exists 4729 * Check if this rport already exists
4703 */ 4730 */
4704 rport = bfa_fcs_lport_get_rport_by_pid(port, gidft_entry->pid); 4731 rport = bfa_fcs_lport_get_rport_by_pid(port, gidft_entry->pid);
@@ -4765,7 +4792,8 @@ bfa_fcs_lport_ns_query(struct bfa_fcs_lport_s *port)
4765 struct bfa_fcs_lport_ns_s *ns = BFA_FCS_GET_NS_FROM_PORT(port); 4792 struct bfa_fcs_lport_ns_s *ns = BFA_FCS_GET_NS_FROM_PORT(port);
4766 4793
4767 bfa_trc(port->fcs, port->pid); 4794 bfa_trc(port->fcs, port->pid);
4768 bfa_sm_send_event(ns, NSSM_EVENT_NS_QUERY); 4795 if (bfa_sm_cmp_state(ns, bfa_fcs_lport_ns_sm_online))
4796 bfa_sm_send_event(ns, NSSM_EVENT_NS_QUERY);
4769} 4797}
4770 4798
4771static void 4799static void
@@ -5183,10 +5211,26 @@ static void
5183bfa_fcs_lport_scn_portid_rscn(struct bfa_fcs_lport_s *port, u32 rpid) 5211bfa_fcs_lport_scn_portid_rscn(struct bfa_fcs_lport_s *port, u32 rpid)
5184{ 5212{
5185 struct bfa_fcs_rport_s *rport; 5213 struct bfa_fcs_rport_s *rport;
5214 struct bfa_fcs_fabric_s *fabric = port->fabric;
5215 struct bfa_fcs_vport_s *vport;
5216 struct list_head *qe;
5186 5217
5187 bfa_trc(port->fcs, rpid); 5218 bfa_trc(port->fcs, rpid);
5188 5219
5189 /* 5220 /*
5221 * Ignore PID if it is of base port or of vports created on the
5222 * same base port. It is to avoid vports discovering base port or
5223 * other vports created on same base port as remote port
5224 */
5225 if (rpid == fabric->bport.pid)
5226 return;
5227
5228 list_for_each(qe, &fabric->vport_q) {
5229 vport = (struct bfa_fcs_vport_s *) qe;
5230 if (vport->lport.pid == rpid)
5231 return;
5232 }
5233 /*
5190 * If this is an unknown device, then it just came online. 5234 * If this is an unknown device, then it just came online.
5191 * Otherwise let rport handle the RSCN event. 5235 * Otherwise let rport handle the RSCN event.
5192 */ 5236 */
diff --git a/drivers/scsi/bfa/bfa_fcs_rport.c b/drivers/scsi/bfa/bfa_fcs_rport.c
index 8efa3a3ded1d..cc43b2a58ce3 100644
--- a/drivers/scsi/bfa/bfa_fcs_rport.c
+++ b/drivers/scsi/bfa/bfa_fcs_rport.c
@@ -30,14 +30,22 @@ static u32
30bfa_fcs_rport_del_timeout = BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000; 30bfa_fcs_rport_del_timeout = BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000;
31 /* In millisecs */ 31 /* In millisecs */
32/* 32/*
33 * bfa_fcs_rport_max_logins is max count of bfa_fcs_rports
34 * whereas DEF_CFG_NUM_RPORTS is max count of bfa_rports
35 */
36static u32 bfa_fcs_rport_max_logins = BFA_FCS_MAX_RPORT_LOGINS;
37
38/*
33 * forward declarations 39 * forward declarations
34 */ 40 */
35static struct bfa_fcs_rport_s *bfa_fcs_rport_alloc( 41static struct bfa_fcs_rport_s *bfa_fcs_rport_alloc(
36 struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid); 42 struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid);
37static void bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport); 43static void bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport);
38static void bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport); 44static void bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport);
39static void bfa_fcs_rport_online_action(struct bfa_fcs_rport_s *rport); 45static void bfa_fcs_rport_fcs_online_action(struct bfa_fcs_rport_s *rport);
40static void bfa_fcs_rport_offline_action(struct bfa_fcs_rport_s *rport); 46static void bfa_fcs_rport_hal_online_action(struct bfa_fcs_rport_s *rport);
47static void bfa_fcs_rport_fcs_offline_action(struct bfa_fcs_rport_s *rport);
48static void bfa_fcs_rport_hal_offline_action(struct bfa_fcs_rport_s *rport);
41static void bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport, 49static void bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport,
42 struct fc_logi_s *plogi); 50 struct fc_logi_s *plogi);
43static void bfa_fcs_rport_timeout(void *arg); 51static void bfa_fcs_rport_timeout(void *arg);
@@ -76,6 +84,7 @@ static void bfa_fcs_rport_send_ls_rjt(struct bfa_fcs_rport_s *rport,
76static void bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s *rport, 84static void bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s *rport,
77 struct fchs_s *rx_fchs, u16 len); 85 struct fchs_s *rx_fchs, u16 len);
78static void bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s *rport); 86static void bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s *rport);
87static void bfa_fcs_rport_hal_offline(struct bfa_fcs_rport_s *rport);
79 88
80static void bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport, 89static void bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport,
81 enum rport_event event); 90 enum rport_event event);
@@ -87,6 +96,8 @@ static void bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
87 enum rport_event event); 96 enum rport_event event);
88static void bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, 97static void bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport,
89 enum rport_event event); 98 enum rport_event event);
99static void bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s *rport,
100 enum rport_event event);
90static void bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport, 101static void bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport,
91 enum rport_event event); 102 enum rport_event event);
92static void bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, 103static void bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport,
@@ -123,6 +134,10 @@ static void bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
123 enum rport_event event); 134 enum rport_event event);
124static void bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport, 135static void bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
125 enum rport_event event); 136 enum rport_event event);
137static void bfa_fcs_rport_sm_fc4_off_delete(struct bfa_fcs_rport_s *rport,
138 enum rport_event event);
139static void bfa_fcs_rport_sm_delete_pending(struct bfa_fcs_rport_s *rport,
140 enum rport_event event);
126 141
127static struct bfa_sm_table_s rport_sm_table[] = { 142static struct bfa_sm_table_s rport_sm_table[] = {
128 {BFA_SM(bfa_fcs_rport_sm_uninit), BFA_RPORT_UNINIT}, 143 {BFA_SM(bfa_fcs_rport_sm_uninit), BFA_RPORT_UNINIT},
@@ -130,6 +145,7 @@ static struct bfa_sm_table_s rport_sm_table[] = {
130 {BFA_SM(bfa_fcs_rport_sm_plogiacc_sending), BFA_RPORT_ONLINE}, 145 {BFA_SM(bfa_fcs_rport_sm_plogiacc_sending), BFA_RPORT_ONLINE},
131 {BFA_SM(bfa_fcs_rport_sm_plogi_retry), BFA_RPORT_PLOGI_RETRY}, 146 {BFA_SM(bfa_fcs_rport_sm_plogi_retry), BFA_RPORT_PLOGI_RETRY},
132 {BFA_SM(bfa_fcs_rport_sm_plogi), BFA_RPORT_PLOGI}, 147 {BFA_SM(bfa_fcs_rport_sm_plogi), BFA_RPORT_PLOGI},
148 {BFA_SM(bfa_fcs_rport_sm_fc4_fcs_online), BFA_RPORT_ONLINE},
133 {BFA_SM(bfa_fcs_rport_sm_hal_online), BFA_RPORT_ONLINE}, 149 {BFA_SM(bfa_fcs_rport_sm_hal_online), BFA_RPORT_ONLINE},
134 {BFA_SM(bfa_fcs_rport_sm_online), BFA_RPORT_ONLINE}, 150 {BFA_SM(bfa_fcs_rport_sm_online), BFA_RPORT_ONLINE},
135 {BFA_SM(bfa_fcs_rport_sm_nsquery_sending), BFA_RPORT_NSQUERY}, 151 {BFA_SM(bfa_fcs_rport_sm_nsquery_sending), BFA_RPORT_NSQUERY},
@@ -167,8 +183,8 @@ bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport, enum rport_event event)
167 break; 183 break;
168 184
169 case RPSM_EVENT_PLOGI_RCVD: 185 case RPSM_EVENT_PLOGI_RCVD:
170 bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogiacc_sending); 186 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
171 bfa_fcs_rport_send_plogiacc(rport, NULL); 187 bfa_fcs_rport_fcs_online_action(rport);
172 break; 188 break;
173 189
174 case RPSM_EVENT_PLOGI_COMP: 190 case RPSM_EVENT_PLOGI_COMP:
@@ -252,8 +268,8 @@ bfa_fcs_rport_sm_plogiacc_sending(struct bfa_fcs_rport_s *rport,
252 268
253 switch (event) { 269 switch (event) {
254 case RPSM_EVENT_FCXP_SENT: 270 case RPSM_EVENT_FCXP_SENT:
255 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 271 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
256 bfa_fcs_rport_hal_online(rport); 272 bfa_fcs_rport_fcs_online_action(rport);
257 break; 273 break;
258 274
259 case RPSM_EVENT_DELETE: 275 case RPSM_EVENT_DELETE:
@@ -348,9 +364,9 @@ bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
348 break; 364 break;
349 365
350 case RPSM_EVENT_PLOGI_COMP: 366 case RPSM_EVENT_PLOGI_COMP:
351 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 367 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
352 bfa_timer_stop(&rport->timer); 368 bfa_timer_stop(&rport->timer);
353 bfa_fcs_rport_hal_online(rport); 369 bfa_fcs_rport_fcs_online_action(rport);
354 break; 370 break;
355 371
356 default: 372 default:
@@ -370,9 +386,9 @@ bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event)
370 386
371 switch (event) { 387 switch (event) {
372 case RPSM_EVENT_ACCEPTED: 388 case RPSM_EVENT_ACCEPTED:
373 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 389 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
374 rport->plogi_retries = 0; 390 rport->plogi_retries = 0;
375 bfa_fcs_rport_hal_online(rport); 391 bfa_fcs_rport_fcs_online_action(rport);
376 break; 392 break;
377 393
378 case RPSM_EVENT_LOGO_RCVD: 394 case RPSM_EVENT_LOGO_RCVD:
@@ -444,13 +460,77 @@ bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, enum rport_event event)
444 break; 460 break;
445 461
446 case RPSM_EVENT_PLOGI_COMP: 462 case RPSM_EVENT_PLOGI_COMP:
447 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 463 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
448 bfa_fcxp_discard(rport->fcxp); 464 bfa_fcxp_discard(rport->fcxp);
449 bfa_fcs_rport_hal_online(rport); 465 bfa_fcs_rport_fcs_online_action(rport);
466 break;
467
468 default:
469 bfa_sm_fault(rport->fcs, event);
470 }
471}
472
473/*
474 * PLOGI is done. Await bfa_fcs_itnim to ascertain the scsi function
475 */
476static void
477bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s *rport,
478 enum rport_event event)
479{
480 bfa_trc(rport->fcs, rport->pwwn);
481 bfa_trc(rport->fcs, rport->pid);
482 bfa_trc(rport->fcs, event);
483
484 switch (event) {
485 case RPSM_EVENT_FC4_FCS_ONLINE:
486 if (rport->scsi_function == BFA_RPORT_INITIATOR) {
487 if (!BFA_FCS_PID_IS_WKA(rport->pid))
488 bfa_fcs_rpf_rport_online(rport);
489 bfa_sm_set_state(rport, bfa_fcs_rport_sm_online);
490 break;
491 }
492
493 if (!rport->bfa_rport)
494 rport->bfa_rport =
495 bfa_rport_create(rport->fcs->bfa, rport);
496
497 if (rport->bfa_rport) {
498 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online);
499 bfa_fcs_rport_hal_online(rport);
500 } else {
501 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
502 bfa_fcs_rport_fcs_offline_action(rport);
503 }
504 break;
505
506 case RPSM_EVENT_PLOGI_RCVD:
507 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
508 rport->plogi_pending = BFA_TRUE;
509 bfa_fcs_rport_fcs_offline_action(rport);
510 break;
511
512 case RPSM_EVENT_PLOGI_COMP:
513 case RPSM_EVENT_LOGO_IMP:
514 case RPSM_EVENT_ADDRESS_CHANGE:
515 case RPSM_EVENT_SCN:
516 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
517 bfa_fcs_rport_fcs_offline_action(rport);
518 break;
519
520 case RPSM_EVENT_LOGO_RCVD:
521 case RPSM_EVENT_PRLO_RCVD:
522 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
523 bfa_fcs_rport_fcs_offline_action(rport);
524 break;
525
526 case RPSM_EVENT_DELETE:
527 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
528 bfa_fcs_rport_fcs_offline_action(rport);
450 break; 529 break;
451 530
452 default: 531 default:
453 bfa_sm_fault(rport->fcs, event); 532 bfa_sm_fault(rport->fcs, event);
533 break;
454 } 534 }
455} 535}
456 536
@@ -469,41 +549,34 @@ bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport,
469 switch (event) { 549 switch (event) {
470 case RPSM_EVENT_HCB_ONLINE: 550 case RPSM_EVENT_HCB_ONLINE:
471 bfa_sm_set_state(rport, bfa_fcs_rport_sm_online); 551 bfa_sm_set_state(rport, bfa_fcs_rport_sm_online);
472 bfa_fcs_rport_online_action(rport); 552 bfa_fcs_rport_hal_online_action(rport);
473 break; 553 break;
474 554
475 case RPSM_EVENT_PRLO_RCVD:
476 case RPSM_EVENT_PLOGI_COMP: 555 case RPSM_EVENT_PLOGI_COMP:
477 break; 556 break;
478 557
558 case RPSM_EVENT_PRLO_RCVD:
479 case RPSM_EVENT_LOGO_RCVD: 559 case RPSM_EVENT_LOGO_RCVD:
480 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logorcv); 560 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
481 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 561 bfa_fcs_rport_fcs_offline_action(rport);
482 break; 562 break;
483 563
564 case RPSM_EVENT_SCN:
484 case RPSM_EVENT_LOGO_IMP: 565 case RPSM_EVENT_LOGO_IMP:
485 case RPSM_EVENT_ADDRESS_CHANGE: 566 case RPSM_EVENT_ADDRESS_CHANGE:
486 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_offline); 567 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
487 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 568 bfa_fcs_rport_fcs_offline_action(rport);
488 break; 569 break;
489 570
490 case RPSM_EVENT_PLOGI_RCVD: 571 case RPSM_EVENT_PLOGI_RCVD:
491 rport->plogi_pending = BFA_TRUE; 572 rport->plogi_pending = BFA_TRUE;
492 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_offline); 573 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
493 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 574 bfa_fcs_rport_fcs_offline_action(rport);
494 break; 575 break;
495 576
496 case RPSM_EVENT_DELETE: 577 case RPSM_EVENT_DELETE:
497 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logosend); 578 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
498 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 579 bfa_fcs_rport_fcs_offline_action(rport);
499 break;
500
501 case RPSM_EVENT_SCN:
502 /*
503 * @todo
504 * Ignore SCN - PLOGI just completed, FC-4 login should detect
505 * device failures.
506 */
507 break; 580 break;
508 581
509 default: 582 default:
@@ -538,18 +611,18 @@ bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, enum rport_event event)
538 case RPSM_EVENT_LOGO_IMP: 611 case RPSM_EVENT_LOGO_IMP:
539 case RPSM_EVENT_ADDRESS_CHANGE: 612 case RPSM_EVENT_ADDRESS_CHANGE:
540 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 613 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
541 bfa_fcs_rport_offline_action(rport); 614 bfa_fcs_rport_hal_offline_action(rport);
542 break; 615 break;
543 616
544 case RPSM_EVENT_DELETE: 617 case RPSM_EVENT_DELETE:
545 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend); 618 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
546 bfa_fcs_rport_offline_action(rport); 619 bfa_fcs_rport_hal_offline_action(rport);
547 break; 620 break;
548 621
549 case RPSM_EVENT_LOGO_RCVD: 622 case RPSM_EVENT_LOGO_RCVD:
550 case RPSM_EVENT_PRLO_RCVD: 623 case RPSM_EVENT_PRLO_RCVD:
551 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv); 624 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
552 bfa_fcs_rport_offline_action(rport); 625 bfa_fcs_rport_hal_offline_action(rport);
553 break; 626 break;
554 627
555 case RPSM_EVENT_PLOGI_COMP: 628 case RPSM_EVENT_PLOGI_COMP:
@@ -580,7 +653,7 @@ bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport,
580 case RPSM_EVENT_DELETE: 653 case RPSM_EVENT_DELETE:
581 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend); 654 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
582 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 655 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
583 bfa_fcs_rport_offline_action(rport); 656 bfa_fcs_rport_hal_offline_action(rport);
584 break; 657 break;
585 658
586 case RPSM_EVENT_SCN: 659 case RPSM_EVENT_SCN:
@@ -593,24 +666,16 @@ bfa_fcs_rport_sm_nsquery_sending(struct bfa_fcs_rport_s *rport,
593 case RPSM_EVENT_PRLO_RCVD: 666 case RPSM_EVENT_PRLO_RCVD:
594 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv); 667 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
595 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 668 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
596 bfa_fcs_rport_offline_action(rport); 669 bfa_fcs_rport_hal_offline_action(rport);
597 break; 670 break;
598 671
599 case RPSM_EVENT_LOGO_IMP: 672 case RPSM_EVENT_LOGO_IMP:
600 rport->pid = 0;
601 bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
602 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
603 bfa_timer_start(rport->fcs->bfa, &rport->timer,
604 bfa_fcs_rport_timeout, rport,
605 bfa_fcs_rport_del_timeout);
606 break;
607
608 case RPSM_EVENT_PLOGI_RCVD: 673 case RPSM_EVENT_PLOGI_RCVD:
609 case RPSM_EVENT_ADDRESS_CHANGE: 674 case RPSM_EVENT_ADDRESS_CHANGE:
610 case RPSM_EVENT_PLOGI_COMP: 675 case RPSM_EVENT_PLOGI_COMP:
611 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 676 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
612 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 677 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
613 bfa_fcs_rport_offline_action(rport); 678 bfa_fcs_rport_hal_offline_action(rport);
614 break; 679 break;
615 680
616 default: 681 default:
@@ -643,14 +708,14 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
643 bfa_fcs_rport_send_nsdisc(rport, NULL); 708 bfa_fcs_rport_send_nsdisc(rport, NULL);
644 } else { 709 } else {
645 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 710 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
646 bfa_fcs_rport_offline_action(rport); 711 bfa_fcs_rport_hal_offline_action(rport);
647 } 712 }
648 break; 713 break;
649 714
650 case RPSM_EVENT_DELETE: 715 case RPSM_EVENT_DELETE:
651 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend); 716 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
652 bfa_fcxp_discard(rport->fcxp); 717 bfa_fcxp_discard(rport->fcxp);
653 bfa_fcs_rport_offline_action(rport); 718 bfa_fcs_rport_hal_offline_action(rport);
654 break; 719 break;
655 720
656 case RPSM_EVENT_SCN: 721 case RPSM_EVENT_SCN:
@@ -660,7 +725,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
660 case RPSM_EVENT_PRLO_RCVD: 725 case RPSM_EVENT_PRLO_RCVD:
661 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv); 726 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
662 bfa_fcxp_discard(rport->fcxp); 727 bfa_fcxp_discard(rport->fcxp);
663 bfa_fcs_rport_offline_action(rport); 728 bfa_fcs_rport_hal_offline_action(rport);
664 break; 729 break;
665 730
666 case RPSM_EVENT_PLOGI_COMP: 731 case RPSM_EVENT_PLOGI_COMP:
@@ -669,7 +734,7 @@ bfa_fcs_rport_sm_nsquery(struct bfa_fcs_rport_s *rport, enum rport_event event)
669 case RPSM_EVENT_LOGO_IMP: 734 case RPSM_EVENT_LOGO_IMP:
670 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 735 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
671 bfa_fcxp_discard(rport->fcxp); 736 bfa_fcxp_discard(rport->fcxp);
672 bfa_fcs_rport_offline_action(rport); 737 bfa_fcs_rport_hal_offline_action(rport);
673 break; 738 break;
674 739
675 default: 740 default:
@@ -697,21 +762,21 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport,
697 case RPSM_EVENT_DELETE: 762 case RPSM_EVENT_DELETE:
698 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend); 763 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
699 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 764 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
700 bfa_fcs_rport_offline_action(rport); 765 bfa_fcs_rport_hal_offline_action(rport);
701 break; 766 break;
702 767
703 case RPSM_EVENT_LOGO_IMP: 768 case RPSM_EVENT_LOGO_IMP:
704 case RPSM_EVENT_ADDRESS_CHANGE: 769 case RPSM_EVENT_ADDRESS_CHANGE:
705 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 770 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
706 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 771 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
707 bfa_fcs_rport_offline_action(rport); 772 bfa_fcs_rport_hal_offline_action(rport);
708 break; 773 break;
709 774
710 case RPSM_EVENT_LOGO_RCVD: 775 case RPSM_EVENT_LOGO_RCVD:
711 case RPSM_EVENT_PRLO_RCVD: 776 case RPSM_EVENT_PRLO_RCVD:
712 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv); 777 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
713 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 778 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
714 bfa_fcs_rport_offline_action(rport); 779 bfa_fcs_rport_hal_offline_action(rport);
715 break; 780 break;
716 781
717 case RPSM_EVENT_SCN: 782 case RPSM_EVENT_SCN:
@@ -720,7 +785,7 @@ bfa_fcs_rport_sm_adisc_sending(struct bfa_fcs_rport_s *rport,
720 case RPSM_EVENT_PLOGI_RCVD: 785 case RPSM_EVENT_PLOGI_RCVD:
721 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 786 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
722 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 787 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
723 bfa_fcs_rport_offline_action(rport); 788 bfa_fcs_rport_hal_offline_action(rport);
724 break; 789 break;
725 790
726 default: 791 default:
@@ -757,13 +822,13 @@ bfa_fcs_rport_sm_adisc(struct bfa_fcs_rport_s *rport, enum rport_event event)
757 case RPSM_EVENT_FAILED: 822 case RPSM_EVENT_FAILED:
758 case RPSM_EVENT_ADDRESS_CHANGE: 823 case RPSM_EVENT_ADDRESS_CHANGE:
759 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 824 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
760 bfa_fcs_rport_offline_action(rport); 825 bfa_fcs_rport_hal_offline_action(rport);
761 break; 826 break;
762 827
763 case RPSM_EVENT_DELETE: 828 case RPSM_EVENT_DELETE:
764 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend); 829 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend);
765 bfa_fcxp_discard(rport->fcxp); 830 bfa_fcxp_discard(rport->fcxp);
766 bfa_fcs_rport_offline_action(rport); 831 bfa_fcs_rport_hal_offline_action(rport);
767 break; 832 break;
768 833
769 case RPSM_EVENT_SCN: 834 case RPSM_EVENT_SCN:
@@ -775,14 +840,14 @@ bfa_fcs_rport_sm_adisc(struct bfa_fcs_rport_s *rport, enum rport_event event)
775 case RPSM_EVENT_LOGO_IMP: 840 case RPSM_EVENT_LOGO_IMP:
776 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline); 841 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_offline);
777 bfa_fcxp_discard(rport->fcxp); 842 bfa_fcxp_discard(rport->fcxp);
778 bfa_fcs_rport_offline_action(rport); 843 bfa_fcs_rport_hal_offline_action(rport);
779 break; 844 break;
780 845
781 case RPSM_EVENT_LOGO_RCVD: 846 case RPSM_EVENT_LOGO_RCVD:
782 case RPSM_EVENT_PRLO_RCVD: 847 case RPSM_EVENT_PRLO_RCVD:
783 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv); 848 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logorcv);
784 bfa_fcxp_discard(rport->fcxp); 849 bfa_fcxp_discard(rport->fcxp);
785 bfa_fcs_rport_offline_action(rport); 850 bfa_fcs_rport_hal_offline_action(rport);
786 break; 851 break;
787 852
788 default: 853 default:
@@ -804,13 +869,19 @@ bfa_fcs_rport_sm_fc4_logorcv(struct bfa_fcs_rport_s *rport,
804 switch (event) { 869 switch (event) {
805 case RPSM_EVENT_FC4_OFFLINE: 870 case RPSM_EVENT_FC4_OFFLINE:
806 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logorcv); 871 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logorcv);
807 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 872 bfa_fcs_rport_hal_offline(rport);
808 break; 873 break;
809 874
810 case RPSM_EVENT_DELETE: 875 case RPSM_EVENT_DELETE:
811 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_logosend); 876 if (rport->pid && (rport->prlo == BFA_TRUE))
877 bfa_fcs_rport_send_prlo_acc(rport);
878 if (rport->pid && (rport->prlo == BFA_FALSE))
879 bfa_fcs_rport_send_logo_acc(rport);
880
881 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_off_delete);
812 break; 882 break;
813 883
884 case RPSM_EVENT_HCB_ONLINE:
814 case RPSM_EVENT_LOGO_RCVD: 885 case RPSM_EVENT_LOGO_RCVD:
815 case RPSM_EVENT_PRLO_RCVD: 886 case RPSM_EVENT_PRLO_RCVD:
816 case RPSM_EVENT_ADDRESS_CHANGE: 887 case RPSM_EVENT_ADDRESS_CHANGE:
@@ -836,7 +907,20 @@ bfa_fcs_rport_sm_fc4_logosend(struct bfa_fcs_rport_s *rport,
836 switch (event) { 907 switch (event) {
837 case RPSM_EVENT_FC4_OFFLINE: 908 case RPSM_EVENT_FC4_OFFLINE:
838 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logosend); 909 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logosend);
839 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 910 bfa_fcs_rport_hal_offline(rport);
911 break;
912
913 case RPSM_EVENT_LOGO_RCVD:
914 bfa_fcs_rport_send_logo_acc(rport);
915 case RPSM_EVENT_PRLO_RCVD:
916 if (rport->prlo == BFA_TRUE)
917 bfa_fcs_rport_send_prlo_acc(rport);
918 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_off_delete);
919 break;
920
921 case RPSM_EVENT_HCB_ONLINE:
922 case RPSM_EVENT_DELETE:
923 /* Rport is being deleted */
840 break; 924 break;
841 925
842 default: 926 default:
@@ -858,13 +942,23 @@ bfa_fcs_rport_sm_fc4_offline(struct bfa_fcs_rport_s *rport,
858 switch (event) { 942 switch (event) {
859 case RPSM_EVENT_FC4_OFFLINE: 943 case RPSM_EVENT_FC4_OFFLINE:
860 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_offline); 944 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_offline);
861 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE); 945 bfa_fcs_rport_hal_offline(rport);
862 break; 946 break;
863 947
864 case RPSM_EVENT_SCN:
865 case RPSM_EVENT_LOGO_IMP:
866 case RPSM_EVENT_LOGO_RCVD: 948 case RPSM_EVENT_LOGO_RCVD:
949 /*
950 * Rport is going offline. Just ack the logo
951 */
952 bfa_fcs_rport_send_logo_acc(rport);
953 break;
954
867 case RPSM_EVENT_PRLO_RCVD: 955 case RPSM_EVENT_PRLO_RCVD:
956 bfa_fcs_rport_send_prlo_acc(rport);
957 break;
958
959 case RPSM_EVENT_HCB_ONLINE:
960 case RPSM_EVENT_SCN:
961 case RPSM_EVENT_LOGO_IMP:
868 case RPSM_EVENT_ADDRESS_CHANGE: 962 case RPSM_EVENT_ADDRESS_CHANGE:
869 /* 963 /*
870 * rport is already going offline. 964 * rport is already going offline.
@@ -908,24 +1002,23 @@ bfa_fcs_rport_sm_hcb_offline(struct bfa_fcs_rport_s *rport,
908 */ 1002 */
909 1003
910 case RPSM_EVENT_ADDRESS_CHANGE: 1004 case RPSM_EVENT_ADDRESS_CHANGE:
911 if (bfa_fcs_lport_is_online(rport->port)) { 1005 if (!bfa_fcs_lport_is_online(rport->port)) {
912 if (bfa_fcs_fabric_is_switched(rport->port->fabric)) {
913 bfa_sm_set_state(rport,
914 bfa_fcs_rport_sm_nsdisc_sending);
915 rport->ns_retries = 0;
916 bfa_fcs_rport_send_nsdisc(rport, NULL);
917 } else {
918 bfa_sm_set_state(rport,
919 bfa_fcs_rport_sm_plogi_sending);
920 rport->plogi_retries = 0;
921 bfa_fcs_rport_send_plogi(rport, NULL);
922 }
923 } else {
924 rport->pid = 0; 1006 rport->pid = 0;
925 bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline); 1007 bfa_sm_set_state(rport, bfa_fcs_rport_sm_offline);
926 bfa_timer_start(rport->fcs->bfa, &rport->timer, 1008 bfa_timer_start(rport->fcs->bfa, &rport->timer,
927 bfa_fcs_rport_timeout, rport, 1009 bfa_fcs_rport_timeout, rport,
928 bfa_fcs_rport_del_timeout); 1010 bfa_fcs_rport_del_timeout);
1011 break;
1012 }
1013 if (bfa_fcs_fabric_is_switched(rport->port->fabric)) {
1014 bfa_sm_set_state(rport,
1015 bfa_fcs_rport_sm_nsdisc_sending);
1016 rport->ns_retries = 0;
1017 bfa_fcs_rport_send_nsdisc(rport, NULL);
1018 } else {
1019 bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
1020 rport->plogi_retries = 0;
1021 bfa_fcs_rport_send_plogi(rport, NULL);
929 } 1022 }
930 break; 1023 break;
931 1024
@@ -1002,7 +1095,11 @@ bfa_fcs_rport_sm_hcb_logorcv(struct bfa_fcs_rport_s *rport,
1002 break; 1095 break;
1003 1096
1004 case RPSM_EVENT_DELETE: 1097 case RPSM_EVENT_DELETE:
1005 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hcb_logosend); 1098 bfa_sm_set_state(rport, bfa_fcs_rport_sm_delete_pending);
1099 if (rport->pid && (rport->prlo == BFA_TRUE))
1100 bfa_fcs_rport_send_prlo_acc(rport);
1101 if (rport->pid && (rport->prlo == BFA_FALSE))
1102 bfa_fcs_rport_send_logo_acc(rport);
1006 break; 1103 break;
1007 1104
1008 case RPSM_EVENT_LOGO_IMP: 1105 case RPSM_EVENT_LOGO_IMP:
@@ -1041,7 +1138,14 @@ bfa_fcs_rport_sm_hcb_logosend(struct bfa_fcs_rport_s *rport,
1041 break; 1138 break;
1042 1139
1043 case RPSM_EVENT_LOGO_RCVD: 1140 case RPSM_EVENT_LOGO_RCVD:
1141 bfa_fcs_rport_send_logo_acc(rport);
1044 case RPSM_EVENT_PRLO_RCVD: 1142 case RPSM_EVENT_PRLO_RCVD:
1143 if (rport->prlo == BFA_TRUE)
1144 bfa_fcs_rport_send_prlo_acc(rport);
1145
1146 bfa_sm_set_state(rport, bfa_fcs_rport_sm_delete_pending);
1147 break;
1148
1045 case RPSM_EVENT_ADDRESS_CHANGE: 1149 case RPSM_EVENT_ADDRESS_CHANGE:
1046 break; 1150 break;
1047 1151
@@ -1073,7 +1177,11 @@ bfa_fcs_rport_sm_logo_sending(struct bfa_fcs_rport_s *rport,
1073 break; 1177 break;
1074 1178
1075 case RPSM_EVENT_LOGO_RCVD: 1179 case RPSM_EVENT_LOGO_RCVD:
1180 bfa_fcs_rport_send_logo_acc(rport);
1076 case RPSM_EVENT_PRLO_RCVD: 1181 case RPSM_EVENT_PRLO_RCVD:
1182 if (rport->prlo == BFA_TRUE)
1183 bfa_fcs_rport_send_prlo_acc(rport);
1184
1077 bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit); 1185 bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1078 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 1186 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
1079 bfa_fcs_rport_free(rport); 1187 bfa_fcs_rport_free(rport);
@@ -1127,9 +1235,9 @@ bfa_fcs_rport_sm_offline(struct bfa_fcs_rport_s *rport, enum rport_event event)
1127 break; 1235 break;
1128 1236
1129 case RPSM_EVENT_PLOGI_COMP: 1237 case RPSM_EVENT_PLOGI_COMP:
1130 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 1238 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1131 bfa_timer_stop(&rport->timer); 1239 bfa_timer_stop(&rport->timer);
1132 bfa_fcs_rport_hal_online(rport); 1240 bfa_fcs_rport_fcs_online_action(rport);
1133 break; 1241 break;
1134 1242
1135 case RPSM_EVENT_PLOGI_SEND: 1243 case RPSM_EVENT_PLOGI_SEND:
@@ -1191,9 +1299,9 @@ bfa_fcs_rport_sm_nsdisc_sending(struct bfa_fcs_rport_s *rport,
1191 break; 1299 break;
1192 1300
1193 case RPSM_EVENT_PLOGI_COMP: 1301 case RPSM_EVENT_PLOGI_COMP:
1194 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 1302 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1195 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe); 1303 bfa_fcxp_walloc_cancel(rport->fcs->bfa, &rport->fcxp_wqe);
1196 bfa_fcs_rport_hal_online(rport); 1304 bfa_fcs_rport_fcs_online_action(rport);
1197 break; 1305 break;
1198 1306
1199 default: 1307 default:
@@ -1255,9 +1363,9 @@ bfa_fcs_rport_sm_nsdisc_retry(struct bfa_fcs_rport_s *rport,
1255 break; 1363 break;
1256 1364
1257 case RPSM_EVENT_PLOGI_COMP: 1365 case RPSM_EVENT_PLOGI_COMP:
1258 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 1366 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1259 bfa_timer_stop(&rport->timer); 1367 bfa_timer_stop(&rport->timer);
1260 bfa_fcs_rport_hal_online(rport); 1368 bfa_fcs_rport_fcs_online_action(rport);
1261 break; 1369 break;
1262 1370
1263 default: 1371 default:
@@ -1345,9 +1453,9 @@ bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
1345 break; 1453 break;
1346 1454
1347 case RPSM_EVENT_PLOGI_COMP: 1455 case RPSM_EVENT_PLOGI_COMP:
1348 bfa_sm_set_state(rport, bfa_fcs_rport_sm_hal_online); 1456 bfa_sm_set_state(rport, bfa_fcs_rport_sm_fc4_fcs_online);
1349 bfa_fcxp_discard(rport->fcxp); 1457 bfa_fcxp_discard(rport->fcxp);
1350 bfa_fcs_rport_hal_online(rport); 1458 bfa_fcs_rport_fcs_online_action(rport);
1351 break; 1459 break;
1352 1460
1353 default: 1461 default:
@@ -1355,7 +1463,63 @@ bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport,
1355 } 1463 }
1356} 1464}
1357 1465
1466/*
1467 * Rport needs to be deleted
1468 * waiting for ITNIM clean up to finish
1469 */
1470static void
1471bfa_fcs_rport_sm_fc4_off_delete(struct bfa_fcs_rport_s *rport,
1472 enum rport_event event)
1473{
1474 bfa_trc(rport->fcs, rport->pwwn);
1475 bfa_trc(rport->fcs, rport->pid);
1476 bfa_trc(rport->fcs, event);
1358 1477
1478 switch (event) {
1479 case RPSM_EVENT_FC4_OFFLINE:
1480 bfa_sm_set_state(rport, bfa_fcs_rport_sm_delete_pending);
1481 bfa_fcs_rport_hal_offline(rport);
1482 break;
1483
1484 case RPSM_EVENT_DELETE:
1485 case RPSM_EVENT_PLOGI_RCVD:
1486 /* Ignore these events */
1487 break;
1488
1489 default:
1490 bfa_sm_fault(rport->fcs, event);
1491 break;
1492 }
1493}
1494
1495/*
1496 * RPort needs to be deleted
1497 * waiting for BFA/FW to finish current processing
1498 */
1499static void
1500bfa_fcs_rport_sm_delete_pending(struct bfa_fcs_rport_s *rport,
1501 enum rport_event event)
1502{
1503 bfa_trc(rport->fcs, rport->pwwn);
1504 bfa_trc(rport->fcs, rport->pid);
1505 bfa_trc(rport->fcs, event);
1506
1507 switch (event) {
1508 case RPSM_EVENT_HCB_OFFLINE:
1509 bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
1510 bfa_fcs_rport_free(rport);
1511 break;
1512
1513 case RPSM_EVENT_DELETE:
1514 case RPSM_EVENT_LOGO_IMP:
1515 case RPSM_EVENT_PLOGI_RCVD:
1516 /* Ignore these events */
1517 break;
1518
1519 default:
1520 bfa_sm_fault(rport->fcs, event);
1521 }
1522}
1359 1523
1360/* 1524/*
1361 * fcs_rport_private FCS RPORT provate functions 1525 * fcs_rport_private FCS RPORT provate functions
@@ -1964,6 +2128,15 @@ bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport)
1964 bfa_rport_online(rport->bfa_rport, &rport_info); 2128 bfa_rport_online(rport->bfa_rport, &rport_info);
1965} 2129}
1966 2130
2131static void
2132bfa_fcs_rport_hal_offline(struct bfa_fcs_rport_s *rport)
2133{
2134 if (rport->bfa_rport)
2135 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_OFFLINE);
2136 else
2137 bfa_cb_rport_offline(rport);
2138}
2139
1967static struct bfa_fcs_rport_s * 2140static struct bfa_fcs_rport_s *
1968bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid) 2141bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid)
1969{ 2142{
@@ -1974,6 +2147,11 @@ bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid)
1974 /* 2147 /*
1975 * allocate rport 2148 * allocate rport
1976 */ 2149 */
2150 if (fcs->num_rport_logins >= bfa_fcs_rport_max_logins) {
2151 bfa_trc(fcs, rpid);
2152 return NULL;
2153 }
2154
1977 if (bfa_fcb_rport_alloc(fcs->bfad, &rport, &rport_drv) 2155 if (bfa_fcb_rport_alloc(fcs->bfad, &rport, &rport_drv)
1978 != BFA_STATUS_OK) { 2156 != BFA_STATUS_OK) {
1979 bfa_trc(fcs, rpid); 2157 bfa_trc(fcs, rpid);
@@ -1990,15 +2168,7 @@ bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid)
1990 rport->pwwn = pwwn; 2168 rport->pwwn = pwwn;
1991 rport->old_pid = 0; 2169 rport->old_pid = 0;
1992 2170
1993 /* 2171 rport->bfa_rport = NULL;
1994 * allocate BFA rport
1995 */
1996 rport->bfa_rport = bfa_rport_create(port->fcs->bfa, rport);
1997 if (!rport->bfa_rport) {
1998 bfa_trc(fcs, rpid);
1999 kfree(rport_drv);
2000 return NULL;
2001 }
2002 2172
2003 /* 2173 /*
2004 * allocate FC-4s 2174 * allocate FC-4s
@@ -2009,14 +2179,13 @@ bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid)
2009 rport->itnim = bfa_fcs_itnim_create(rport); 2179 rport->itnim = bfa_fcs_itnim_create(rport);
2010 if (!rport->itnim) { 2180 if (!rport->itnim) {
2011 bfa_trc(fcs, rpid); 2181 bfa_trc(fcs, rpid);
2012 bfa_sm_send_event(rport->bfa_rport,
2013 BFA_RPORT_SM_DELETE);
2014 kfree(rport_drv); 2182 kfree(rport_drv);
2015 return NULL; 2183 return NULL;
2016 } 2184 }
2017 } 2185 }
2018 2186
2019 bfa_fcs_lport_add_rport(port, rport); 2187 bfa_fcs_lport_add_rport(port, rport);
2188 fcs->num_rport_logins++;
2020 2189
2021 bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit); 2190 bfa_sm_set_state(rport, bfa_fcs_rport_sm_uninit);
2022 2191
@@ -2032,20 +2201,28 @@ static void
2032bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport) 2201bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport)
2033{ 2202{
2034 struct bfa_fcs_lport_s *port = rport->port; 2203 struct bfa_fcs_lport_s *port = rport->port;
2204 struct bfa_fcs_s *fcs = port->fcs;
2035 2205
2036 /* 2206 /*
2037 * - delete FC-4s 2207 * - delete FC-4s
2038 * - delete BFA rport 2208 * - delete BFA rport
2039 * - remove from queue of rports 2209 * - remove from queue of rports
2040 */ 2210 */
2211 rport->plogi_pending = BFA_FALSE;
2212
2041 if (bfa_fcs_lport_is_initiator(port)) { 2213 if (bfa_fcs_lport_is_initiator(port)) {
2042 bfa_fcs_itnim_delete(rport->itnim); 2214 bfa_fcs_itnim_delete(rport->itnim);
2043 if (rport->pid != 0 && !BFA_FCS_PID_IS_WKA(rport->pid)) 2215 if (rport->pid != 0 && !BFA_FCS_PID_IS_WKA(rport->pid))
2044 bfa_fcs_rpf_rport_offline(rport); 2216 bfa_fcs_rpf_rport_offline(rport);
2045 } 2217 }
2046 2218
2047 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_DELETE); 2219 if (rport->bfa_rport) {
2220 bfa_sm_send_event(rport->bfa_rport, BFA_RPORT_SM_DELETE);
2221 rport->bfa_rport = NULL;
2222 }
2223
2048 bfa_fcs_lport_del_rport(port, rport); 2224 bfa_fcs_lport_del_rport(port, rport);
2225 fcs->num_rport_logins--;
2049 kfree(rport->rp_drv); 2226 kfree(rport->rp_drv);
2050} 2227}
2051 2228
@@ -2079,7 +2256,18 @@ bfa_fcs_rport_aen_post(struct bfa_fcs_rport_s *rport,
2079} 2256}
2080 2257
2081static void 2258static void
2082bfa_fcs_rport_online_action(struct bfa_fcs_rport_s *rport) 2259bfa_fcs_rport_fcs_online_action(struct bfa_fcs_rport_s *rport)
2260{
2261 if ((!rport->pid) || (!rport->pwwn)) {
2262 bfa_trc(rport->fcs, rport->pid);
2263 bfa_sm_fault(rport->fcs, rport->pid);
2264 }
2265
2266 bfa_sm_send_event(rport->itnim, BFA_FCS_ITNIM_SM_FCS_ONLINE);
2267}
2268
2269static void
2270bfa_fcs_rport_hal_online_action(struct bfa_fcs_rport_s *rport)
2083{ 2271{
2084 struct bfa_fcs_lport_s *port = rport->port; 2272 struct bfa_fcs_lport_s *port = rport->port;
2085 struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad; 2273 struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad;
@@ -2094,7 +2282,7 @@ bfa_fcs_rport_online_action(struct bfa_fcs_rport_s *rport)
2094 } 2282 }
2095 2283
2096 if (bfa_fcs_lport_is_initiator(port)) { 2284 if (bfa_fcs_lport_is_initiator(port)) {
2097 bfa_fcs_itnim_rport_online(rport->itnim); 2285 bfa_fcs_itnim_brp_online(rport->itnim);
2098 if (!BFA_FCS_PID_IS_WKA(rport->pid)) 2286 if (!BFA_FCS_PID_IS_WKA(rport->pid))
2099 bfa_fcs_rpf_rport_online(rport); 2287 bfa_fcs_rpf_rport_online(rport);
2100 }; 2288 };
@@ -2110,15 +2298,28 @@ bfa_fcs_rport_online_action(struct bfa_fcs_rport_s *rport)
2110} 2298}
2111 2299
2112static void 2300static void
2113bfa_fcs_rport_offline_action(struct bfa_fcs_rport_s *rport) 2301bfa_fcs_rport_fcs_offline_action(struct bfa_fcs_rport_s *rport)
2302{
2303 if (!BFA_FCS_PID_IS_WKA(rport->pid))
2304 bfa_fcs_rpf_rport_offline(rport);
2305
2306 bfa_fcs_itnim_rport_offline(rport->itnim);
2307}
2308
2309static void
2310bfa_fcs_rport_hal_offline_action(struct bfa_fcs_rport_s *rport)
2114{ 2311{
2115 struct bfa_fcs_lport_s *port = rport->port; 2312 struct bfa_fcs_lport_s *port = rport->port;
2116 struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad; 2313 struct bfad_s *bfad = (struct bfad_s *)port->fcs->bfad;
2117 char lpwwn_buf[BFA_STRING_32]; 2314 char lpwwn_buf[BFA_STRING_32];
2118 char rpwwn_buf[BFA_STRING_32]; 2315 char rpwwn_buf[BFA_STRING_32];
2119 2316
2317 if (!rport->bfa_rport) {
2318 bfa_fcs_rport_fcs_offline_action(rport);
2319 return;
2320 }
2321
2120 rport->stats.offlines++; 2322 rport->stats.offlines++;
2121 rport->plogi_pending = BFA_FALSE;
2122 2323
2123 wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(port)); 2324 wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(port));
2124 wwn2str(rpwwn_buf, rport->pwwn); 2325 wwn2str(rpwwn_buf, rport->pwwn);
@@ -2348,7 +2549,6 @@ bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport)
2348 bfa_sm_send_event(rport, RPSM_EVENT_SCN); 2549 bfa_sm_send_event(rport, RPSM_EVENT_SCN);
2349} 2550}
2350 2551
2351
2352/* 2552/*
2353 * brief 2553 * brief
2354 * This routine BFA callback for bfa_rport_online() call. 2554 * This routine BFA callback for bfa_rport_online() call.
@@ -2590,6 +2790,17 @@ bfa_fcs_rport_prlo(struct bfa_fcs_rport_s *rport, __be16 ox_id)
2590 bfa_sm_send_event(rport, RPSM_EVENT_PRLO_RCVD); 2790 bfa_sm_send_event(rport, RPSM_EVENT_PRLO_RCVD);
2591} 2791}
2592 2792
2793/*
2794 * Called by BFAD to set the max limit on number of bfa_fcs_rport allocation
2795 * which limits number of concurrent logins to remote ports
2796 */
2797void
2798bfa_fcs_rport_set_max_logins(u32 max_logins)
2799{
2800 if (max_logins > 0)
2801 bfa_fcs_rport_max_logins = max_logins;
2802}
2803
2593void 2804void
2594bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport, 2805bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport,
2595 struct bfa_rport_attr_s *rport_attr) 2806 struct bfa_rport_attr_s *rport_attr)
@@ -2613,9 +2824,11 @@ bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport,
2613 rport_attr->curr_speed = rport->rpf.rpsc_speed; 2824 rport_attr->curr_speed = rport->rpf.rpsc_speed;
2614 rport_attr->assigned_speed = rport->rpf.assigned_speed; 2825 rport_attr->assigned_speed = rport->rpf.assigned_speed;
2615 2826
2616 qos_attr.qos_priority = rport->bfa_rport->qos_attr.qos_priority; 2827 if (rport->bfa_rport) {
2617 qos_attr.qos_flow_id = 2828 qos_attr.qos_priority = rport->bfa_rport->qos_attr.qos_priority;
2618 cpu_to_be32(rport->bfa_rport->qos_attr.qos_flow_id); 2829 qos_attr.qos_flow_id =
2830 cpu_to_be32(rport->bfa_rport->qos_attr.qos_flow_id);
2831 }
2619 rport_attr->qos_attr = qos_attr; 2832 rport_attr->qos_attr = qos_attr;
2620 2833
2621 rport_attr->trl_enforced = BFA_FALSE; 2834 rport_attr->trl_enforced = BFA_FALSE;
diff --git a/drivers/scsi/bfa/bfa_svc.c b/drivers/scsi/bfa/bfa_svc.c
index e7669f8ef78f..b2538d60db34 100644
--- a/drivers/scsi/bfa/bfa_svc.c
+++ b/drivers/scsi/bfa/bfa_svc.c
@@ -4275,6 +4275,10 @@ bfa_rport_sm_offline(struct bfa_rport_s *rp, enum bfa_rport_event event)
4275 bfa_sm_set_state(rp, bfa_rport_sm_iocdisable); 4275 bfa_sm_set_state(rp, bfa_rport_sm_iocdisable);
4276 break; 4276 break;
4277 4277
4278 case BFA_RPORT_SM_OFFLINE:
4279 bfa_rport_offline_cb(rp);
4280 break;
4281
4278 default: 4282 default:
4279 bfa_stats(rp, sm_off_unexp); 4283 bfa_stats(rp, sm_off_unexp);
4280 bfa_sm_fault(rp->bfa, event); 4284 bfa_sm_fault(rp->bfa, event);
@@ -4391,6 +4395,7 @@ bfa_rport_sm_offline_pending(struct bfa_rport_s *rp,
4391 case BFA_RPORT_SM_HWFAIL: 4395 case BFA_RPORT_SM_HWFAIL:
4392 bfa_stats(rp, sm_offp_hwf); 4396 bfa_stats(rp, sm_offp_hwf);
4393 bfa_sm_set_state(rp, bfa_rport_sm_iocdisable); 4397 bfa_sm_set_state(rp, bfa_rport_sm_iocdisable);
4398 bfa_rport_offline_cb(rp);
4394 break; 4399 break;
4395 4400
4396 default: 4401 default:
@@ -4769,8 +4774,10 @@ bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed)
4769 WARN_ON(speed == 0); 4774 WARN_ON(speed == 0);
4770 WARN_ON(speed == BFA_PORT_SPEED_AUTO); 4775 WARN_ON(speed == BFA_PORT_SPEED_AUTO);
4771 4776
4772 rport->rport_info.speed = speed; 4777 if (rport) {
4773 bfa_sm_send_event(rport, BFA_RPORT_SM_SET_SPEED); 4778 rport->rport_info.speed = speed;
4779 bfa_sm_send_event(rport, BFA_RPORT_SM_SET_SPEED);
4780 }
4774} 4781}
4775 4782
4776/* Set Rport LUN Mask */ 4783/* Set Rport LUN Mask */
diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c
index ab11ef0f8466..c37494916a1a 100644
--- a/drivers/scsi/bfa/bfad.c
+++ b/drivers/scsi/bfa/bfad.c
@@ -57,6 +57,7 @@ int pcie_max_read_reqsz;
57int bfa_debugfs_enable = 1; 57int bfa_debugfs_enable = 1;
58int msix_disable_cb = 0, msix_disable_ct = 0; 58int msix_disable_cb = 0, msix_disable_ct = 0;
59int max_xfer_size = BFAD_MAX_SECTORS >> 1; 59int max_xfer_size = BFAD_MAX_SECTORS >> 1;
60int max_rport_logins = BFA_FCS_MAX_RPORT_LOGINS;
60 61
61/* Firmware releated */ 62/* Firmware releated */
62u32 bfi_image_cb_size, bfi_image_ct_size, bfi_image_ct2_size; 63u32 bfi_image_cb_size, bfi_image_ct_size, bfi_image_ct2_size;
@@ -148,6 +149,8 @@ MODULE_PARM_DESC(bfa_debugfs_enable, "Enables debugfs feature, default=1,"
148module_param(max_xfer_size, int, S_IRUGO | S_IWUSR); 149module_param(max_xfer_size, int, S_IRUGO | S_IWUSR);
149MODULE_PARM_DESC(max_xfer_size, "default=32MB," 150MODULE_PARM_DESC(max_xfer_size, "default=32MB,"
150 " Range[64k|128k|256k|512k|1024k|2048k]"); 151 " Range[64k|128k|256k|512k|1024k|2048k]");
152module_param(max_rport_logins, int, S_IRUGO | S_IWUSR);
153MODULE_PARM_DESC(max_rport_logins, "Max number of logins to initiator and target rports on a port (physical/logical), default=1024");
151 154
152static void 155static void
153bfad_sm_uninit(struct bfad_s *bfad, enum bfad_sm_event event); 156bfad_sm_uninit(struct bfad_s *bfad, enum bfad_sm_event event);
@@ -1766,6 +1769,7 @@ bfad_init(void)
1766 1769
1767 bfa_auto_recover = ioc_auto_recover; 1770 bfa_auto_recover = ioc_auto_recover;
1768 bfa_fcs_rport_set_del_timeout(rport_del_timeout); 1771 bfa_fcs_rport_set_del_timeout(rport_del_timeout);
1772 bfa_fcs_rport_set_max_logins(max_rport_logins);
1769 1773
1770 error = pci_register_driver(&bfad_pci_driver); 1774 error = pci_register_driver(&bfad_pci_driver);
1771 if (error) { 1775 if (error) {
diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c
index 0db905531a70..0afa39076cef 100644
--- a/drivers/scsi/bfa/bfad_bsg.c
+++ b/drivers/scsi/bfa/bfad_bsg.c
@@ -677,9 +677,11 @@ bfad_iocmd_rport_get_stats(struct bfad_s *bfad, void *cmd)
677 677
678 memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats, 678 memcpy((void *)&iocmd->stats, (void *)&fcs_rport->stats,
679 sizeof(struct bfa_rport_stats_s)); 679 sizeof(struct bfa_rport_stats_s));
680 memcpy((void *)&iocmd->stats.hal_stats, 680 if (bfa_fcs_rport_get_halrport(fcs_rport)) {
681 (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats), 681 memcpy((void *)&iocmd->stats.hal_stats,
682 sizeof(struct bfa_rport_hal_stats_s)); 682 (void *)&(bfa_fcs_rport_get_halrport(fcs_rport)->stats),
683 sizeof(struct bfa_rport_hal_stats_s));
684 }
683 685
684 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 686 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
685 iocmd->status = BFA_STATUS_OK; 687 iocmd->status = BFA_STATUS_OK;
@@ -715,7 +717,8 @@ bfad_iocmd_rport_clr_stats(struct bfad_s *bfad, void *cmd)
715 717
716 memset((char *)&fcs_rport->stats, 0, sizeof(struct bfa_rport_stats_s)); 718 memset((char *)&fcs_rport->stats, 0, sizeof(struct bfa_rport_stats_s));
717 rport = bfa_fcs_rport_get_halrport(fcs_rport); 719 rport = bfa_fcs_rport_get_halrport(fcs_rport);
718 memset(&rport->stats, 0, sizeof(rport->stats)); 720 if (rport)
721 memset(&rport->stats, 0, sizeof(rport->stats));
719 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 722 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
720 iocmd->status = BFA_STATUS_OK; 723 iocmd->status = BFA_STATUS_OK;
721out: 724out:
@@ -750,7 +753,8 @@ bfad_iocmd_rport_set_speed(struct bfad_s *bfad, void *cmd)
750 fcs_rport->rpf.assigned_speed = iocmd->speed; 753 fcs_rport->rpf.assigned_speed = iocmd->speed;
751 /* Set this speed in f/w only if the RPSC speed is not available */ 754 /* Set this speed in f/w only if the RPSC speed is not available */
752 if (fcs_rport->rpf.rpsc_speed == BFA_PORT_SPEED_UNKNOWN) 755 if (fcs_rport->rpf.rpsc_speed == BFA_PORT_SPEED_UNKNOWN)
753 bfa_rport_speed(fcs_rport->bfa_rport, iocmd->speed); 756 if (fcs_rport->bfa_rport)
757 bfa_rport_speed(fcs_rport->bfa_rport, iocmd->speed);
754 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 758 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
755 iocmd->status = BFA_STATUS_OK; 759 iocmd->status = BFA_STATUS_OK;
756out: 760out:
@@ -1036,9 +1040,10 @@ bfad_iocmd_itnim_get_iostats(struct bfad_s *bfad, void *cmd)
1036 iocmd->status = BFA_STATUS_UNKNOWN_RWWN; 1040 iocmd->status = BFA_STATUS_UNKNOWN_RWWN;
1037 else { 1041 else {
1038 iocmd->status = BFA_STATUS_OK; 1042 iocmd->status = BFA_STATUS_OK;
1039 memcpy((void *)&iocmd->iostats, (void *) 1043 if (bfa_fcs_itnim_get_halitn(itnim))
1040 &(bfa_fcs_itnim_get_halitn(itnim)->stats), 1044 memcpy((void *)&iocmd->iostats, (void *)
1041 sizeof(struct bfa_itnim_iostats_s)); 1045 &(bfa_fcs_itnim_get_halitn(itnim)->stats),
1046 sizeof(struct bfa_itnim_iostats_s));
1042 } 1047 }
1043 } 1048 }
1044 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1049 spin_unlock_irqrestore(&bfad->bfad_lock, flags);