diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2009-06-03 12:55:30 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-06-08 15:47:00 -0400 |
commit | 18e7555a38eaadb757353c4b76667e07166ad26c (patch) | |
tree | 3b8b0f43076aff5d87c0c8800fb3c4a221af78a0 | |
parent | 656e89122a737b60cebc7b8fcb669faf0e7bc905 (diff) |
[SCSI] qla2xxx: Synchronize MPI settings after a PE Reset.
Ensure MPS remains in synchronization across all NIC/FCoE
functions after a reset.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 52 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 63 |
3 files changed, 121 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 1ef18cce0c55..65b12d82867c 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -299,6 +299,12 @@ qla2x00_get_xgmac_stats(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t *); | |||
299 | extern int | 299 | extern int |
300 | qla2x00_get_dcbx_params(scsi_qla_host_t *, dma_addr_t, uint16_t); | 300 | qla2x00_get_dcbx_params(scsi_qla_host_t *, dma_addr_t, uint16_t); |
301 | 301 | ||
302 | extern int | ||
303 | qla2x00_read_ram_word(scsi_qla_host_t *, uint32_t, uint32_t *); | ||
304 | |||
305 | extern int | ||
306 | qla2x00_write_ram_word(scsi_qla_host_t *, uint32_t, uint32_t); | ||
307 | |||
302 | /* | 308 | /* |
303 | * Global Function Prototypes in qla_isr.c source file. | 309 | * Global Function Prototypes in qla_isr.c source file. |
304 | */ | 310 | */ |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 36cea2224b3c..262026129325 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -886,6 +886,56 @@ cont_alloc: | |||
886 | htonl(offsetof(struct qla2xxx_fw_dump, isp)); | 886 | htonl(offsetof(struct qla2xxx_fw_dump, isp)); |
887 | } | 887 | } |
888 | 888 | ||
889 | static int | ||
890 | qla81xx_mpi_sync(scsi_qla_host_t *vha) | ||
891 | { | ||
892 | #define MPS_MASK 0xe0 | ||
893 | int rval; | ||
894 | uint16_t dc; | ||
895 | uint32_t dw; | ||
896 | struct qla_hw_data *ha = vha->hw; | ||
897 | |||
898 | if (!IS_QLA81XX(vha->hw)) | ||
899 | return QLA_SUCCESS; | ||
900 | |||
901 | rval = qla2x00_write_ram_word(vha, 0x7c00, 1); | ||
902 | if (rval != QLA_SUCCESS) { | ||
903 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
904 | "Sync-MPI: Unable to acquire semaphore.\n")); | ||
905 | goto done; | ||
906 | } | ||
907 | |||
908 | pci_read_config_word(vha->hw->pdev, 0x54, &dc); | ||
909 | rval = qla2x00_read_ram_word(vha, 0x7a15, &dw); | ||
910 | if (rval != QLA_SUCCESS) { | ||
911 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
912 | "Sync-MPI: Unable to read sync.\n")); | ||
913 | goto done_release; | ||
914 | } | ||
915 | |||
916 | dc &= MPS_MASK; | ||
917 | if (dc == (dw & MPS_MASK)) | ||
918 | goto done_release; | ||
919 | |||
920 | dw &= ~MPS_MASK; | ||
921 | dw |= dc; | ||
922 | rval = qla2x00_write_ram_word(vha, 0x7a15, dw); | ||
923 | if (rval != QLA_SUCCESS) { | ||
924 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
925 | "Sync-MPI: Unable to gain sync.\n")); | ||
926 | } | ||
927 | |||
928 | done_release: | ||
929 | rval = qla2x00_write_ram_word(vha, 0x7c00, 0); | ||
930 | if (rval != QLA_SUCCESS) { | ||
931 | DEBUG2(qla_printk(KERN_WARNING, ha, | ||
932 | "Sync-MPI: Unable to release semaphore.\n")); | ||
933 | } | ||
934 | |||
935 | done: | ||
936 | return rval; | ||
937 | } | ||
938 | |||
889 | /** | 939 | /** |
890 | * qla2x00_setup_chip() - Load and start RISC firmware. | 940 | * qla2x00_setup_chip() - Load and start RISC firmware. |
891 | * @ha: HA context | 941 | * @ha: HA context |
@@ -910,6 +960,8 @@ qla2x00_setup_chip(scsi_qla_host_t *vha) | |||
910 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 960 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
911 | } | 961 | } |
912 | 962 | ||
963 | qla81xx_mpi_sync(vha); | ||
964 | |||
913 | /* Load firmware sequences */ | 965 | /* Load firmware sequences */ |
914 | rval = ha->isp_ops->load_risc(vha, &srisc_address); | 966 | rval = ha->isp_ops->load_risc(vha, &srisc_address); |
915 | if (rval == QLA_SUCCESS) { | 967 | if (rval == QLA_SUCCESS) { |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index f21557845d6f..451ece0760b0 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -3545,3 +3545,66 @@ qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma, | |||
3545 | 3545 | ||
3546 | return rval; | 3546 | return rval; |
3547 | } | 3547 | } |
3548 | |||
3549 | int | ||
3550 | qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data) | ||
3551 | { | ||
3552 | int rval; | ||
3553 | mbx_cmd_t mc; | ||
3554 | mbx_cmd_t *mcp = &mc; | ||
3555 | |||
3556 | if (!IS_FWI2_CAPABLE(vha->hw)) | ||
3557 | return QLA_FUNCTION_FAILED; | ||
3558 | |||
3559 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | ||
3560 | |||
3561 | mcp->mb[0] = MBC_READ_RAM_EXTENDED; | ||
3562 | mcp->mb[1] = LSW(risc_addr); | ||
3563 | mcp->mb[8] = MSW(risc_addr); | ||
3564 | mcp->out_mb = MBX_8|MBX_1|MBX_0; | ||
3565 | mcp->in_mb = MBX_3|MBX_2|MBX_0; | ||
3566 | mcp->tov = 30; | ||
3567 | mcp->flags = 0; | ||
3568 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3569 | if (rval != QLA_SUCCESS) { | ||
3570 | DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, | ||
3571 | vha->host_no, rval, mcp->mb[0])); | ||
3572 | } else { | ||
3573 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | ||
3574 | *data = mcp->mb[3] << 16 | mcp->mb[2]; | ||
3575 | } | ||
3576 | |||
3577 | return rval; | ||
3578 | } | ||
3579 | |||
3580 | int | ||
3581 | qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) | ||
3582 | { | ||
3583 | int rval; | ||
3584 | mbx_cmd_t mc; | ||
3585 | mbx_cmd_t *mcp = &mc; | ||
3586 | |||
3587 | if (!IS_FWI2_CAPABLE(vha->hw)) | ||
3588 | return QLA_FUNCTION_FAILED; | ||
3589 | |||
3590 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | ||
3591 | |||
3592 | mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED; | ||
3593 | mcp->mb[1] = LSW(risc_addr); | ||
3594 | mcp->mb[2] = LSW(data); | ||
3595 | mcp->mb[3] = MSW(data); | ||
3596 | mcp->mb[8] = MSW(risc_addr); | ||
3597 | mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0; | ||
3598 | mcp->in_mb = MBX_0; | ||
3599 | mcp->tov = 30; | ||
3600 | mcp->flags = 0; | ||
3601 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3602 | if (rval != QLA_SUCCESS) { | ||
3603 | DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, | ||
3604 | vha->host_no, rval, mcp->mb[0])); | ||
3605 | } else { | ||
3606 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | ||
3607 | } | ||
3608 | |||
3609 | return rval; | ||
3610 | } | ||