Commit 6b6ef5db authored by James Smart's avatar James Smart Committed by Martin K. Petersen

scsi: lpfc: Fix fw download on SLI-4 FC adapters

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: default avatarDick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent c691816e
...@@ -3996,7 +3996,8 @@ union lpfc_wqe128 { ...@@ -3996,7 +3996,8 @@ union lpfc_wqe128 {
struct gen_req64_wqe gen_req; 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_TYPE_GROUP 0xf7
#define LPFC_FILE_ID_GROUP 0xa2 #define LPFC_FILE_ID_GROUP 0xa2
struct lpfc_grp_hdr { struct lpfc_grp_hdr {
......
...@@ -10312,6 +10312,7 @@ lpfc_write_firmware(const struct firmware *fw, void *context) ...@@ -10312,6 +10312,7 @@ lpfc_write_firmware(const struct firmware *fw, void *context)
int i, rc = 0; int i, rc = 0;
struct lpfc_dmabuf *dmabuf, *next; struct lpfc_dmabuf *dmabuf, *next;
uint32_t offset = 0, temp_offset = 0; uint32_t offset = 0, temp_offset = 0;
uint32_t magic_number, ftype, fid, fsize;
/* It can be null in no-wait mode, sanity check */ /* It can be null in no-wait mode, sanity check */
if (!fw) { if (!fw) {
...@@ -10320,18 +10321,19 @@ lpfc_write_firmware(const struct firmware *fw, void *context) ...@@ -10320,18 +10321,19 @@ lpfc_write_firmware(const struct firmware *fw, void *context)
} }
image = (struct lpfc_grp_hdr *)fw->data; 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); INIT_LIST_HEAD(&dma_buffer_list);
if ((be32_to_cpu(image->magic_number) != LPFC_GROUP_OJECT_MAGIC_NUM) || if ((magic_number != LPFC_GROUP_OJECT_MAGIC_G5 &&
(bf_get_be32(lpfc_grp_hdr_file_type, image) != magic_number != LPFC_GROUP_OJECT_MAGIC_G6) ||
LPFC_FILE_TYPE_GROUP) || ftype != LPFC_FILE_TYPE_GROUP || fsize != fw->size) {
(bf_get_be32(lpfc_grp_hdr_id, image) != LPFC_FILE_ID_GROUP) ||
(be32_to_cpu(image->size) != fw->size)) {
lpfc_printf_log(phba, KERN_ERR, LOG_INIT, lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
"3022 Invalid FW image found. " "3022 Invalid FW image found. "
"Magic:%x Type:%x ID:%x\n", "Magic:%x Type:%x ID:%x Size %d %ld\n",
be32_to_cpu(image->magic_number), magic_number, ftype, fid, fsize, fw->size);
bf_get_be32(lpfc_grp_hdr_file_type, image),
bf_get_be32(lpfc_grp_hdr_id, image));
rc = -EINVAL; rc = -EINVAL;
goto release_out; goto release_out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment