Commit ba304e5b authored by Thomas Bogendoerfer's avatar Thomas Bogendoerfer Committed by Martin K. Petersen
Browse files

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: default avatarThomas Bogendoerfer <tbogendoerfer@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent f3c893e3
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -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");
+2 −0
Original line number Diff line number Diff line
@@ -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 */