diff options
Diffstat (limited to 'drivers/scsi/bfa/bfa_fcs_fcpim.c')
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs_fcpim.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/scsi/bfa/bfa_fcs_fcpim.c b/drivers/scsi/bfa/bfa_fcs_fcpim.c index 29b4108be26..9272840a240 100644 --- a/drivers/scsi/bfa/bfa_fcs_fcpim.c +++ b/drivers/scsi/bfa/bfa_fcs_fcpim.c | |||
@@ -37,6 +37,8 @@ static void bfa_fcs_itnim_prli_response(void *fcsarg, | |||
37 | struct bfa_fcxp_s *fcxp, void *cbarg, | 37 | struct bfa_fcxp_s *fcxp, void *cbarg, |
38 | bfa_status_t req_status, u32 rsp_len, | 38 | bfa_status_t req_status, u32 rsp_len, |
39 | u32 resid_len, struct fchs_s *rsp_fchs); | 39 | u32 resid_len, struct fchs_s *rsp_fchs); |
40 | static void bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, | ||
41 | enum bfa_itnim_aen_event event); | ||
40 | 42 | ||
41 | /* | 43 | /* |
42 | * fcs_itnim_sm FCS itnim state machine events | 44 | * fcs_itnim_sm FCS itnim state machine events |
@@ -269,6 +271,7 @@ bfa_fcs_itnim_sm_hcb_online(struct bfa_fcs_itnim_s *itnim, | |||
269 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, | 271 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, |
270 | "Target (WWN = %s) is online for initiator (WWN = %s)\n", | 272 | "Target (WWN = %s) is online for initiator (WWN = %s)\n", |
271 | rpwwn_buf, lpwwn_buf); | 273 | rpwwn_buf, lpwwn_buf); |
274 | bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_ONLINE); | ||
272 | break; | 275 | break; |
273 | 276 | ||
274 | case BFA_FCS_ITNIM_SM_OFFLINE: | 277 | case BFA_FCS_ITNIM_SM_OFFLINE: |
@@ -305,14 +308,17 @@ bfa_fcs_itnim_sm_online(struct bfa_fcs_itnim_s *itnim, | |||
305 | bfa_itnim_offline(itnim->bfa_itnim); | 308 | bfa_itnim_offline(itnim->bfa_itnim); |
306 | wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port)); | 309 | wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(itnim->rport->port)); |
307 | wwn2str(rpwwn_buf, itnim->rport->pwwn); | 310 | wwn2str(rpwwn_buf, itnim->rport->pwwn); |
308 | if (bfa_fcs_lport_is_online(itnim->rport->port) == BFA_TRUE) | 311 | if (bfa_fcs_lport_is_online(itnim->rport->port) == BFA_TRUE) { |
309 | BFA_LOG(KERN_ERR, bfad, bfa_log_level, | 312 | BFA_LOG(KERN_ERR, bfad, bfa_log_level, |
310 | "Target (WWN = %s) connectivity lost for " | 313 | "Target (WWN = %s) connectivity lost for " |
311 | "initiator (WWN = %s)\n", rpwwn_buf, lpwwn_buf); | 314 | "initiator (WWN = %s)\n", rpwwn_buf, lpwwn_buf); |
312 | else | 315 | bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_DISCONNECT); |
316 | } else { | ||
313 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, | 317 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, |
314 | "Target (WWN = %s) offlined by initiator (WWN = %s)\n", | 318 | "Target (WWN = %s) offlined by initiator (WWN = %s)\n", |
315 | rpwwn_buf, lpwwn_buf); | 319 | rpwwn_buf, lpwwn_buf); |
320 | bfa_fcs_itnim_aen_post(itnim, BFA_ITNIM_AEN_OFFLINE); | ||
321 | } | ||
316 | break; | 322 | break; |
317 | 323 | ||
318 | case BFA_FCS_ITNIM_SM_DELETE: | 324 | case BFA_FCS_ITNIM_SM_DELETE: |
@@ -382,6 +388,33 @@ bfa_fcs_itnim_sm_initiator(struct bfa_fcs_itnim_s *itnim, | |||
382 | } | 388 | } |
383 | 389 | ||
384 | static void | 390 | static void |
391 | bfa_fcs_itnim_aen_post(struct bfa_fcs_itnim_s *itnim, | ||
392 | enum bfa_itnim_aen_event event) | ||
393 | { | ||
394 | struct bfa_fcs_rport_s *rport = itnim->rport; | ||
395 | struct bfad_s *bfad = (struct bfad_s *)itnim->fcs->bfad; | ||
396 | struct bfa_aen_entry_s *aen_entry; | ||
397 | |||
398 | /* Don't post events for well known addresses */ | ||
399 | if (BFA_FCS_PID_IS_WKA(rport->pid)) | ||
400 | return; | ||
401 | |||
402 | bfad_get_aen_entry(bfad, aen_entry); | ||
403 | if (!aen_entry) | ||
404 | return; | ||
405 | |||
406 | aen_entry->aen_data.itnim.vf_id = rport->port->fabric->vf_id; | ||
407 | aen_entry->aen_data.itnim.ppwwn = bfa_fcs_lport_get_pwwn( | ||
408 | bfa_fcs_get_base_port(itnim->fcs)); | ||
409 | aen_entry->aen_data.itnim.lpwwn = bfa_fcs_lport_get_pwwn(rport->port); | ||
410 | aen_entry->aen_data.itnim.rpwwn = rport->pwwn; | ||
411 | |||
412 | /* Send the AEN notification */ | ||
413 | bfad_im_post_vendor_event(aen_entry, bfad, ++rport->fcs->fcs_aen_seq, | ||
414 | BFA_AEN_CAT_ITNIM, event); | ||
415 | } | ||
416 | |||
417 | static void | ||
385 | bfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced) | 418 | bfa_fcs_itnim_send_prli(void *itnim_cbarg, struct bfa_fcxp_s *fcxp_alloced) |
386 | { | 419 | { |
387 | struct bfa_fcs_itnim_s *itnim = itnim_cbarg; | 420 | struct bfa_fcs_itnim_s *itnim = itnim_cbarg; |