aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
authorJoe Carnuccio <joe.carnuccio@qlogic.com>2015-08-04 13:37:52 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-08-26 20:39:16 -0400
commit17cac3a175a02cd1ae21f9183b09f30a719832df (patch)
tree40f0ae03283bc81c41382747df4d43b454a29e62 /drivers/scsi/qla2xxx
parentf299c7c2ab5df78e3201af34e596e8a3ba4d2791 (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.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c35
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
563static inline fc_port_t *
564qla2x00_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
932global_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