Commit 17cac3a1 authored by Joe Carnuccio's avatar Joe Carnuccio Committed by James Bottomley

qla2xxx: Handle AEN8014 incoming port logout.

When we get logged out, mark the port lost and set dpc flag for relogin.
Signed-off-by: default avatarJoe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent f299c7c2
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
* | | | 0x3036,0x3038 | * | | | 0x3036,0x3038 |
* | | | 0x303a | * | | | 0x303a |
* | DPC Thread | 0x4023 | 0x4002,0x4013 | * | DPC Thread | 0x4023 | 0x4002,0x4013 |
* | Async Events | 0x5087 | 0x502b-0x502f | * | Async Events | 0x508a | 0x502b-0x502f |
* | | | 0x5047 | * | | | 0x5047 |
* | | | 0x5084,0x5075 | * | | | 0x5084,0x5075 |
* | | | 0x503d,0x5044 | * | | | 0x503d,0x5044 |
......
...@@ -560,6 +560,17 @@ qla2x00_is_a_vp_did(scsi_qla_host_t *vha, uint32_t rscn_entry) ...@@ -560,6 +560,17 @@ qla2x00_is_a_vp_did(scsi_qla_host_t *vha, uint32_t rscn_entry)
return ret; return ret;
} }
static inline fc_port_t *
qla2x00_find_fcport_by_loopid(scsi_qla_host_t *vha, uint16_t loop_id)
{
fc_port_t *fcport;
list_for_each_entry(fcport, &vha->vp_fcports, list)
if (fcport->loop_id == loop_id)
return fcport;
return NULL;
}
/** /**
* qla2x00_async_event() - Process aynchronous events. * qla2x00_async_event() - Process aynchronous events.
* @ha: SCSI driver HA context * @ha: SCSI driver HA context
...@@ -897,11 +908,29 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) ...@@ -897,11 +908,29 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
(mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff)) (mb[1] != 0xffff)) && vha->vp_idx != (mb[3] & 0xff))
break; break;
/* Global event -- port logout or port unavailable. */ if (mb[2] == 0x7) {
if (mb[1] == 0xffff && mb[2] == 0x7) {
ql_dbg(ql_dbg_async, vha, 0x5010, ql_dbg(ql_dbg_async, vha, 0x5010,
"Port unavailable %04x %04x %04x.\n", "Port %s %04x %04x %04x.\n",
mb[1] == 0xffff ? "unavailable" : "logout",
mb[1], mb[2], mb[3]); mb[1], mb[2], mb[3]);
if (mb[1] == 0xffff)
goto global_port_update;
/* Port logout */
fcport = qla2x00_find_fcport_by_loopid(vha, mb[1]);
if (!fcport)
break;
if (atomic_read(&fcport->state) != FCS_ONLINE)
break;
ql_dbg(ql_dbg_async, vha, 0x508a,
"Marking port lost loopid=%04x portid=%06x.\n",
fcport->loop_id, fcport->d_id.b24);
qla2x00_mark_device_lost(fcport->vha, fcport, 1, 1);
break;
global_port_update:
/* Port unavailable. */
ql_log(ql_log_warn, vha, 0x505e, ql_log(ql_log_warn, vha, 0x505e,
"Link is offline.\n"); "Link is offline.\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment