diff options
Diffstat (limited to 'drivers/scsi/qla4xxx')
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_isr.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c index 35b9e36a0e8d..946e22b1e4b8 100644 --- a/drivers/scsi/qla4xxx/ql4_isr.c +++ b/drivers/scsi/qla4xxx/ql4_isr.c | |||
@@ -6,6 +6,9 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include "ql4_def.h" | 8 | #include "ql4_def.h" |
9 | #include "ql4_glbl.h" | ||
10 | #include "ql4_dbg.h" | ||
11 | #include "ql4_inline.h" | ||
9 | 12 | ||
10 | /** | 13 | /** |
11 | * qla2x00_process_completed_request() - Process a Fast Post response. | 14 | * qla2x00_process_completed_request() - Process a Fast Post response. |
@@ -417,6 +420,7 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
417 | uint32_t mbox_status) | 420 | uint32_t mbox_status) |
418 | { | 421 | { |
419 | int i; | 422 | int i; |
423 | uint32_t mbox_stat2, mbox_stat3; | ||
420 | 424 | ||
421 | if ((mbox_status == MBOX_STS_BUSY) || | 425 | if ((mbox_status == MBOX_STS_BUSY) || |
422 | (mbox_status == MBOX_STS_INTERMEDIATE_COMPLETION) || | 426 | (mbox_status == MBOX_STS_INTERMEDIATE_COMPLETION) || |
@@ -437,6 +441,12 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
437 | } else if (mbox_status >> 12 == MBOX_ASYNC_EVENT_STATUS) { | 441 | } else if (mbox_status >> 12 == MBOX_ASYNC_EVENT_STATUS) { |
438 | /* Immediately process the AENs that don't require much work. | 442 | /* Immediately process the AENs that don't require much work. |
439 | * Only queue the database_changed AENs */ | 443 | * Only queue the database_changed AENs */ |
444 | if (ha->aen_log.count < MAX_AEN_ENTRIES) { | ||
445 | for (i = 0; i < MBOX_AEN_REG_COUNT; i++) | ||
446 | ha->aen_log.entry[ha->aen_log.count].mbox_sts[i] = | ||
447 | readl(&ha->reg->mailbox[i]); | ||
448 | ha->aen_log.count++; | ||
449 | } | ||
440 | switch (mbox_status) { | 450 | switch (mbox_status) { |
441 | case MBOX_ASTS_SYSTEM_ERROR: | 451 | case MBOX_ASTS_SYSTEM_ERROR: |
442 | /* Log Mailbox registers */ | 452 | /* Log Mailbox registers */ |
@@ -493,6 +503,16 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
493 | mbox_status)); | 503 | mbox_status)); |
494 | break; | 504 | break; |
495 | 505 | ||
506 | case MBOX_ASTS_IP_ADDR_STATE_CHANGED: | ||
507 | mbox_stat2 = readl(&ha->reg->mailbox[2]); | ||
508 | mbox_stat3 = readl(&ha->reg->mailbox[3]); | ||
509 | |||
510 | if ((mbox_stat3 == 5) && (mbox_stat2 == 3)) | ||
511 | set_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags); | ||
512 | else if ((mbox_stat3 == 2) && (mbox_stat2 == 5)) | ||
513 | set_bit(DPC_RESET_HA, &ha->dpc_flags); | ||
514 | break; | ||
515 | |||
496 | case MBOX_ASTS_MAC_ADDRESS_CHANGED: | 516 | case MBOX_ASTS_MAC_ADDRESS_CHANGED: |
497 | case MBOX_ASTS_DNS: | 517 | case MBOX_ASTS_DNS: |
498 | /* No action */ | 518 | /* No action */ |
@@ -518,11 +538,6 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
518 | /* Queue AEN information and process it in the DPC | 538 | /* Queue AEN information and process it in the DPC |
519 | * routine */ | 539 | * routine */ |
520 | if (ha->aen_q_count > 0) { | 540 | if (ha->aen_q_count > 0) { |
521 | /* advance pointer */ | ||
522 | if (ha->aen_in == (MAX_AEN_ENTRIES - 1)) | ||
523 | ha->aen_in = 0; | ||
524 | else | ||
525 | ha->aen_in++; | ||
526 | 541 | ||
527 | /* decrement available counter */ | 542 | /* decrement available counter */ |
528 | ha->aen_q_count--; | 543 | ha->aen_q_count--; |
@@ -542,6 +557,10 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha, | |||
542 | ha->aen_q[ha->aen_in].mbox_sts[2], | 557 | ha->aen_q[ha->aen_in].mbox_sts[2], |
543 | ha->aen_q[ha->aen_in].mbox_sts[3], | 558 | ha->aen_q[ha->aen_in].mbox_sts[3], |
544 | ha->aen_q[ha->aen_in]. mbox_sts[4])); | 559 | ha->aen_q[ha->aen_in]. mbox_sts[4])); |
560 | /* advance pointer */ | ||
561 | ha->aen_in++; | ||
562 | if (ha->aen_in == MAX_AEN_ENTRIES) | ||
563 | ha->aen_in = 0; | ||
545 | 564 | ||
546 | /* The DPC routine will process the aen */ | 565 | /* The DPC routine will process the aen */ |
547 | set_bit(DPC_AEN, &ha->dpc_flags); | 566 | set_bit(DPC_AEN, &ha->dpc_flags); |
@@ -724,25 +743,24 @@ void qla4xxx_process_aen(struct scsi_qla_host * ha, uint8_t process_aen) | |||
724 | 743 | ||
725 | spin_lock_irqsave(&ha->hardware_lock, flags); | 744 | spin_lock_irqsave(&ha->hardware_lock, flags); |
726 | while (ha->aen_out != ha->aen_in) { | 745 | while (ha->aen_out != ha->aen_in) { |
727 | /* Advance pointers for next entry */ | ||
728 | if (ha->aen_out == (MAX_AEN_ENTRIES - 1)) | ||
729 | ha->aen_out = 0; | ||
730 | else | ||
731 | ha->aen_out++; | ||
732 | |||
733 | ha->aen_q_count++; | ||
734 | aen = &ha->aen_q[ha->aen_out]; | 746 | aen = &ha->aen_q[ha->aen_out]; |
735 | |||
736 | /* copy aen information to local structure */ | 747 | /* copy aen information to local structure */ |
737 | for (i = 0; i < MBOX_AEN_REG_COUNT; i++) | 748 | for (i = 0; i < MBOX_AEN_REG_COUNT; i++) |
738 | mbox_sts[i] = aen->mbox_sts[i]; | 749 | mbox_sts[i] = aen->mbox_sts[i]; |
739 | 750 | ||
751 | ha->aen_q_count++; | ||
752 | ha->aen_out++; | ||
753 | |||
754 | if (ha->aen_out == MAX_AEN_ENTRIES) | ||
755 | ha->aen_out = 0; | ||
756 | |||
740 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 757 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
741 | 758 | ||
742 | DEBUG(printk("scsi%ld: AEN[%d] %04x, index [%d] state=%04x " | 759 | DEBUG2(printk("qla4xxx(%ld): AEN[%d]=0x%08x, mbx1=0x%08x mbx2=0x%08x" |
743 | "mod=%x conerr=%08x \n", ha->host_no, ha->aen_out, | 760 | " mbx3=0x%08x mbx4=0x%08x\n", ha->host_no, |
744 | mbox_sts[0], mbox_sts[2], mbox_sts[3], | 761 | (ha->aen_out ? (ha->aen_out-1): (MAX_AEN_ENTRIES-1)), |
745 | mbox_sts[1], mbox_sts[4])); | 762 | mbox_sts[0], mbox_sts[1], mbox_sts[2], |
763 | mbox_sts[3], mbox_sts[4])); | ||
746 | 764 | ||
747 | switch (mbox_sts[0]) { | 765 | switch (mbox_sts[0]) { |
748 | case MBOX_ASTS_DATABASE_CHANGED: | 766 | case MBOX_ASTS_DATABASE_CHANGED: |
@@ -792,6 +810,5 @@ void qla4xxx_process_aen(struct scsi_qla_host * ha, uint8_t process_aen) | |||
792 | spin_lock_irqsave(&ha->hardware_lock, flags); | 810 | spin_lock_irqsave(&ha->hardware_lock, flags); |
793 | } | 811 | } |
794 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 812 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
795 | |||
796 | } | 813 | } |
797 | 814 | ||