From patchwork Fri Feb 16 17:28:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Smart X-Patchwork-Id: 10225201 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 11B12602CB for ; Fri, 16 Feb 2018 17:32:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 015BB290D8 for ; Fri, 16 Feb 2018 17:32:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E9EB329116; Fri, 16 Feb 2018 17:32:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 301D029155 for ; Fri, 16 Feb 2018 17:32:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1162009AbeBPRc3 (ORCPT ); Fri, 16 Feb 2018 12:32:29 -0500 Received: from mail-pl0-f67.google.com ([209.85.160.67]:43807 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1161052AbeBPRc2 (ORCPT ); Fri, 16 Feb 2018 12:32:28 -0500 Received: by mail-pl0-f67.google.com with SMTP id f4so2024215plr.10 for ; Fri, 16 Feb 2018 09:32:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6QGhLEmBz1PeTGxUsQ+QbBRaeGRD+OOPlBXyhoOUzE8=; b=LJ4Amkr00g9Otsqd5DGfCAPHjkmaZRQc70kbmZdsTb/2viLWnufG7752BkA7vC7lUL DmHL6FKNvIqogHSiv+4GXlDLCyQ1al/2VSHZCNZcQylKbnXnGLIl5Ch5rvhnrNLnisxI Hkb6WtIsklXczwr4y7ZcfRhNf7JPtEeLgGW4YoILB4DVnNSknsGfF3tAT0Pw4rFqROb/ 63TI6ikodttZP3DgMFbuKm+noR7Qm7ZAmQww/aS0kIruR3oCKtgkoVwaT6nVnE+pP8J4 wYpHNT+j7ngdOX0H9cMAy32LrrVlizPsorjTA0NYubzAnZXN9L4AShbd+s03OT/dXMUa Z2JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6QGhLEmBz1PeTGxUsQ+QbBRaeGRD+OOPlBXyhoOUzE8=; b=LEtmLwHskFZSQrSh4Ar9KkTZ9FyMTlpnSPxidbSWCspjWLtPlIbRU2PD+dHlNkMftc x0/lAsYsXSTICrl2lmgkb5sjF+qHR6tqWS2xGYsqIRKczW4GmXzAd7j5eFWwxw7Psiol vSUMYPIPSKzQN6tnEGRHplTtRdSoTUz4CT7sRFnceXaTFgAUBLCBgn2tExyPEgxhATSV iFejXaQPjspxH/uAw+NYzNm5xMqK+0yzCi5r5+k2qHRMFUy/GU/w0ESkfSu0LYNVRl3x aspzTiHQO29mQdsye3rPDwsCN59TnBV0+Z+JJLCtp38s5krr9HqyoUa3RWxUtozGaoR0 yokg== X-Gm-Message-State: APf1xPAqPRGogrMIFNVQtlPHfuBzR0sTmrYKYtCrYevJShxp7E9D22CO lsESGNpdYqjNf1ZMz3a3IOcnYM0x X-Google-Smtp-Source: AH8x226YXWnR1ZazV4TdBnUwju6uBMjQCUujURP0o9jTvxooL0ON213Nk9n/85h28odi+ZOB46PqEw== X-Received: by 2002:a17:902:6b0b:: with SMTP id o11-v6mr6481287plk.109.1518802347859; Fri, 16 Feb 2018 09:32:27 -0800 (PST) Received: from localhost.localdomain (mobile-166-171-123-14.mycingular.net. [166.171.123.14]) by smtp.gmail.com with ESMTPSA id y16sm31958293pfl.79.2018.02.16.09.32.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 16 Feb 2018 09:32:27 -0800 (PST) From: James Smart To: linux-scsi@vger.kernel.org Cc: James Smart , Dick Kennedy , James Smart Subject: [PATCH v4 08/13] lpfc: Enable fw download on if_type=6 devices Date: Fri, 16 Feb 2018 09:28:22 -0800 Message-Id: <20180216172827.3739-9-jsmart2021@gmail.com> X-Mailer: git-send-email 2.13.1 In-Reply-To: <20180216172827.3739-1-jsmart2021@gmail.com> References: <20180216172827.3739-1-jsmart2021@gmail.com> Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Current code is very explicit in what it allows to be downloaded. The driver checking prevented G7 firmware download. The driver checking is unnecessary as the device will validate what it receives. Revise the firmware download interface checking. Added a little debug support in case there is still a failure. Signed-off-by: Dick Kennedy Signed-off-by: James Smart Reviewed-by: Johannes Thumshirn --- drivers/scsi/lpfc/lpfc_hw4.h | 5 +---- drivers/scsi/lpfc/lpfc_init.c | 44 ++++++++++++++++++++++++++++++------------- drivers/scsi/lpfc/lpfc_sli.c | 1 + 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index dba724e1f5ee..be8227dfa086 100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h @@ -2241,6 +2241,7 @@ struct lpfc_mbx_redisc_fcf_tbl { * command. */ #define ADD_STATUS_OPERATION_ALREADY_ACTIVE 0x67 +#define ADD_STATUS_FW_NOT_SUPPORTED 0xEB struct lpfc_mbx_sli4_config { struct mbox_header header; @@ -4603,10 +4604,6 @@ union lpfc_wqe128 { struct gen_req64_wqe gen_req; }; -#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 { uint32_t size; uint32_t magic_number; diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 96a37e4e127d..af92c3c681f7 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -11297,6 +11297,27 @@ lpfc_sli4_get_iocb_cnt(struct lpfc_hba *phba) } +static void +lpfc_log_write_firmware_error(struct lpfc_hba *phba, uint32_t offset, + uint32_t magic_number, uint32_t ftype, uint32_t fid, uint32_t fsize, + const struct firmware *fw) +{ + if (offset == ADD_STATUS_FW_NOT_SUPPORTED) + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, + "3030 This firmware version is not supported on " + "this HBA model. Device:%x Magic:%x Type:%x " + "ID:%x Size %d %zd\n", + phba->pcidev->device, magic_number, ftype, fid, + fsize, fw->size); + else + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, + "3022 FW Download failed. Device:%x Magic:%x Type:%x " + "ID:%x Size %d %zd\n", + phba->pcidev->device, magic_number, ftype, fid, + fsize, fw->size); +} + + /** * lpfc_write_firmware - attempt to write a firmware image to the port * @fw: pointer to firmware image returned from request_firmware. @@ -11324,20 +11345,10 @@ lpfc_write_firmware(const struct firmware *fw, void *context) 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), + fid = bf_get_be32(lpfc_grp_hdr_id, image); fsize = be32_to_cpu(image->size); INIT_LIST_HEAD(&dma_buffer_list); - 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 Size %d %zd\n", - magic_number, ftype, fid, fsize, fw->size); - rc = -EINVAL; - goto release_out; - } lpfc_decode_firmware_rev(phba, fwrev, 1); if (strncmp(fwrev, image->revision, strnlen(image->revision, 16))) { lpfc_printf_log(phba, KERN_ERR, LOG_INIT, @@ -11378,11 +11389,18 @@ lpfc_write_firmware(const struct firmware *fw, void *context) } rc = lpfc_wr_object(phba, &dma_buffer_list, (fw->size - offset), &offset); - if (rc) + if (rc) { + lpfc_log_write_firmware_error(phba, offset, + magic_number, ftype, fid, fsize, fw); goto release_out; + } } rc = offset; - } + } else + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, + "3029 Skipped Firmware update, Current " + "Version:%s New Version:%s\n", + fwrev, image->revision); release_out: list_for_each_entry_safe(dmabuf, next, &dma_buffer_list, list) { diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 6735959f21cf..dc5208021603 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -18876,6 +18876,7 @@ lpfc_wr_object(struct lpfc_hba *phba, struct list_head *dmabuf_list, "status x%x add_status x%x, mbx status x%x\n", shdr_status, shdr_add_status, rc); rc = -ENXIO; + *offset = shdr_add_status; } else *offset += wr_object->u.response.actual_write_length; return rc;