aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
authorAndrew Vasquez <andrew.vasquez@qlogic.com>2009-07-31 18:09:24 -0400
committerJames Bottomley <James.Bottomley@suse.de>2009-08-22 18:52:16 -0400
commit9764ff8807a2455218e2ec5024e823cc09b01906 (patch)
tree7e882a144b56b14144ddd3cfcf889dac36efd049 /drivers/scsi/qla2xxx
parent8f1f3ece891e8fe6ee69fa27617b60cb26e37bec (diff)
[SCSI] qla2xxx: Correctly handle 'global port-unavailable' AEN.
Treat a global port-unavailable PORT_UPDATE (8014h) AEN as a loop-down event. For this case, within the FCoE domain, the 'logical' interface has been terminated, but the driver will not receive the classic LOOP_DOWN AEN. Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index f966d540d2cd..417a9b9fb19c 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -599,8 +599,36 @@ skip_rio:
599 599
600 case MBA_PORT_UPDATE: /* Port database update */ 600 case MBA_PORT_UPDATE: /* Port database update */
601 /* Only handle SCNs for our Vport index. */ 601 /* Only handle SCNs for our Vport index. */
602 if (vha->vp_idx && vha->vp_idx != (mb[3] & 0xff)) 602 if (mb[1] != 0xffff &&
603 vha->vp_idx && vha->vp_idx != (mb[3] & 0xff))
604 break;
605
606 /* Global event -- port logout or port unavailable. */
607 if (mb[1] == 0xffff && mb[2] == 0x7) {
608 DEBUG2(printk("scsi(%ld): Asynchronous PORT UPDATE.\n",
609 vha->host_no));
610 DEBUG(printk(KERN_INFO
611 "scsi(%ld): Port unavailable %04x %04x %04x.\n",
612 vha->host_no, mb[1], mb[2], mb[3]));
613
614 if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
615 atomic_set(&vha->loop_state, LOOP_DOWN);
616 atomic_set(&vha->loop_down_timer,
617 LOOP_DOWN_TIME);
618 vha->device_flags |= DFLG_NO_CABLE;
619 qla2x00_mark_all_devices_lost(vha, 1);
620 }
621
622 if (vha->vp_idx) {
623 atomic_set(&vha->vp_state, VP_FAILED);
624 fc_vport_set_state(vha->fc_vport,
625 FC_VPORT_FAILED);
626 }
627
628 vha->flags.management_server_logged_in = 0;
629 ha->link_data_rate = PORT_SPEED_UNKNOWN;
603 break; 630 break;
631 }
604 632
605 /* 633 /*
606 * If PORT UPDATE is global (received LIP_OCCURRED/LIP_RESET 634 * If PORT UPDATE is global (received LIP_OCCURRED/LIP_RESET