diff options
Diffstat (limited to 'drivers/scsi/qla4xxx/ql4_isr.c')
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_isr.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c index 81909d949905..1b83dc283d2e 100644 --- a/drivers/scsi/qla4xxx/ql4_isr.c +++ b/drivers/scsi/qla4xxx/ql4_isr.c | |||
@@ -582,6 +582,33 @@ exit_prq_error: | |||
582 | } | 582 | } |
583 | 583 | ||
584 | /** | 584 | /** |
585 | * qla4_83xx_loopback_in_progress: Is loopback in progress? | ||
586 | * @ha: Pointer to host adapter structure. | ||
587 | * @ret: 1 = loopback in progress, 0 = loopback not in progress | ||
588 | **/ | ||
589 | static int qla4_83xx_loopback_in_progress(struct scsi_qla_host *ha) | ||
590 | { | ||
591 | int rval = 1; | ||
592 | |||
593 | if (is_qla8032(ha)) { | ||
594 | if ((ha->idc_info.info2 & ENABLE_INTERNAL_LOOPBACK) || | ||
595 | (ha->idc_info.info2 & ENABLE_EXTERNAL_LOOPBACK)) { | ||
596 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
597 | "%s: Loopback diagnostics in progress\n", | ||
598 | __func__)); | ||
599 | rval = 1; | ||
600 | } else { | ||
601 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
602 | "%s: Loopback diagnostics not in progress\n", | ||
603 | __func__)); | ||
604 | rval = 0; | ||
605 | } | ||
606 | } | ||
607 | |||
608 | return rval; | ||
609 | } | ||
610 | |||
611 | /** | ||
585 | * qla4xxx_isr_decode_mailbox - decodes mailbox status | 612 | * qla4xxx_isr_decode_mailbox - decodes mailbox status |
586 | * @ha: Pointer to host adapter structure. | 613 | * @ha: Pointer to host adapter structure. |
587 | * @mailbox_status: Mailbox status. | 614 | * @mailbox_status: Mailbox status. |
@@ -676,8 +703,10 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
676 | 703 | ||
677 | case MBOX_ASTS_LINK_DOWN: | 704 | case MBOX_ASTS_LINK_DOWN: |
678 | clear_bit(AF_LINK_UP, &ha->flags); | 705 | clear_bit(AF_LINK_UP, &ha->flags); |
679 | if (test_bit(AF_INIT_DONE, &ha->flags)) | 706 | if (test_bit(AF_INIT_DONE, &ha->flags)) { |
680 | set_bit(DPC_LINK_CHANGED, &ha->dpc_flags); | 707 | set_bit(DPC_LINK_CHANGED, &ha->dpc_flags); |
708 | qla4xxx_wake_dpc(ha); | ||
709 | } | ||
681 | 710 | ||
682 | ql4_printk(KERN_INFO, ha, "%s: LINK DOWN\n", __func__); | 711 | ql4_printk(KERN_INFO, ha, "%s: LINK DOWN\n", __func__); |
683 | qla4xxx_post_aen_work(ha, ISCSI_EVENT_LINKDOWN, | 712 | qla4xxx_post_aen_work(ha, ISCSI_EVENT_LINKDOWN, |
@@ -840,6 +869,11 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
840 | DEBUG2(ql4_printk(KERN_INFO, ha, | 869 | DEBUG2(ql4_printk(KERN_INFO, ha, |
841 | "scsi:%ld: AEN %04x IDC Complete notification\n", | 870 | "scsi:%ld: AEN %04x IDC Complete notification\n", |
842 | ha->host_no, mbox_sts[0])); | 871 | ha->host_no, mbox_sts[0])); |
872 | |||
873 | if (qla4_83xx_loopback_in_progress(ha)) | ||
874 | set_bit(AF_LOOPBACK, &ha->flags); | ||
875 | else | ||
876 | clear_bit(AF_LOOPBACK, &ha->flags); | ||
843 | } | 877 | } |
844 | break; | 878 | break; |
845 | 879 | ||