aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_init.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c33
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
3808static int 3808static int
3809qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr) 3809qla24xx_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
4130int 4130int
4131qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr) 4131qla81xx_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); 4149try_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
4150void 4167void