diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_init.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index a7abc1035481..34e6508bbab0 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -3806,11 +3806,11 @@ qla24xx_nvram_config(scsi_qla_host_t *vha) | |||
3806 | } | 3806 | } |
3807 | 3807 | ||
3808 | static int | 3808 | static int |
3809 | qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr) | 3809 | qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, |
3810 | uint32_t faddr) | ||
3810 | { | 3811 | { |
3811 | int rval = QLA_SUCCESS; | 3812 | int rval = QLA_SUCCESS; |
3812 | int segments, fragment; | 3813 | int segments, fragment; |
3813 | uint32_t faddr; | ||
3814 | uint32_t *dcode, dlen; | 3814 | uint32_t *dcode, dlen; |
3815 | uint32_t risc_addr; | 3815 | uint32_t risc_addr; |
3816 | uint32_t risc_size; | 3816 | uint32_t risc_size; |
@@ -3819,12 +3819,11 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr) | |||
3819 | struct req_que *req = ha->req_q_map[0]; | 3819 | struct req_que *req = ha->req_q_map[0]; |
3820 | 3820 | ||
3821 | qla_printk(KERN_INFO, ha, | 3821 | qla_printk(KERN_INFO, ha, |
3822 | "FW: Loading from flash (%x)...\n", ha->flt_region_fw); | 3822 | "FW: Loading from flash (%x)...\n", faddr); |
3823 | 3823 | ||
3824 | rval = QLA_SUCCESS; | 3824 | rval = QLA_SUCCESS; |
3825 | 3825 | ||
3826 | segments = FA_RISC_CODE_SEGMENTS; | 3826 | segments = FA_RISC_CODE_SEGMENTS; |
3827 | faddr = ha->flt_region_fw; | ||
3828 | dcode = (uint32_t *)req->ring; | 3827 | dcode = (uint32_t *)req->ring; |
3829 | *srisc_addr = 0; | 3828 | *srisc_addr = 0; |
3830 | 3829 | ||
@@ -4124,27 +4123,45 @@ qla24xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) | |||
4124 | if (rval == QLA_SUCCESS) | 4123 | if (rval == QLA_SUCCESS) |
4125 | return rval; | 4124 | return rval; |
4126 | 4125 | ||
4127 | return qla24xx_load_risc_flash(vha, srisc_addr); | 4126 | return qla24xx_load_risc_flash(vha, srisc_addr, |
4127 | vha->hw->flt_region_fw); | ||
4128 | } | 4128 | } |
4129 | 4129 | ||
4130 | int | 4130 | int |
4131 | qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) | 4131 | qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) |
4132 | { | 4132 | { |
4133 | int rval; | 4133 | int rval; |
4134 | struct qla_hw_data *ha = vha->hw; | ||
4134 | 4135 | ||
4135 | if (ql2xfwloadbin == 2) | 4136 | if (ql2xfwloadbin == 2) |
4136 | return qla24xx_load_risc(vha, srisc_addr); | 4137 | goto try_blob_fw; |
4137 | 4138 | ||
4138 | /* | 4139 | /* |
4139 | * FW Load priority: | 4140 | * FW Load priority: |
4140 | * 1) Firmware residing in flash. | 4141 | * 1) Firmware residing in flash. |
4141 | * 2) Firmware via request-firmware interface (.bin file). | 4142 | * 2) Firmware via request-firmware interface (.bin file). |
4143 | * 3) Golden-Firmware residing in flash -- limited operation. | ||
4142 | */ | 4144 | */ |
4143 | rval = qla24xx_load_risc_flash(vha, srisc_addr); | 4145 | rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_fw); |
4144 | if (rval == QLA_SUCCESS) | 4146 | if (rval == QLA_SUCCESS) |
4145 | return rval; | 4147 | return rval; |
4146 | 4148 | ||
4147 | return qla24xx_load_risc_blob(vha, srisc_addr); | 4149 | try_blob_fw: |
4150 | rval = qla24xx_load_risc_blob(vha, srisc_addr); | ||
4151 | if (rval == QLA_SUCCESS || !ha->flt_region_gold_fw) | ||
4152 | return rval; | ||
4153 | |||
4154 | qla_printk(KERN_ERR, ha, | ||
4155 | "FW: Attempting to fallback to golden firmware...\n"); | ||
4156 | rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_gold_fw); | ||
4157 | if (rval != QLA_SUCCESS) | ||
4158 | return rval; | ||
4159 | |||
4160 | qla_printk(KERN_ERR, ha, | ||
4161 | "FW: Please update operational firmware...\n"); | ||
4162 | ha->flags.running_gold_fw = 1; | ||
4163 | |||
4164 | return rval; | ||
4148 | } | 4165 | } |
4149 | 4166 | ||
4150 | void | 4167 | void |