forked from luck/tmp_suning_uos_patched
scsi: qla1280: Fix dma firmware download, if dma address is 64bit
Do firmware download with 64bit LOAD_RAM command, if driver is using 64bit addressing. Link: https://lore.kernel.org/r/20200114160936.1517-1-tbogendoerfer@suse.de Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
f3c893e3db
commit
ba304e5b44
|
@ -1699,6 +1699,16 @@ qla1280_load_firmware_pio(struct scsi_qla_host *ha)
|
|||
return err;
|
||||
}
|
||||
|
||||
#if QLA_64BIT_PTR
|
||||
#define LOAD_CMD MBC_LOAD_RAM_A64_ROM
|
||||
#define DUMP_CMD MBC_DUMP_RAM_A64_ROM
|
||||
#define CMD_ARGS (BIT_7 | BIT_6 | BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0)
|
||||
#else
|
||||
#define LOAD_CMD MBC_LOAD_RAM
|
||||
#define DUMP_CMD MBC_DUMP_RAM
|
||||
#define CMD_ARGS (BIT_4 | BIT_3 | BIT_2 | BIT_1 | BIT_0)
|
||||
#endif
|
||||
|
||||
#define DUMP_IT_BACK 0 /* for debug of RISC loading */
|
||||
static int
|
||||
qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
||||
|
@ -1748,7 +1758,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
|||
for(i = 0; i < cnt; i++)
|
||||
((__le16 *)ha->request_ring)[i] = fw_data[i];
|
||||
|
||||
mb[0] = MBC_LOAD_RAM;
|
||||
mb[0] = LOAD_CMD;
|
||||
mb[1] = risc_address;
|
||||
mb[4] = cnt;
|
||||
mb[3] = ha->request_dma & 0xffff;
|
||||
|
@ -1759,8 +1769,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
|||
__func__, mb[0],
|
||||
(void *)(long)ha->request_dma,
|
||||
mb[6], mb[7], mb[2], mb[3]);
|
||||
err = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | BIT_2 |
|
||||
BIT_1 | BIT_0, mb);
|
||||
err = qla1280_mailbox_command(ha, CMD_ARGS, mb);
|
||||
if (err) {
|
||||
printk(KERN_ERR "scsi(%li): Failed to load partial "
|
||||
"segment of f\n", ha->host_no);
|
||||
|
@ -1768,7 +1777,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
|||
}
|
||||
|
||||
#if DUMP_IT_BACK
|
||||
mb[0] = MBC_DUMP_RAM;
|
||||
mb[0] = DUMP_CMD;
|
||||
mb[1] = risc_address;
|
||||
mb[4] = cnt;
|
||||
mb[3] = p_tbuf & 0xffff;
|
||||
|
@ -1776,8 +1785,7 @@ qla1280_load_firmware_dma(struct scsi_qla_host *ha)
|
|||
mb[7] = upper_32_bits(p_tbuf) & 0xffff;
|
||||
mb[6] = upper_32_bits(p_tbuf) >> 16;
|
||||
|
||||
err = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | BIT_2 |
|
||||
BIT_1 | BIT_0, mb);
|
||||
err = qla1280_mailbox_command(ha, CMD_ARGS, mb);
|
||||
if (err) {
|
||||
printk(KERN_ERR
|
||||
"Failed to dump partial segment of f/w\n");
|
||||
|
|
|
@ -277,6 +277,8 @@ struct device_reg {
|
|||
#define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */
|
||||
#define MBC_VERIFY_CHECKSUM 7 /* Verify checksum */
|
||||
#define MBC_ABOUT_FIRMWARE 8 /* Get firmware revision */
|
||||
#define MBC_LOAD_RAM_A64_ROM 9 /* Load RAM 64bit ROM version */
|
||||
#define MBC_DUMP_RAM_A64_ROM 0x0a /* Dump RAM 64bit ROM version */
|
||||
#define MBC_INIT_REQUEST_QUEUE 0x10 /* Initialize request queue */
|
||||
#define MBC_INIT_RESPONSE_QUEUE 0x11 /* Initialize response queue */
|
||||
#define MBC_EXECUTE_IOCB 0x12 /* Execute IOCB command */
|
||||
|
|
Loading…
Reference in New Issue
Block a user