diff options
author | Joe Carnuccio <joe.carnuccio@qlogic.com> | 2015-08-04 13:37:52 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Odin.com> | 2015-08-26 20:39:16 -0400 |
commit | 17cac3a175a02cd1ae21f9183b09f30a719832df (patch) | |
tree | 40f0ae03283bc81c41382747df4d43b454a29e62 /drivers/scsi/qla2xxx | |
parent | f299c7c2ab5df78e3201af34e596e8a3ba4d2791 (diff) |
qla2xxx: Handle AEN8014 incoming port logout.
When we get logged out, mark the port lost and set dpc flag for relogin.
Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 35 |
2 files changed, 33 insertions, 4 deletions
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 583d52aae79d..05d8cf016543 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -26,7 +26,7 @@ | |||
26 | * | | | 0x3036,0x3038 | | 26 | * | | | 0x3036,0x3038 | |
27 | * | | | 0x303a | | 27 | * | | | 0x303a | |
28 | * | DPC Thread | 0x4023 | 0x4002,0x4013 | | 28 | * | DPC Thread | 0x4023 | 0x4002,0x4013 | |
29 | * | Async Events | 0x5087 | 0x502b-0x502f | | 29 | * | Async Events | 0x508a | 0x502b-0x502f | |
30 | * | | | 0x5047 | | 30 | * | | | 0x5047 | |
31 | * | | | 0x5084,0x5075 | | 31 | * | | | 0x5084,0x5075 | |
32 | * | | | 0x503d,0x5044 | | 32 | * | | | 0x503d,0x5044 | |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 2cb0fba38c9e..b2b93dfbffd3 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -560,6 +560,17 @@ qla2x00_is_a_vp_did(scsi_qla_host_t *vha, uint32_t rscn_entry) | |||
560 | return ret; | 560 | return ret; |
561 | } | 561 | } |
562 | 562 | ||
563 | static inline fc_port_t * | ||
564 | qla2x00_find_fcport_by_loopid(scsi_qla_host_t *vha, uint16_t loop_id) | ||
565 | { | ||
566 | fc_port_t *fcport; | ||
567 | |||
568 | list_for_each_entry(fcport, &vha->vp_fcports, list) | ||
569 | if (fcport->loop_id == loop_id) | ||
570 | return fcport; | ||
571 | return NULL; | ||
572 | } | ||
573 | |||
563 | /** | 574 | /** |
564 | * qla2x00_async_event() - Process aynchronous events. | 575 | * qla2x00_async_event() - Process aynchronous events. |
565 | * @ha: SCSI driver HA context | 576 | * @ha: SCSI driver HA context |
@@ -897,11 +908,29 @@ skip_rio: | |||
897 | (mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff)) | 908 | (mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff)) |
898 | break; | 909 | break; |
899 | 910 | ||
900 | /* Global event -- port logout or port unavailable. */ | 911 | if (mb[2] == 0x7) { |
901 | if (mb[1] == 0xffff && mb[2] == 0x7) { | ||
902 | ql_dbg(ql_dbg_async, vha, 0x5010, | 912 | ql_dbg(ql_dbg_async, vha, 0x5010, |
903 | "Port unavailable %04x %04x %04x.\n", | 913 | "Port %s %04x %04x %04x.\n", |
914 | mb[1] == 0xffff ? "unavailable" : "logout", | ||
904 | mb[1], mb[2], mb[3]); | 915 | mb[1], mb[2], mb[3]); |
916 | |||
917 | if (mb[1] == 0xffff) | ||
918 | goto global_port_update; | ||
919 | |||
920 | /* Port logout */ | ||
921 | fcport = qla2x00_find_fcport_by_loopid(vha, mb[1]); | ||
922 | if (!fcport) | ||
923 | break; | ||
924 | if (atomic_read(&fcport->state) != FCS_ONLINE) | ||
925 | break; | ||
926 | ql_dbg(ql_dbg_async, vha, 0x508a, | ||
927 | "Marking port lost loopid=%04x portid=%06x.\n", | ||
928 | fcport->loop_id, fcport->d_id.b24); | ||
929 | qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1); | ||
930 | break; | ||
931 | |||
932 | global_port_update: | ||
933 | /* Port unavailable. */ | ||
905 | ql_log(ql_log_warn, vha, 0x505e, | 934 | ql_log(ql_log_warn, vha, 0x505e, |
906 | "Link is offline.\n"); | 935 | "Link is offline.\n"); |
907 | 936 | ||