diff options
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 30 |
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 |