diff options
-rw-r--r-- | drivers/scsi/bfa/bfa_fcpim.c | 12 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs.c | 8 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs.h | 28 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs_fcpim.c | 124 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs_lport.c | 46 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs_rport.c | 421 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfa_svc.c | 11 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfad.c | 4 | ||||
-rw-r--r-- | drivers/scsi/bfa/bfad_bsg.c | 21 |
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 | |||
1466 | bfa_itnim_get_ioprofile(struct bfa_itnim_s *itnim, | 1466 | bfa_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 | |||
1484 | bfa_itnim_clear_stats(struct bfa_itnim_s *itnim) | 1490 | bfa_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 | ||
70 | struct bfa_fcs_lport_ns_s { | 69 | struct 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, | |||
472 | struct bfa_fcs_rport_s *bfa_fcs_rport_lookup_by_nwwn( | 471 | struct 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); |
474 | void bfa_fcs_rport_set_del_timeout(u8 rport_tmo); | 473 | void bfa_fcs_rport_set_del_timeout(u8 rport_tmo); |
475 | 474 | void bfa_fcs_rport_set_max_logins(u32 max_logins); | |
476 | void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, | 475 | void 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); |
478 | void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport); | 477 | void 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, | |||
606 | struct bfa_fcs_itnim_s *bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport); | 605 | struct bfa_fcs_itnim_s *bfa_fcs_itnim_create(struct bfa_fcs_rport_s *rport); |
607 | void bfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim); | 606 | void bfa_fcs_itnim_delete(struct bfa_fcs_itnim_s *itnim); |
608 | void bfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim); | 607 | void bfa_fcs_itnim_rport_offline(struct bfa_fcs_itnim_s *itnim); |
609 | void bfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim); | 608 | void bfa_fcs_itnim_brp_online(struct bfa_fcs_itnim_s *itnim); |
610 | bfa_status_t bfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim); | 609 | bfa_status_t bfa_fcs_itnim_get_online_state(struct bfa_fcs_itnim_s *itnim); |
611 | void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim); | 610 | void bfa_fcs_itnim_is_initiator(struct bfa_fcs_itnim_s *itnim); |
612 | void bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, | 611 | void 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 | */ | ||
753 | enum 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, | |||
40 | static void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, | 40 | static 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 | |||
47 | enum 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 | |||
62 | static void bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim, | 43 | static 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); |
64 | static void bfa_fcs_itnim_sm_prli_send(struct bfa_fcs_itnim_s *itnim, | 45 | static 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); |
70 | static void bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, | 51 | static 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); |
53 | static void bfa_fcs_itnim_sm_hal_rport_online(struct bfa_fcs_itnim_s *itnim, | ||
54 | enum bfa_fcs_itnim_event event); | ||
72 | static void bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, | 55 | static 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); |
74 | static void bfa_fcs_itnim_sm_hcb_offline(struct bfa_fcs_itnim_s *itnim, | 57 | static 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 | ||
210 | static void | 196 | static void |
197 | bfa_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 | |||
234 | static void | ||
211 | bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim, | 235 | bfa_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) | |||
532 | static void | 562 | static void |
533 | bfa_fcs_itnim_free(struct bfa_fcs_itnim_s *itnim) | 563 | bfa_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 | */ |
616 | void | 636 | void |
617 | bfa_fcs_itnim_rport_online(struct bfa_fcs_itnim_s *itnim) | 637 | bfa_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 | ||
4771 | static void | 4799 | static void |
@@ -5183,10 +5211,26 @@ static void | |||
5183 | bfa_fcs_lport_scn_portid_rscn(struct bfa_fcs_lport_s *port, u32 rpid) | 5211 | bfa_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 | |||
30 | bfa_fcs_rport_del_timeout = BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000; | 30 | bfa_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 | */ | ||
36 | static u32 bfa_fcs_rport_max_logins = BFA_FCS_MAX_RPORT_LOGINS; | ||
37 | |||
38 | /* | ||
33 | * forward declarations | 39 | * forward declarations |
34 | */ | 40 | */ |
35 | static struct bfa_fcs_rport_s *bfa_fcs_rport_alloc( | 41 | static 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); |
37 | static void bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport); | 43 | static void bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport); |
38 | static void bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport); | 44 | static void bfa_fcs_rport_hal_online(struct bfa_fcs_rport_s *rport); |
39 | static void bfa_fcs_rport_online_action(struct bfa_fcs_rport_s *rport); | 45 | static void bfa_fcs_rport_fcs_online_action(struct bfa_fcs_rport_s *rport); |
40 | static void bfa_fcs_rport_offline_action(struct bfa_fcs_rport_s *rport); | 46 | static void bfa_fcs_rport_hal_online_action(struct bfa_fcs_rport_s *rport); |
47 | static void bfa_fcs_rport_fcs_offline_action(struct bfa_fcs_rport_s *rport); | ||
48 | static void bfa_fcs_rport_hal_offline_action(struct bfa_fcs_rport_s *rport); | ||
41 | static void bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport, | 49 | static void bfa_fcs_rport_update(struct bfa_fcs_rport_s *rport, |
42 | struct fc_logi_s *plogi); | 50 | struct fc_logi_s *plogi); |
43 | static void bfa_fcs_rport_timeout(void *arg); | 51 | static 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, | |||
76 | static void bfa_fcs_rport_process_adisc(struct bfa_fcs_rport_s *rport, | 84 | static 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); |
78 | static void bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s *rport); | 86 | static void bfa_fcs_rport_send_prlo_acc(struct bfa_fcs_rport_s *rport); |
87 | static void bfa_fcs_rport_hal_offline(struct bfa_fcs_rport_s *rport); | ||
79 | 88 | ||
80 | static void bfa_fcs_rport_sm_uninit(struct bfa_fcs_rport_s *rport, | 89 | static 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); |
88 | static void bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, | 97 | static void bfa_fcs_rport_sm_plogi(struct bfa_fcs_rport_s *rport, |
89 | enum rport_event event); | 98 | enum rport_event event); |
99 | static void bfa_fcs_rport_sm_fc4_fcs_online(struct bfa_fcs_rport_s *rport, | ||
100 | enum rport_event event); | ||
90 | static void bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport, | 101 | static void bfa_fcs_rport_sm_hal_online(struct bfa_fcs_rport_s *rport, |
91 | enum rport_event event); | 102 | enum rport_event event); |
92 | static void bfa_fcs_rport_sm_online(struct bfa_fcs_rport_s *rport, | 103 | static 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); |
124 | static void bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport, | 135 | static void bfa_fcs_rport_sm_nsdisc_sent(struct bfa_fcs_rport_s *rport, |
125 | enum rport_event event); | 136 | enum rport_event event); |
137 | static void bfa_fcs_rport_sm_fc4_off_delete(struct bfa_fcs_rport_s *rport, | ||
138 | enum rport_event event); | ||
139 | static void bfa_fcs_rport_sm_delete_pending(struct bfa_fcs_rport_s *rport, | ||
140 | enum rport_event event); | ||
126 | 141 | ||
127 | static struct bfa_sm_table_s rport_sm_table[] = { | 142 | static 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 | */ | ||
476 | static void | ||
477 | bfa_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 | */ | ||
1470 | static void | ||
1471 | bfa_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 | */ | ||
1499 | static void | ||
1500 | bfa_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 | ||
2131 | static void | ||
2132 | bfa_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 | |||
1967 | static struct bfa_fcs_rport_s * | 2140 | static struct bfa_fcs_rport_s * |
1968 | bfa_fcs_rport_alloc(struct bfa_fcs_lport_s *port, wwn_t pwwn, u32 rpid) | 2141 | bfa_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 | |||
2032 | bfa_fcs_rport_free(struct bfa_fcs_rport_s *rport) | 2201 | bfa_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 | ||
2081 | static void | 2258 | static void |
2082 | bfa_fcs_rport_online_action(struct bfa_fcs_rport_s *rport) | 2259 | bfa_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 | |||
2269 | static void | ||
2270 | bfa_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 | ||
2112 | static void | 2300 | static void |
2113 | bfa_fcs_rport_offline_action(struct bfa_fcs_rport_s *rport) | 2301 | bfa_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 | |||
2309 | static void | ||
2310 | bfa_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 | */ | ||
2797 | void | ||
2798 | bfa_fcs_rport_set_max_logins(u32 max_logins) | ||
2799 | { | ||
2800 | if (max_logins > 0) | ||
2801 | bfa_fcs_rport_max_logins = max_logins; | ||
2802 | } | ||
2803 | |||
2593 | void | 2804 | void |
2594 | bfa_fcs_rport_get_attr(struct bfa_fcs_rport_s *rport, | 2805 | bfa_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; | |||
57 | int bfa_debugfs_enable = 1; | 57 | int bfa_debugfs_enable = 1; |
58 | int msix_disable_cb = 0, msix_disable_ct = 0; | 58 | int msix_disable_cb = 0, msix_disable_ct = 0; |
59 | int max_xfer_size = BFAD_MAX_SECTORS >> 1; | 59 | int max_xfer_size = BFAD_MAX_SECTORS >> 1; |
60 | int max_rport_logins = BFA_FCS_MAX_RPORT_LOGINS; | ||
60 | 61 | ||
61 | /* Firmware releated */ | 62 | /* Firmware releated */ |
62 | u32 bfi_image_cb_size, bfi_image_ct_size, bfi_image_ct2_size; | 63 | u32 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," | |||
148 | module_param(max_xfer_size, int, S_IRUGO | S_IWUSR); | 149 | module_param(max_xfer_size, int, S_IRUGO | S_IWUSR); |
149 | MODULE_PARM_DESC(max_xfer_size, "default=32MB," | 150 | MODULE_PARM_DESC(max_xfer_size, "default=32MB," |
150 | " Range[64k|128k|256k|512k|1024k|2048k]"); | 151 | " Range[64k|128k|256k|512k|1024k|2048k]"); |
152 | module_param(max_rport_logins, int, S_IRUGO | S_IWUSR); | ||
153 | MODULE_PARM_DESC(max_rport_logins, "Max number of logins to initiator and target rports on a port (physical/logical), default=1024"); | ||
151 | 154 | ||
152 | static void | 155 | static void |
153 | bfad_sm_uninit(struct bfad_s *bfad, enum bfad_sm_event event); | 156 | bfad_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; |
721 | out: | 724 | out: |
@@ -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; |
756 | out: | 760 | out: |
@@ -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); |