From patchwork Tue Sep 4 21:19:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 10587983 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0542414E0 for ; Tue, 4 Sep 2018 21:19:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E739028F76 for ; Tue, 4 Sep 2018 21:19:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DB5732A128; Tue, 4 Sep 2018 21:19:37 +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.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,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 C6FAB28F76 for ; Tue, 4 Sep 2018 21:19:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727381AbeIEBqa (ORCPT ); Tue, 4 Sep 2018 21:46:30 -0400 Received: from mail-sn1nam01on0066.outbound.protection.outlook.com ([104.47.32.66]:6378 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727195AbeIEBqa (ORCPT ); Tue, 4 Sep 2018 21:46:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=aJbXm4SiFwNERU8t3piaOWO9qW/qLAw5lx9Gt5EuegU=; b=V78wRX0IepnmghRDeth6O89xkkqS51n9BfKi7oj04Snv6rqoehHmsudUpga+EvzZaBcB9yHkqcQONTVHDKNFfh1ycKyLPDxDJ+ncjWcm6yKYZ4bz9VdJ53QGrtwuVkyAGacUJ5gqxQGhp/tMhwtm2UJxEaUFkB6xigFKjQLDsCc= Received: from DM5PR07CA0084.namprd07.prod.outlook.com (2603:10b6:4:ad::49) by BYAPR07MB4392.namprd07.prod.outlook.com (2603:10b6:a02:c0::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1080.15; Tue, 4 Sep 2018 21:19:28 +0000 Received: from CO1NAM05FT049.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e50::200) by DM5PR07CA0084.outlook.office365.com (2603:10b6:4:ad::49) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1101.17 via Frontend Transport; Tue, 4 Sep 2018 21:19:27 +0000 Authentication-Results: spf=pass (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=cavium.com; Received-SPF: Pass (protection.outlook.com: domain of cavium.com designates 50.232.66.26 as permitted sender) receiver=protection.outlook.com; client-ip=50.232.66.26; helo=CAEXCH02.caveonetworks.com; Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by CO1NAM05FT049.mail.protection.outlook.com (10.152.96.164) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.20.1143.1 via Frontend Transport; Tue, 4 Sep 2018 21:19:27 +0000 Received: from dut1171.mv.qlogic.com (172.29.51.171) by CAEXCH02.caveonetworks.com (10.17.4.29) with Microsoft SMTP Server id 14.2.347.0; Tue, 4 Sep 2018 14:19:19 -0700 Received: from dut1171.mv.qlogic.com (localhost [127.0.0.1]) by dut1171.mv.qlogic.com (8.14.7/8.14.7) with ESMTP id w84LJLa3031966; Tue, 4 Sep 2018 14:19:21 -0700 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id w84LJLko031965; Tue, 4 Sep 2018 14:19:21 -0700 From: Himanshu Madhani To: , CC: , Subject: [PATCH 01/13] qla2xxx: Serialize mailbox request Date: Tue, 4 Sep 2018 14:19:09 -0700 Message-ID: <20180904211921.31927-2-himanshu.madhani@cavium.com> X-Mailer: git-send-email 2.12.0 In-Reply-To: <20180904211921.31927-1-himanshu.madhani@cavium.com> References: <20180904211921.31927-1-himanshu.madhani@cavium.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(346002)(376002)(39850400004)(396003)(136003)(2980300002)(438002)(189003)(199004)(316002)(42186006)(336012)(2906002)(76176011)(110136005)(51416003)(54906003)(72206003)(87636003)(478600001)(8936002)(16586007)(126002)(50226002)(26005)(69596002)(446003)(2616005)(486006)(1076002)(11346002)(5660300001)(186003)(44832011)(6666003)(14444005)(476003)(80596001)(15650500001)(47776003)(81156014)(81166006)(575784001)(86362001)(50466002)(4326008)(48376002)(36756003)(106002)(106466001)(356003)(305945005)(8676002);DIR:OUT;SFP:1101;SCL:1;SRVR:BYAPR07MB4392;H:CAEXCH02.caveonetworks.com;FPR:;SPF:Pass;LANG:en;PTR:50-232-66-26-static.hfc.comcastbusiness.net;MX:1;A:1; X-Microsoft-Exchange-Diagnostics: 1;CO1NAM05FT049;1:ssEZAOwmyhnoRnCTj3XNaDEunRzla7Ec348HxbFHKBlgZydCvu2Q0e7rLEDP+muj+NJTl4rJnW24OqWHXTcWbSzs7ksnn1h4SSyhMPlAKr7L2hAy7lL24wPZMyKjPEjz X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 68354b6c-8b5e-4948-16af-08d612ac18b6 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:BYAPR07MB4392; X-Microsoft-Exchange-Diagnostics: 1;BYAPR07MB4392;3:4sN2dMX1pwlqAgM3GsaiKuhe4DY7v5robHhGVHTyny0s9K78ipoeDMWuTY662nxzH9Btn9t91OT2ndK3yhjgdI7PoTZrWoK2NaP2iP/59m110ujZCPgv8TaGRDOdpLPmjhY/r3u/sPBARbP8doXFhRfOPUd6D/Hx2ee7w+nAicE1LM4QaKaOpj1Oqywcn4YcLGmrQgCv1nUD3Opb1RVl13c3h75pE0bLasAaaXYwLFjKHBF9qp8jGxiMDevA2gFjtELcs/dLHx567d/C54wRjsBVcs6rLxHdd9KIaDYF3x3YcU6xKBQt5b4afS287wHJuTeua2TVXvJntBUqnpvPaO2t1IVz5ZA1CF3RiUPauro=;25:KOj9SRr9p9VKwQeY+O0wDMC62jC/lZ1ujnyxD00AbuaU1fp4XEfYl8e1QHAgbAVMdkqoSir/1ku1Z1G7Pbb2U5Atmv28aBYzxSy1ss/kDAB2c78dCy21QPuXamX94Ox3mhnHLbfbOMIyzB0fkToipjtaggHzmptQo8aKH8NM+D+vbJ7LUuHyFYvoPZe0+8ZCFFKz+C8WmoJ0lZv/iJyfK1ttIIEujVRRaziF60vS0PU/Q/mMgf1cptsV8k3Eq5Kx9HHHWXw/IcpiVZinKVw0dONUmmy8P1Yhgbt+CumGCMSAWBb8NJcTa4exFKx0v2OZAf9HXIFr/SW8UCS6VDnC9g== X-MS-TrafficTypeDiagnostic: BYAPR07MB4392: X-Microsoft-Exchange-Diagnostics: 1;BYAPR07MB4392;31:FDn6JiY7pzZrI9IRc0V8xjtxiyH0NKAVKAXYd81ssWcT7pXgw3Hypdh/DHPYOpas9SN+6SuoQmtse2AIJ4L93c4iRtPryiv8qZ1B+Oam6GNWJIxiK6jYRpIs8BtsKJG14ukvORHAXZrdVnT0rPfSoLZMuHXRgYbIsUISWsUNsfSCWquSRMDAR+IA5pnduY9aDZD6e8b/zGlf6p+J7V4HEcEy6FNZbsnFr3TjurVl8xY=;20:jyKo7UdSk+22OgUpnAOrMRTBTsV77ewR+WZxnNcXUd+/Od8wDQ2hi8GMIaesHm8LEtNxXAiYLjqiBMoMURjCrqLJVM2uN3aWnzxDI17COA/o9s0NicVm4UDdGfTxsFO6nVsLe+qBdZqL/5GbwDZJHf1Eahr7uJbujJODwOskZb/2bxQmHSkBes9+ytxhSce0IWnvow5rjm8T9MsNlfhhDHhT/YkADX2Zi0K0d+Szsk1kN2ZkakD51Bx5COs2lZyKGMCJOxIFdsSNNIdLOTvPcbfq63Vv/LWwMyE0BFb5sLzrQwjuTwJlIUOIf/0XBDGTympOc4N1+1C0tQs6CfT9vTGvlMHMMLXZm6o/3Vkf5RE6kfMFOMdGPvtHNXwU7olSuC2+ApbdtxRIX4OVAx2DtWoKD1A4bGilIO/2KdRaRhOh2SPGiVGFPN+eFmTNHzkmfxp0AuI7IYImM64ORfnZ/5O8gxKTG0ZNz4oeH9km+o/NahOOwvEMJiZTMgtk2Q8u X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(3231311)(944501410)(52105095)(93006095)(93004095)(149027)(150027)(6041310)(20161123564045)(20161123558120)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699016);SRVR:BYAPR07MB4392;BCL:0;PCL:0;RULEID:;SRVR:BYAPR07MB4392; X-Microsoft-Exchange-Diagnostics: 1;BYAPR07MB4392;4:0E2WVU6ydVlgQPkzv/gLNjCZsSwQHXztwniHHO0x5jMZIaKNlq1PDw+k4g18IRsl+hFOqYkisXc5ENpAR1JtBLqvUUmDLITz/EOdJPiPPQuvpLQoOZNO8m3WIV72jZ0Iv/ZnO1AK6lRMypgle1K8XV0qHmokQaYBrwwE3BqQlqyOyHzQQW/s75hqE+qv4p0EiRc8ZFTk6c1N+MDW83T5icEEdFRUJy2HlLGqvXowqE+WVv7+es4WNXTCvHp6PfgWeWxtiI6QKt4HZhvlnxHm3A== X-Forefront-PRVS: 0785459C39 X-Microsoft-Exchange-Diagnostics: 1;BYAPR07MB4392;23:dn9eKqlnoxsG35yCTCTzFoWLoibR1NydlzilfLCD0isB4tjcLh6fjOJQG5OlcdSqDVJUUveO0dz4LGsz76hQpM6L4ao/HpjZOddK2C/HVxRW0HVoRHrbqH2lubwfm5zqhEtivNvnoclXo7KdcJXCk5/r6Spt6aOu77oTaFNZHuBX6wSf9zDTQdJ/R7hodlVmCEgfgqR/3dQrybces8sF/bJaTxjTYUfmgHRzVfvIUS2M4nEWwaFSNfT/Ow9ocMcqnS+zjdFSUOIdUox2eoe0U3HXYM7pFq5mjVxSFAHhUcD0QtPlBfXmXyDRyVPOd9N5s5WGmDd8eT6SF/GKSoCTD5kwopNmjsjFmFeK54WZaLb5vMl5iYylkHSbhLGwp+e0ZiHCm0CIp5krIsM7OYhvRnzJmj3D68BjhpKGO/8HLLa9whkIsDpZtYJpq3y3XzkW0CZ1O2ZQxYXxAnt1KUDUrrf897q7dSyjcSxs/S2AfAEEyZThST5MruFiDsiBbV/YMUjcTI3BEEllg6qU6JC9Qf/Als0xSY6h/tO5YuBRFHfJbfqp1U80Xzt970t1+Oi+CX0UXxUabViEBmwLdxg8+hjI3DXMq2PMWZh6q5GPx3MyXTv7fEx2F6+ojcVTqOrX2opwW6dJQeW0NKOPFCxlilx5wzocxduJnTsntvwVKKgQrsJNuF9LVA7YZ0pBhGJu9SU/ljPdOnol7exxFoZRDoFOk2IT7QjDDl7UOWhrqz6jyhGcn4P8OYQQKmQ4ye6giWtbED1BxQyEVxRA2zJb0ywALxQiDRTSF/XdwEXZdHqEhFHR4eO76b2msi+eMJtgUejkkhwfpkxLYMKzDioWRfL2xH7jSvac/vyHcjRb255IwoWLD5+Bt8G/QrXMn+EefF9ini7KpbZ4S0gcLatD3/ERFpEK2W/jeQcDSiAgOXm4oDHh2yWDhj0/LwbuIIcM2MpoHCa6YW5tnoOfVkD4usJRkabpLAZRk4GLFBmopIV6X5/TR6CvwC5IGUKYj5mrDmrk4r2OO46cspWTocax4lgmN2mRI99sG4/ZAeOJItFrG7YWo8lLne42tmqE/ILU2uccWZpMVJ7Fnwi4CqWwa5Rg5NZfJ5LT29RdAaG+OE05IC2ddeL2nDkEBnaKHb4HOomer3KIpeREJbHqRtsRknFyBZkvBZeGjNH8azfQNZ0= X-Microsoft-Antispam-Message-Info: f56qXI7CNH5uE0ay+oi7XgPgPe9fMgbmFEyhQKgFo1+8mInBNyE4m/dDdI0HutBzIOjoGe4/yooBgIXhBPOj462JjqzeB5cKfJO6bmM5o5Z+kwHa3u45oiPscWMay+wvakGxRNo9vDuF+cw0RuLzo8rOxQQAPw0wA1ePEBypf1UuF6+FvOKMX0+KuzLqNHk+mWM6jEGtZvWeYe1IiXqikTSo8djBy3Gmff1ML+CPH9nxITCl72Zskhb9xukb6w6GAvx3GrSYcjjV+apgMj8AX8rWnW7raROsqm6Woi17d3o1zujSlti69GFN4yETj/+qSx+9fHpb1hRYD8WOWJOgDnBXEMl3a/arAsxH02B4pto= X-Microsoft-Exchange-Diagnostics: 1;BYAPR07MB4392;6:bmhAP97iGWdpUDkaUJzYz7XNe/DSVkaNb/uWt48de5T9IZNxmeoAYymr++FCGm/BtkyveGjmb5J9E7heCZiqNJlOJ1cgdio7OuqgAx58A63t3yZXYy+aKdNU8MYLTxqzrEOjReJVtP9sPId72BaNbPOlpg7+OyDhKSXeXT6sZCNABTgS0T7fO0FZju1qcaE6v+KbPRqAQhXeiC4Nu0X+DGvUVnqt6FWK2oLtflODMjoDnsjwWSvstZJKHbO32ccjWRSimZ8fGDbb/BLetSYsCXlr8YBq2HKrpexwpiagKxxkBAHIJzUT+8HAt+WOuWG3hjeVHwjMgxOJL5S4YoMhcjNGzHVQe/s/KO5KaSIbJGvldt7cjzzKfvP2GQU1JQC9CKotoFBuNXnrSKz7UXeG4S6UA8h/r6QqNHPu34WcxHezVzksP3wud35KDXvqnfndFR2pPhE1Ep0uGMnhu5F4Aw==;5:0kD8SBKYwIK9ExeOqQ8MTsspVUoe6Gco8lK3UO8IJzaRO3zTW1wYSQkskpM/DOS1uKCCg6eGW5ue3VNbqV3odDUFV8DVpddt/h7rJ97jZ4ouJjeU0COVwB3AvuNw0ZdZvTPfvJqtP9wD3HAnVnKJXg9UEkl5oeoiivLCczXOq3c=;7:MG/HZ8tgwkgJA3VYHwR9jNOJKVJDTsYizRC5ysrgJGKBBVRukkYj18zW7a9Xn584gKPDdOPCaTm1W58RlF1pbBv09bNVBhF2ebg0cwT+JwNe0P6b6iILue/hamdNz/VliJD83XokTABVq8BUEeWya0DuVRfqlIqWlW5Yhu/s9AyOy/U3dRTOLQV+m/AnJ+zQZKZ8GdX5TbzQ7viSJ/WTgi4k+LVjClk+ZFKStWo1F3Z84rmmF9kviOwSsOoj9P5n SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2018 21:19:27.5265 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 68354b6c-8b5e-4948-16af-08d612ac18b6 X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=711e4ccf-2e9b-4bcf-a551-4094005b6194;Ip=[50.232.66.26];Helo=[CAEXCH02.caveonetworks.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR07MB4392 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 From: Quinn Tran For driver MBX submission, use mbox_busy to serialize request. For Userspace MBX submission, use optrom mutext to serialize request. Signed-off-by: Quinn Tran Signed-off-by: Himanshu Madhani --- drivers/scsi/qla2xxx/qla_attr.c | 106 +++++++++++++++++++++++++++++++------- drivers/scsi/qla2xxx/qla_mbx.c | 36 ++++++++++--- drivers/scsi/qla2xxx/qla_target.c | 25 ++++----- 3 files changed, 127 insertions(+), 40 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 4888b999e82f..14c496bab280 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -158,9 +158,17 @@ qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj, if (!capable(CAP_SYS_ADMIN)) return 0; + mutex_lock(&ha->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&ha->optrom_mutex); + return -EAGAIN; + } + if (IS_NOCACHE_VPD_TYPE(ha)) ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2, ha->nvram_size); + mutex_unlock(&ha->optrom_mutex); + return memory_read_from_buffer(buf, count, &off, ha->nvram, ha->nvram_size); } @@ -208,10 +216,17 @@ qla2x00_sysfs_write_nvram(struct file *filp, struct kobject *kobj, return -EAGAIN; } + mutex_lock(&ha->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); + return -EAGAIN; + } + /* Write NVRAM. */ ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->nvram_base, count); ha->isp_ops->read_nvram(vha, (uint8_t *)ha->nvram, ha->nvram_base, - count); + count); + mutex_unlock(&ha->optrom_mutex); ql_dbg(ql_dbg_user, vha, 0x7060, "Setting ISP_ABORT_NEEDED\n"); @@ -322,6 +337,10 @@ qla2x00_sysfs_write_optrom_ctl(struct file *filp, struct kobject *kobj, size = ha->optrom_size - start; mutex_lock(&ha->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&ha->optrom_mutex); + return -EAGAIN; + } switch (val) { case 0: if (ha->optrom_state != QLA_SREADING && @@ -499,8 +518,14 @@ qla2x00_sysfs_read_vpd(struct file *filp, struct kobject *kobj, qla27xx_find_valid_image(vha) == QLA27XX_SECONDARY_IMAGE) faddr = ha->flt_region_vpd_sec << 2; + mutex_lock(&ha->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&ha->optrom_mutex); + return -EAGAIN; + } ha->isp_ops->read_optrom(vha, ha->vpd, faddr, ha->vpd_size); + mutex_unlock(&ha->optrom_mutex); } return memory_read_from_buffer(buf, count, &off, ha->vpd, ha->vpd_size); } @@ -518,9 +543,6 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj, if (unlikely(pci_channel_offline(ha->pdev))) return 0; - if (qla2x00_chip_is_down(vha)) - return 0; - if (!capable(CAP_SYS_ADMIN) || off != 0 || count != ha->vpd_size || !ha->isp_ops->write_nvram) return 0; @@ -531,16 +553,25 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj, return -EAGAIN; } + mutex_lock(&ha->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&ha->optrom_mutex); + return -EAGAIN; + } + /* Write NVRAM. */ ha->isp_ops->write_nvram(vha, (uint8_t *)buf, ha->vpd_base, count); ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd, ha->vpd_base, count); /* Update flash version information for 4Gb & above. */ - if (!IS_FWI2_CAPABLE(ha)) + if (!IS_FWI2_CAPABLE(ha)) { + mutex_unlock(&ha->optrom_mutex); return -EINVAL; + } tmp_data = vmalloc(256); if (!tmp_data) { + mutex_unlock(&ha->optrom_mutex); ql_log(ql_log_warn, vha, 0x706b, "Unable to allocate memory for VPD information update.\n"); return -ENOMEM; @@ -548,6 +579,8 @@ qla2x00_sysfs_write_vpd(struct file *filp, struct kobject *kobj, ha->isp_ops->get_flash_version(vha, tmp_data); vfree(tmp_data); + mutex_unlock(&ha->optrom_mutex); + return count; } @@ -573,10 +606,15 @@ qla2x00_sysfs_read_sfp(struct file *filp, struct kobject *kobj, if (!capable(CAP_SYS_ADMIN) || off != 0 || count < SFP_DEV_SIZE) return 0; - if (qla2x00_chip_is_down(vha)) + mutex_lock(&vha->hw->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); return 0; + } rval = qla2x00_read_sfp_dev(vha, buf, count); + mutex_unlock(&vha->hw->optrom_mutex); + if (rval) return -EIO; @@ -785,9 +823,11 @@ qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, if (unlikely(pci_channel_offline(ha->pdev))) return 0; - - if (qla2x00_chip_is_down(vha)) + mutex_lock(&vha->hw->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); return 0; + } if (ha->xgmac_data) goto do_read; @@ -795,6 +835,7 @@ qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, ha->xgmac_data = dma_alloc_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE, &ha->xgmac_data_dma, GFP_KERNEL); if (!ha->xgmac_data) { + mutex_unlock(&vha->hw->optrom_mutex); ql_log(ql_log_warn, vha, 0x7076, "Unable to allocate memory for XGMAC read-data.\n"); return 0; @@ -806,6 +847,8 @@ qla2x00_sysfs_read_xgmac_stats(struct file *filp, struct kobject *kobj, rval = qla2x00_get_xgmac_stats(vha, ha->xgmac_data_dma, XGMAC_DATA_SIZE, &actual_size); + + mutex_unlock(&vha->hw->optrom_mutex); if (rval != QLA_SUCCESS) { ql_log(ql_log_warn, vha, 0x7077, "Unable to read XGMAC data (%x).\n", rval); @@ -842,13 +885,16 @@ qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj, if (ha->dcbx_tlv) goto do_read; - - if (qla2x00_chip_is_down(vha)) + mutex_lock(&vha->hw->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); return 0; + } ha->dcbx_tlv = dma_alloc_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, &ha->dcbx_tlv_dma, GFP_KERNEL); if (!ha->dcbx_tlv) { + mutex_unlock(&vha->hw->optrom_mutex); ql_log(ql_log_warn, vha, 0x7078, "Unable to allocate memory for DCBX TLV read-data.\n"); return -ENOMEM; @@ -859,6 +905,9 @@ qla2x00_sysfs_read_dcbx_tlv(struct file *filp, struct kobject *kobj, rval = qla2x00_get_dcbx_params(vha, ha->dcbx_tlv_dma, DCBX_TLV_DATA_SIZE); + + mutex_unlock(&vha->hw->optrom_mutex); + if (rval != QLA_SUCCESS) { ql_log(ql_log_warn, vha, 0x7079, "Unable to read DCBX TLV (%x).\n", rval); @@ -1184,15 +1233,17 @@ qla2x00_beacon_store(struct device *dev, struct device_attribute *attr, if (IS_QLA2100(ha) || IS_QLA2200(ha)) return -EPERM; + if (sscanf(buf, "%d", &val) != 1) + return -EINVAL; + + mutex_lock(&vha->hw->optrom_mutex); if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); ql_log(ql_log_warn, vha, 0x707a, "Abort ISP active -- ignoring beacon request.\n"); return -EBUSY; } - if (sscanf(buf, "%d", &val) != 1) - return -EINVAL; - if (val) rval = ha->isp_ops->beacon_on(vha); else @@ -1201,6 +1252,8 @@ qla2x00_beacon_store(struct device *dev, struct device_attribute *attr, if (rval != QLA_SUCCESS) count = 0; + mutex_unlock(&vha->hw->optrom_mutex); + return count; } @@ -1370,18 +1423,24 @@ qla2x00_thermal_temp_show(struct device *dev, { scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); uint16_t temp = 0; + int rc; + mutex_lock(&vha->hw->optrom_mutex); if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); ql_log(ql_log_warn, vha, 0x70dc, "ISP reset active.\n"); goto done; } if (vha->hw->flags.eeh_busy) { + mutex_unlock(&vha->hw->optrom_mutex); ql_log(ql_log_warn, vha, 0x70dd, "PCI EEH busy.\n"); goto done; } - if (qla2x00_get_thermal_temp(vha, &temp) == QLA_SUCCESS) + rc = qla2x00_get_thermal_temp(vha, &temp); + mutex_unlock(&vha->hw->optrom_mutex); + if (rc == QLA_SUCCESS) return scnprintf(buf, PAGE_SIZE, "%d\n", temp); done: @@ -1402,13 +1461,24 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr, return scnprintf(buf, PAGE_SIZE, "0x%x\n", pstate); } - if (qla2x00_chip_is_down(vha)) + mutex_lock(&vha->hw->optrom_mutex); + if (qla2x00_chip_is_down(vha)) { + mutex_unlock(&vha->hw->optrom_mutex); ql_log(ql_log_warn, vha, 0x707c, "ISP reset active.\n"); - else if (!vha->hw->flags.eeh_busy) - rval = qla2x00_get_firmware_state(vha, state); - if (rval != QLA_SUCCESS) + goto out; + } else if (vha->hw->flags.eeh_busy) { + mutex_unlock(&vha->hw->optrom_mutex); + goto out; + } + + rval = qla2x00_get_firmware_state(vha, state); + mutex_unlock(&vha->hw->optrom_mutex); +out: + if (rval != QLA_SUCCESS) { memset(state, -1, sizeof(state)); + rval = qla2x00_get_firmware_state(vha, state); + } return scnprintf(buf, PAGE_SIZE, "0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", state[0], state[1], state[2], state[3], state[4], state[5]); diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index c73039916c03..9d5e320fc1bc 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -189,7 +189,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) goto premature_exit; } - ha->flags.mbox_busy = 1; + /* Save mailbox command for debug */ ha->mcp = mcp; @@ -198,12 +198,13 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) spin_lock_irqsave(&ha->hardware_lock, flags); - if (ha->flags.purge_mbox || chip_reset != ha->chip_reset) { + if (ha->flags.purge_mbox || chip_reset != ha->chip_reset || + ha->flags.mbox_busy) { rval = QLA_ABORTED; - ha->flags.mbox_busy = 0; spin_unlock_irqrestore(&ha->hardware_lock, flags); goto premature_exit; } + ha->flags.mbox_busy = 1; /* Load mailbox registers. */ if (IS_P3P_TYPE(ha)) @@ -254,9 +255,10 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) if (IS_P3P_TYPE(ha)) { if (RD_REG_DWORD(®->isp82.hint) & HINT_MBX_INT_PENDING) { + ha->flags.mbox_busy = 0; spin_unlock_irqrestore(&ha->hardware_lock, flags); - ha->flags.mbox_busy = 0; + atomic_dec(&ha->num_pend_mbx_stage2); ql_dbg(ql_dbg_mbx, vha, 0x1010, "Pending mailbox timeout, exiting.\n"); @@ -274,6 +276,16 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) atomic_inc(&ha->num_pend_mbx_stage3); if (!wait_for_completion_timeout(&ha->mbx_intr_comp, mcp->tov * HZ)) { + if (chip_reset != ha->chip_reset) { + spin_lock_irqsave(&ha->hardware_lock, flags); + ha->flags.mbox_busy = 0; + spin_unlock_irqrestore(&ha->hardware_lock, + flags); + atomic_dec(&ha->num_pend_mbx_stage2); + atomic_dec(&ha->num_pend_mbx_stage3); + rval = QLA_ABORTED; + goto premature_exit; + } ql_dbg(ql_dbg_mbx, vha, 0x117a, "cmd=%x Timeout.\n", command); spin_lock_irqsave(&ha->hardware_lock, flags); @@ -282,7 +294,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) } else if (ha->flags.purge_mbox || chip_reset != ha->chip_reset) { + spin_lock_irqsave(&ha->hardware_lock, flags); ha->flags.mbox_busy = 0; + spin_unlock_irqrestore(&ha->hardware_lock, flags); atomic_dec(&ha->num_pend_mbx_stage2); atomic_dec(&ha->num_pend_mbx_stage3); rval = QLA_ABORTED; @@ -300,9 +314,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) if (IS_P3P_TYPE(ha)) { if (RD_REG_DWORD(®->isp82.hint) & HINT_MBX_INT_PENDING) { + ha->flags.mbox_busy = 0; spin_unlock_irqrestore(&ha->hardware_lock, flags); - ha->flags.mbox_busy = 0; atomic_dec(&ha->num_pend_mbx_stage2); ql_dbg(ql_dbg_mbx, vha, 0x1012, "Pending mailbox timeout, exiting.\n"); @@ -320,7 +334,10 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) while (!ha->flags.mbox_int) { if (ha->flags.purge_mbox || chip_reset != ha->chip_reset) { + spin_lock_irqsave(&ha->hardware_lock, flags); ha->flags.mbox_busy = 0; + spin_unlock_irqrestore(&ha->hardware_lock, + flags); atomic_dec(&ha->num_pend_mbx_stage2); rval = QLA_ABORTED; goto premature_exit; @@ -363,7 +380,10 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); if (IS_P3P_TYPE(ha) && ha->flags.isp82xx_fw_hung) { + spin_lock_irqsave(&ha->hardware_lock, flags); ha->flags.mbox_busy = 0; + spin_unlock_irqrestore(&ha->hardware_lock, flags); + /* Setting Link-Down error */ mcp->mb[0] = MBS_LINK_DOWN_ERROR; ha->mcp = NULL; @@ -436,7 +456,10 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) * then only PCI ERR flag would be set. * we will do premature exit for above case. */ + spin_lock_irqsave(&ha->hardware_lock, flags); ha->flags.mbox_busy = 0; + spin_unlock_irqrestore(&ha->hardware_lock, + flags); rval = QLA_FUNCTION_TIMEOUT; goto premature_exit; } @@ -451,8 +474,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) rval = QLA_FUNCTION_TIMEOUT; } } - + spin_lock_irqsave(&ha->hardware_lock, flags); ha->flags.mbox_busy = 0; + spin_unlock_irqrestore(&ha->hardware_lock, flags); /* Clean up */ ha->mcp = NULL; diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 396c8a6d502c..29fbb0aad489 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -1491,27 +1491,14 @@ int qlt_stop_phase1(struct qla_tgt *tgt) struct qla_hw_data *ha = tgt->ha; unsigned long flags; + mutex_lock(&ha->optrom_mutex); mutex_lock(&qla_tgt_mutex); - if (!vha->fc_vport) { - struct Scsi_Host *sh = vha->host; - struct fc_host_attrs *fc_host = shost_to_fc_host(sh); - bool npiv_vports; - - spin_lock_irqsave(sh->host_lock, flags); - npiv_vports = (fc_host->npiv_vports_inuse); - spin_unlock_irqrestore(sh->host_lock, flags); - - if (npiv_vports) { - mutex_unlock(&qla_tgt_mutex); - ql_dbg(ql_dbg_tgt_mgt, vha, 0xf021, - "NPIV is in use. Can not stop target\n"); - return -EPERM; - } - } + if (tgt->tgt_stop || tgt->tgt_stopped) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xf04e, "Already in tgt->tgt_stop or tgt_stopped state\n"); mutex_unlock(&qla_tgt_mutex); + mutex_unlock(&ha->optrom_mutex); return -EPERM; } @@ -1549,6 +1536,8 @@ int qlt_stop_phase1(struct qla_tgt *tgt) /* Wait for sessions to clear out (just in case) */ wait_event_timeout(tgt->waitQ, test_tgt_sess_count(tgt), 10*HZ); + mutex_unlock(&ha->optrom_mutex); + return 0; } EXPORT_SYMBOL(qlt_stop_phase1); @@ -6595,6 +6584,9 @@ qlt_enable_vha(struct scsi_qla_host *vha) qlt_set_mode(vha); spin_unlock_irqrestore(&ha->hardware_lock, flags); + mutex_lock(&ha->optrom_mutex); + ql_dbg(ql_dbg_tgt_mgt, vha, 0xf021, + "%s.\n", __func__); if (vha->vp_idx) { qla24xx_disable_vp(vha); qla24xx_enable_vp(vha); @@ -6603,6 +6595,7 @@ qlt_enable_vha(struct scsi_qla_host *vha) qla2xxx_wake_dpc(base_vha); qla2x00_wait_for_hba_online(base_vha); } + mutex_unlock(&ha->optrom_mutex); } EXPORT_SYMBOL(qlt_enable_vha);