scsi: qla1280: Fix dma firmware download, if dma address is 64bit
authorThomas Bogendoerfer <tbogendoerfer@suse.de>
Tue, 14 Jan 2020 16:09:36 +0000 (17:09 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 16 Jan 2020 04:09:11 +0000 (23:09 -0500)
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>
drivers/scsi/qla1280.c
drivers/scsi/qla1280.h

index 832af42130467a5d9eb67a42b7c1a5eaae938274..607cbddcdd140834a1eda558ab2ad67eed40185c 100644 (file)
@@ -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");
index a1a8aefc7cc39f499618ce20ef111198119c31b5..e7820b5bca38c82feb492ba4986927f2fbd7abf6 100644 (file)
@@ -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 */