diff options
Diffstat (limited to 'drivers/scsi/bfa/bfa_fcs_lport.c')
-rw-r--r-- | drivers/scsi/bfa/bfa_fcs_lport.c | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c index f8251a91ba9..d4f951fe753 100644 --- a/drivers/scsi/bfa/bfa_fcs_lport.c +++ b/drivers/scsi/bfa/bfa_fcs_lport.c | |||
@@ -16,6 +16,7 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include "bfad_drv.h" | 18 | #include "bfad_drv.h" |
19 | #include "bfad_im.h" | ||
19 | #include "bfa_fcs.h" | 20 | #include "bfa_fcs.h" |
20 | #include "bfa_fcbuild.h" | 21 | #include "bfa_fcbuild.h" |
21 | #include "bfa_fc.h" | 22 | #include "bfa_fc.h" |
@@ -300,6 +301,31 @@ bfa_fcs_lport_sm_deleting( | |||
300 | */ | 301 | */ |
301 | 302 | ||
302 | /* | 303 | /* |
304 | * Send AEN notification | ||
305 | */ | ||
306 | static void | ||
307 | bfa_fcs_lport_aen_post(struct bfa_fcs_lport_s *port, | ||
308 | enum bfa_lport_aen_event event) | ||
309 | { | ||
310 | struct bfad_s *bfad = (struct bfad_s *)port->fabric->fcs->bfad; | ||
311 | struct bfa_aen_entry_s *aen_entry; | ||
312 | |||
313 | bfad_get_aen_entry(bfad, aen_entry); | ||
314 | if (!aen_entry) | ||
315 | return; | ||
316 | |||
317 | aen_entry->aen_data.lport.vf_id = port->fabric->vf_id; | ||
318 | aen_entry->aen_data.lport.roles = port->port_cfg.roles; | ||
319 | aen_entry->aen_data.lport.ppwwn = bfa_fcs_lport_get_pwwn( | ||
320 | bfa_fcs_get_base_port(port->fcs)); | ||
321 | aen_entry->aen_data.lport.lpwwn = bfa_fcs_lport_get_pwwn(port); | ||
322 | |||
323 | /* Send the AEN notification */ | ||
324 | bfad_im_post_vendor_event(aen_entry, bfad, ++port->fcs->fcs_aen_seq, | ||
325 | BFA_AEN_CAT_LPORT, event); | ||
326 | } | ||
327 | |||
328 | /* | ||
303 | * Send a LS reject | 329 | * Send a LS reject |
304 | */ | 330 | */ |
305 | static void | 331 | static void |
@@ -593,6 +619,7 @@ bfa_fcs_lport_online_actions(struct bfa_fcs_lport_s *port) | |||
593 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, | 619 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, |
594 | "Logical port online: WWN = %s Role = %s\n", | 620 | "Logical port online: WWN = %s Role = %s\n", |
595 | lpwwn_buf, "Initiator"); | 621 | lpwwn_buf, "Initiator"); |
622 | bfa_fcs_lport_aen_post(port, BFA_LPORT_AEN_ONLINE); | ||
596 | 623 | ||
597 | bfad->bfad_flags |= BFAD_PORT_ONLINE; | 624 | bfad->bfad_flags |= BFAD_PORT_ONLINE; |
598 | } | 625 | } |
@@ -611,14 +638,17 @@ bfa_fcs_lport_offline_actions(struct bfa_fcs_lport_s *port) | |||
611 | 638 | ||
612 | wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(port)); | 639 | wwn2str(lpwwn_buf, bfa_fcs_lport_get_pwwn(port)); |
613 | if (bfa_sm_cmp_state(port->fabric, | 640 | if (bfa_sm_cmp_state(port->fabric, |
614 | bfa_fcs_fabric_sm_online) == BFA_TRUE) | 641 | bfa_fcs_fabric_sm_online) == BFA_TRUE) { |
615 | BFA_LOG(KERN_ERR, bfad, bfa_log_level, | 642 | BFA_LOG(KERN_ERR, bfad, bfa_log_level, |
616 | "Logical port lost fabric connectivity: WWN = %s Role = %s\n", | 643 | "Logical port lost fabric connectivity: WWN = %s Role = %s\n", |
617 | lpwwn_buf, "Initiator"); | 644 | lpwwn_buf, "Initiator"); |
618 | else | 645 | bfa_fcs_lport_aen_post(port, BFA_LPORT_AEN_DISCONNECT); |
646 | } else { | ||
619 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, | 647 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, |
620 | "Logical port taken offline: WWN = %s Role = %s\n", | 648 | "Logical port taken offline: WWN = %s Role = %s\n", |
621 | lpwwn_buf, "Initiator"); | 649 | lpwwn_buf, "Initiator"); |
650 | bfa_fcs_lport_aen_post(port, BFA_LPORT_AEN_OFFLINE); | ||
651 | } | ||
622 | 652 | ||
623 | list_for_each_safe(qe, qen, &port->rport_q) { | 653 | list_for_each_safe(qe, qen, &port->rport_q) { |
624 | rport = (struct bfa_fcs_rport_s *) qe; | 654 | rport = (struct bfa_fcs_rport_s *) qe; |
@@ -676,6 +706,7 @@ bfa_fcs_lport_deleted(struct bfa_fcs_lport_s *port) | |||
676 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, | 706 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, |
677 | "Logical port deleted: WWN = %s Role = %s\n", | 707 | "Logical port deleted: WWN = %s Role = %s\n", |
678 | lpwwn_buf, "Initiator"); | 708 | lpwwn_buf, "Initiator"); |
709 | bfa_fcs_lport_aen_post(port, BFA_LPORT_AEN_DELETE); | ||
679 | 710 | ||
680 | /* Base port will be deleted by the OS driver */ | 711 | /* Base port will be deleted by the OS driver */ |
681 | if (port->vport) { | 712 | if (port->vport) { |
@@ -973,6 +1004,7 @@ bfa_fcs_lport_init(struct bfa_fcs_lport_s *lport, | |||
973 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, | 1004 | BFA_LOG(KERN_INFO, bfad, bfa_log_level, |
974 | "New logical port created: WWN = %s Role = %s\n", | 1005 | "New logical port created: WWN = %s Role = %s\n", |
975 | lpwwn_buf, "Initiator"); | 1006 | lpwwn_buf, "Initiator"); |
1007 | bfa_fcs_lport_aen_post(lport, BFA_LPORT_AEN_NEW); | ||
976 | 1008 | ||
977 | bfa_sm_set_state(lport, bfa_fcs_lport_sm_uninit); | 1009 | bfa_sm_set_state(lport, bfa_fcs_lport_sm_uninit); |
978 | bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE); | 1010 | bfa_sm_send_event(lport, BFA_FCS_PORT_SM_CREATE); |
@@ -5559,6 +5591,31 @@ bfa_fcs_vport_sm_logo(struct bfa_fcs_vport_s *vport, | |||
5559 | * fcs_vport_private FCS virtual port private functions | 5591 | * fcs_vport_private FCS virtual port private functions |
5560 | */ | 5592 | */ |
5561 | /* | 5593 | /* |
5594 | * Send AEN notification | ||
5595 | */ | ||
5596 | static void | ||
5597 | bfa_fcs_vport_aen_post(struct bfa_fcs_lport_s *port, | ||
5598 | enum bfa_lport_aen_event event) | ||
5599 | { | ||
5600 | struct bfad_s *bfad = (struct bfad_s *)port->fabric->fcs->bfad; | ||
5601 | struct bfa_aen_entry_s *aen_entry; | ||
5602 | |||
5603 | bfad_get_aen_entry(bfad, aen_entry); | ||
5604 | if (!aen_entry) | ||
5605 | return; | ||
5606 | |||
5607 | aen_entry->aen_data.lport.vf_id = port->fabric->vf_id; | ||
5608 | aen_entry->aen_data.lport.roles = port->port_cfg.roles; | ||
5609 | aen_entry->aen_data.lport.ppwwn = bfa_fcs_lport_get_pwwn( | ||
5610 | bfa_fcs_get_base_port(port->fcs)); | ||
5611 | aen_entry->aen_data.lport.lpwwn = bfa_fcs_lport_get_pwwn(port); | ||
5612 | |||
5613 | /* Send the AEN notification */ | ||
5614 | bfad_im_post_vendor_event(aen_entry, bfad, ++port->fcs->fcs_aen_seq, | ||
5615 | BFA_AEN_CAT_LPORT, event); | ||
5616 | } | ||
5617 | |||
5618 | /* | ||
5562 | * This routine will be called to send a FDISC command. | 5619 | * This routine will be called to send a FDISC command. |
5563 | */ | 5620 | */ |
5564 | static void | 5621 | static void |
@@ -5585,8 +5642,11 @@ bfa_fcs_vport_fdisc_rejected(struct bfa_fcs_vport_s *vport) | |||
5585 | case FC_LS_RJT_EXP_INVALID_NPORT_ID: /* by Cisco */ | 5642 | case FC_LS_RJT_EXP_INVALID_NPORT_ID: /* by Cisco */ |
5586 | if (vport->fdisc_retries < BFA_FCS_VPORT_MAX_RETRIES) | 5643 | if (vport->fdisc_retries < BFA_FCS_VPORT_MAX_RETRIES) |
5587 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_ERROR); | 5644 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_ERROR); |
5588 | else | 5645 | else { |
5646 | bfa_fcs_vport_aen_post(&vport->lport, | ||
5647 | BFA_LPORT_AEN_NPIV_DUP_WWN); | ||
5589 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_DUP_WWN); | 5648 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_DUP_WWN); |
5649 | } | ||
5590 | break; | 5650 | break; |
5591 | 5651 | ||
5592 | case FC_LS_RJT_EXP_INSUFF_RES: | 5652 | case FC_LS_RJT_EXP_INSUFF_RES: |
@@ -5596,11 +5656,17 @@ bfa_fcs_vport_fdisc_rejected(struct bfa_fcs_vport_s *vport) | |||
5596 | */ | 5656 | */ |
5597 | if (vport->fdisc_retries < BFA_FCS_VPORT_MAX_RETRIES) | 5657 | if (vport->fdisc_retries < BFA_FCS_VPORT_MAX_RETRIES) |
5598 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_ERROR); | 5658 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_ERROR); |
5599 | else | 5659 | else { |
5660 | bfa_fcs_vport_aen_post(&vport->lport, | ||
5661 | BFA_LPORT_AEN_NPIV_FABRIC_MAX); | ||
5600 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_FAILED); | 5662 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_FAILED); |
5663 | } | ||
5601 | break; | 5664 | break; |
5602 | 5665 | ||
5603 | default: | 5666 | default: |
5667 | if (vport->fdisc_retries == 0) | ||
5668 | bfa_fcs_vport_aen_post(&vport->lport, | ||
5669 | BFA_LPORT_AEN_NPIV_UNKNOWN); | ||
5604 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_ERROR); | 5670 | bfa_sm_send_event(vport, BFA_FCS_VPORT_SM_RSP_ERROR); |
5605 | } | 5671 | } |
5606 | } | 5672 | } |