scsi: lpfc: Fix fw download on SLI-4 FC adapters
authorJames Smart <james.smart@broadcom.com>
Thu, 13 Oct 2016 22:06:17 +0000 (15:06 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 8 Nov 2016 22:29:51 +0000 (17:29 -0500)
Fix fw download on SLI-4 FC adapters

Driver performs a quick validation of magic numbers in the fw
download image. Driver needed to be updated for more recent
magic numbers.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c

index bbdcb5a..5646699 100644 (file)
@@ -3996,7 +3996,8 @@ union lpfc_wqe128 {
        struct gen_req64_wqe gen_req;
 };
 
-#define LPFC_GROUP_OJECT_MAGIC_NUM             0xfeaa0001
+#define LPFC_GROUP_OJECT_MAGIC_G5              0xfeaa0001
+#define LPFC_GROUP_OJECT_MAGIC_G6              0xfeaa0003
 #define LPFC_FILE_TYPE_GROUP                   0xf7
 #define LPFC_FILE_ID_GROUP                     0xa2
 struct lpfc_grp_hdr {
index 53227e5..7be9b8a 100644 (file)
@@ -10312,6 +10312,7 @@ lpfc_write_firmware(const struct firmware *fw, void *context)
        int i, rc = 0;
        struct lpfc_dmabuf *dmabuf, *next;
        uint32_t offset = 0, temp_offset = 0;
+       uint32_t magic_number, ftype, fid, fsize;
 
        /* It can be null in no-wait mode, sanity check */
        if (!fw) {
@@ -10320,18 +10321,19 @@ lpfc_write_firmware(const struct firmware *fw, void *context)
        }
        image = (struct lpfc_grp_hdr *)fw->data;
 
+       magic_number = be32_to_cpu(image->magic_number);
+       ftype = bf_get_be32(lpfc_grp_hdr_file_type, image);
+       fid = bf_get_be32(lpfc_grp_hdr_id, image),
+       fsize = be32_to_cpu(image->size);
+
        INIT_LIST_HEAD(&dma_buffer_list);
-       if ((be32_to_cpu(image->magic_number) != LPFC_GROUP_OJECT_MAGIC_NUM) ||
-           (bf_get_be32(lpfc_grp_hdr_file_type, image) !=
-            LPFC_FILE_TYPE_GROUP) ||
-           (bf_get_be32(lpfc_grp_hdr_id, image) != LPFC_FILE_ID_GROUP) ||
-           (be32_to_cpu(image->size) != fw->size)) {
+       if ((magic_number != LPFC_GROUP_OJECT_MAGIC_G5 &&
+            magic_number != LPFC_GROUP_OJECT_MAGIC_G6) ||
+           ftype != LPFC_FILE_TYPE_GROUP || fsize != fw->size) {
                lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
                                "3022 Invalid FW image found. "
-                               "Magic:%x Type:%x ID:%x\n",
-                               be32_to_cpu(image->magic_number),
-                               bf_get_be32(lpfc_grp_hdr_file_type, image),
-                               bf_get_be32(lpfc_grp_hdr_id, image));
+                               "Magic:%x Type:%x ID:%x Size %d %ld\n",
+                               magic_number, ftype, fid, fsize, fw->size);
                rc = -EINVAL;
                goto release_out;
        }