From patchwork Tue Dec 18 23:39:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Don Brace X-Patchwork-Id: 10736593 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 E6A7A924 for ; Tue, 18 Dec 2018 23:39:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D4DF32A9D9 for ; Tue, 18 Dec 2018 23:39:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C84D42A9EA; Tue, 18 Dec 2018 23:39:09 +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,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 450892A9D9 for ; Tue, 18 Dec 2018 23:39:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727259AbeLRXjJ (ORCPT ); Tue, 18 Dec 2018 18:39:09 -0500 Received: from mail-eopbgr750040.outbound.protection.outlook.com ([40.107.75.40]:62945 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726985AbeLRXjI (ORCPT ); Tue, 18 Dec 2018 18:39:08 -0500 Received: from MWHPR19CA0093.namprd19.prod.outlook.com (2603:10b6:320:1f::31) by DM5PR19MB1625.namprd19.prod.outlook.com (2603:10b6:3:150::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1446.17; Tue, 18 Dec 2018 23:39:04 +0000 Received: from BN1AFFO11FD009.protection.gbl (2a01:111:f400:7c10::154) by MWHPR19CA0093.outlook.office365.com (2603:10b6:320:1f::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1446.19 via Frontend Transport; Tue, 18 Dec 2018 23:39:03 +0000 Authentication-Results: spf=pass (sender IP is 208.19.99.222) smtp.mailfrom=microsemi.com; linux.vnet.ibm.com; dkim=none (message not signed) header.d=none;linux.vnet.ibm.com; dmarc=bestguesspass action=none header.from=microsemi.com; Received-SPF: Pass (protection.outlook.com: domain of microsemi.com designates 208.19.99.222 as permitted sender) receiver=protection.outlook.com; client-ip=208.19.99.222; helo=AUSMBX2.microsemi.net; Received: from AUSMBX2.microsemi.net (208.19.99.222) by BN1AFFO11FD009.mail.protection.outlook.com (10.58.52.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.1446.11 via Frontend Transport; Tue, 18 Dec 2018 23:39:03 +0000 Received: from AUSMBX3.microsemi.net (10.201.34.33) by AUSMBX2.microsemi.net (10.201.34.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1531.3; Tue, 18 Dec 2018 17:39:01 -0600 Received: from [127.0.1.1] (10.238.32.34) by ausmbx3.microsemi.net (10.201.34.33) with Microsoft SMTP Server id 15.1.1531.3 via Frontend Transport; Tue, 18 Dec 2018 17:39:01 -0600 Subject: [PATCH 1/3] smartpqi: increase fw status register read timeout From: Don Brace To: , , , , , , , , , , , CC: Date: Tue, 18 Dec 2018 17:39:01 -0600 Message-ID: <154517634144.17054.18277093348771952532.stgit@brunhilda> In-Reply-To: <154517619004.17054.10951702672567884152.stgit@brunhilda> References: <154517619004.17054.10951702672567884152.stgit@brunhilda> User-Agent: StGit/0.19-dirty MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:208.19.99.222;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(979002)(7916004)(346002)(39860400002)(376002)(136003)(396003)(2980300002)(199004)(189003)(446003)(186003)(11346002)(8676002)(81156014)(77096007)(26005)(97736004)(81166006)(106002)(2906002)(336012)(4326008)(53936002)(103116003)(14444005)(76176011)(33896004)(16576012)(58126008)(68736007)(50466002)(2486003)(23676004)(110136005)(5660300001)(305945005)(47776003)(356004)(106466001)(230700001)(316002)(44832011)(86362001)(478600001)(33716001)(476003)(126002)(486006)(8936002)(2201001)(9686003)(69596002)(921003)(83996005)(1121003)(2101003)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR19MB1625;H:AUSMBX2.microsemi.net;FPR:;SPF:Pass;LANG:en;PTR:InfoDomainNonexistent;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD009;1:WMVQsd6e8DRFFZ4WsMU9c/hVeDMJTefQEV6XDl69aPs9b4s/Tm4MByUA9mqOVTRxIJklA+B2ejhQj61yRx4mtCay5kbAOQXVV4pms14fZy+x4kJqmhUyGJrF1op3b7iI X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: db3f041e-8b4d-43ce-5494-08d66541fe55 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:DM5PR19MB1625; X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1625;3:CUCeyIBxiK7tQ+vW7ta+Svw3UQLpqGpHBlRKeIlvsx3iko+N9Mv+dUnh5mmh0LrP4Xx0WE5NvDm2CqvJiTHOsa1mahoR8Q/L3subENMwPoAbC0nhHBsluG62SHcUjihaweVQ2UfUrrnGeFbMpPTAZtxv1dWBWnUnc5SfpqBeodHEL/+Q6/eu/rUc38utxY2e//TLY7c9UkSfh9e9kgiECNybHIOfkxkzvJHq0CSmScX7q7cb9dz+1TjIytvimV0/6qQ2rheXezNnugi23LUY7c6MMeTTMRIHec1rfdayYK0pyeUzwhU7K/jjO50eTKAByf2Ml76E3E6Fs0RTSS1dIDk9GNQgprWS+lXJ+y6Ljas=;25:uXT8T6X3k1I/GP86UP0f4wF2tAnIlBxwQKdS06Cfj6x4uuuyhjsskkuaRdHOsKOgenhM3v6e/4ePLefwMvVU/fHj8NQlOUscLPEj5M0GbJsuw2molCRL7oWyBlY70Oag50o9yUsTfGviLtnjMIDPNdorthse+dzL1h+vIyh70zLqF3NZq9tg9DKgiaoWRoPqXZ1NJyNvYH4mNXhjALckj7qVGsF/Anx42ii/ZekoNP3tjmQyerKTyIPuxTQMxG77iXCDl7nEPjfUgiJ56fpEli5giRzm46SgyKPeEbpYioTFFkgnUCxWCOMO8t6IiW5s9xEP05MxbMbdpRkMasNh3A== X-MS-TrafficTypeDiagnostic: DM5PR19MB1625: X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1625;31:w3WokQ37zWl4b3zuDULcT8SQEwXdLpMm2axg+OYl4x+sF2jPca0Uki9PtAYWmiYqryqtjtiLrfMH0sfqP299+BVX7SIDn6W2HdmRKSEb97K00zaENbJV7GzFBRn3+9oXnboE8xjOA07u8wy0q1Uvy/5+Q4rhl5p+7pYVN3ieQQhiDUS07fw5vOrVQEujmjSZE1Gffm41qsV67BxrVPLx4cej0EpkoRRP+ge0kmlls6c=;20:byO+ES0DPk9ID79WRQCv1XY8WMBwR4OriMpPNKRXy2irTqcGi8ByQH4/SsZJ6sdq/1vCJreR9i1TKHT83PjXhn47L0lW7a81x5h4Vk/VJ/8E4aWPeGP9OSXqUPsdAWqGHtnZg0tQTDrrl0EAKZ77pBgbsj9z/m83YXoDDCtR0opFBVuMzeCqcfnLZ6W0jlWvLRQTGSMOnZCoYivxBHjmLyKd2Jug+8OQhglWktOGqfNrG+iMUXIoZ5i6k1zYhkRlCRyivwEMS5hxI4yDg7nyLOGSp0lqWsgHF5iDrqxplmIuiooLAxfT2sfRBmsF04P7AVVC8M3BId5V3QlIZNV29Byy/WDV03a0F8JT79nF6v0UGDA1IkQjk6GqFyODBlfj0aZID60d7XQTLdiT+WmSBCuQBqtquBSffs8SVbwFbearwhGYlAHq0iwSIFFsTHifZyBdYCN4OX9eo5HRhX9zwERLiMhx43TMf3rwoe2LN9oeYUVyi0fVH/bpVB104ZR6 X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(3230021)(999002)(5005020)(6040522)(2401047)(8121501046)(93006095)(93004095)(3231475)(944501520)(52105112)(3002001)(10201501046)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123558120)(20161123560045)(20161123562045)(201708071742011)(7699051)(76991095);SRVR:DM5PR19MB1625;BCL:0;PCL:0;RULEID:;SRVR:DM5PR19MB1625; X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1625;4:AbAbIKDzjdHbjlFLsUSI3kN8o4EY+7qDGKH9Jnaj28r+mF3KauMeryiVdV9cK5MpQeZDKevrfTac/rZJ+suqLUsvPZL4k7fK94u3Q2xVuXWDyccF6on3OwSddpZNEuTC/P3bo1GnUH5yFe9iqxFdJ6c48XN259vkD6LOojM3Lcd8ij6w4/xIrfTrwwxX/zviMWEUOkj52vqtN70MH5rCml2K5BUOJuGTg3OGtZMy3W/b+RFW9R+0OX5+czLcE4z2vLomFp38eIM8EGDlNMV59g== X-Forefront-PRVS: 08902E536D X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BDM5PR19MB1625=3B23=3AjJMavYB?= =?utf-8?q?BCE8yRR3VIckC5Vun0uBd7OYzTQKc69Wggk9rG4HOio0UqTlHjXyFCtOmap+jD8XQ?= =?utf-8?q?inyLivk0JjZqc/NFumLcdpadlBAcoLDWMivSpvRXAWKfkWtESQemfrR9EU5m+qlcg?= =?utf-8?q?K1gYc+UJHic/+s1XD/G62RPGwnk5GOwHdajFPsEVzhvaMQs6tT7XUBcSGufOelzJM?= =?utf-8?q?7GbuQX+C09Wgjm2yk+2XbDuMzLxJnTYLe8mIfpNzPM0FZbdxLrhUnKDhBbORPPH70?= =?utf-8?q?9nkLtjuoWzd/rejIc57jX5TqgMM8QbpehyJ+LSkuwhN93DPvZJFl7rZangLI8av/j?= =?utf-8?q?AmaD7gtcs3YNYes/t2HECmmFNMW+vp2EbkuMtxSwPuLh4WfWP4IoEsliIo5qVzqFc?= =?utf-8?q?UZlndhsGnZCkVrWfri7obKmAufhoEbOBtZ37eOddxcTZJxR+623aoSeGlJvrjFJOk?= =?utf-8?q?0zxq7b2FXVNNp9tuDeI7xip8/OpD2oMz39dRV0Nr67kSi9YxXbucOXxOeKifQUryB?= =?utf-8?q?A5iDcZvkDLub9e29923EXyF4MCPLXSnYuHWKSkpC3Sa3sCvEmnnUc8YkrifsnT8/l?= =?utf-8?q?y6pEQQuXzVJiRpUy3P7/DRWQBOhDCkDM2b72Bn1R66wYhOYQI3SCZ2L9mrzVYN8nm?= =?utf-8?q?C9HUVyvO+LSrXDNe10z848a8sWaw6Bv+g0b9u5DthPbvaElFjGj/6aYYY81RZEP0y?= =?utf-8?q?D5h9wxB5cFa6AKI3hELrkOur110gKMjLNZOZoqdpgwrcjN3ftWpvK4Mla6P+wtEHl?= =?utf-8?q?VHofOYOCqVGkpYM9IJ5PzO7b/H8KqfX/xQFxfQ9xqXaT8n7d6BWNn8okNSpmCzr4l?= =?utf-8?q?J9oTR+SIC5InPhnRwgjK6N5hCT281huhwAMzDosbaucijI4Ap4w31GfqVP0ToxXZH?= =?utf-8?q?sJjHE/RQWAHa8v9/tlwaLX2LZ+UaCBAyHTcVTsnkPAdH2WMHM/XABrkMUq7DwSdm4?= =?utf-8?q?gqAji4oSMTGprXGXT4vN0fGEx/Fye646LbSh2n3wtN4+fE05hK+tvdidS6MAzdQDV?= =?utf-8?q?7rJYaypQt0qF9Jd+tiuX+/orfrbTKaKEDKG9lPfM4AVMR177T0XVyxV4rFy0zN/am?= =?utf-8?q?/Kb4jbeCzAzK0HA1ogMmY5K6NF71XCVffFlbB9VlUVCEAL3bIPzVU2xyD4h5QbjVD?= =?utf-8?q?bj7QTCD+hDMNM02OuLHEWMyLfLALcE2jx6fRRm/iTI1xb1CEAbHJg7iKoJ9Nw1iPP?= =?utf-8?q?KT1oW8SEn5dVpxXB4Rob3Z+oWOMZkZUfK47wQ4fZ4YhmXoj6IPZVxKrMYObBNSn6o?= =?utf-8?q?HNhjgo1M0GBo6L4liIGh+iJ4RliqdQjWsAJox?= X-Microsoft-Antispam-Message-Info: 7ZHEVYhVxpmeJGmNHwTWFo0hAiYTbk71+P4U9zO3irQTye00VHJLw4DdA75Zh1pCpg9vbxg5vqqg+WZG8ujt1Lxh0fXZ4Wo/OZozBRbE3A1GY0wCJ0Cxrit0Fn7hxVqcOkZ8Fxe0fYzV0HD7sWLWd0WeR7JFunlW52aiDyDDC7pEYwjZMcVys8GMB/2a10S4Ly4IuWM/3v6qVGqSWcNU+TKJbrSjHDvAaHFtflZby2vit6aYWxjQiNxj6uZiEJrFl4hWBZ4cPFabOYFMr2oeojjWcnRmeH0HEfKZh3U/trODE3C4IuaYOJ7Az1bL+nSE X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1625;6:zqQz0NQ9uZAkOjN+EwXVmMM4KJ2Ac3draGJ08BSztvq6OErgfgVEkQ3l1rXTnZovfSi7jfdClsa8hWB2StLSyiaum8tOpPZRs6rKmPoeFlllAfdvc8yFM6iNmftsTShTWG5jyaooM5ZTB5G9GrQ806DA8H64iQVOWLgGCu9ALoaJvfHhwpGXsPycyhlVJep5XRLHli+hnIqJndL/U082mga8DAz4pbOa91LTW57j+qUFSfxXk4KxZDvdEss3/zbGEgo/SQM64P+0vbIHBLflmjut1U+NA1ye/3QuSqhAFNoBR5OOS4sX0tWFFr9PoStdfHHrzyKPpaiiREAfr7rGHZOLN+P9GtdS+VJhPAHJ51FuJ4jt90pqoubi0qhvZhCi0KzL/WIJL2pqSlboqlolrjE0Z1ILdmiNG9vHkO7ip0e/dk6SRHKEM8UPAlkRsQelu1gdbJuiBI3FWomIL33iAg==;5:KuQydeF+a50f5UlSQEE0JQjaUJSNN0rMlzkP8K+lk0Wg7XMtQQnzFpMVR+8jRH8ZKZbGkwUqSTDacQCZCd7f8zkkkxkcqL1PY3Gv0hyst4+aHQn5cXQLEPcmFlUHwbsthV6eiMlEiwnlP2Qb0H2OOFT4PAY2xAO05lzwY/jEbcE=;7:CPSyyGl7SDiuTyqpQ7D+KxNxhZV2agDzYIvTdI0c5U687tC8+0ojSx2Kn/B6mlYL90g6xu7xYQKp8GLXZC5lTTefyDzosjecY/F0vgpCnT15SzMe9cUmwh4qaRDpKBU6zYoHYicq/lL8xGvvClKIUw== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: microsemi.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Dec 2018 23:39:03.2382 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: db3f041e-8b4d-43ce-5494-08d66541fe55 X-MS-Exchange-CrossTenant-Id: f267a5c8-86d8-4cc9-af71-1fd2c67c8fad X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f267a5c8-86d8-4cc9-af71-1fd2c67c8fad;Ip=[208.19.99.222];Helo=[AUSMBX2.microsemi.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR19MB1625 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: Mahesh Rajashekhara Problem: - during the driver initialization, driver will poll fw for KERNEL_UP in a 30 seconds timeout. - if the firmware is not ready after 30 seconds, driver will not be loaded. Fix: - change timeout from 30 seconds to 3 minutes. Reported-by: Feng Li Reviewed-by: Ajish Koshy Reviewed-by: Murthy Bhat Reviewed-by: Dave Carroll Reviewed-by: Kevin Barnett Signed-off-by: Mahesh Rajashekhara Signed-off-by: Don Brace --- drivers/scsi/smartpqi/smartpqi_sis.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/scsi/smartpqi/smartpqi_sis.c b/drivers/scsi/smartpqi/smartpqi_sis.c index ea91658c7060..9d3043df22af 100644 --- a/drivers/scsi/smartpqi/smartpqi_sis.c +++ b/drivers/scsi/smartpqi/smartpqi_sis.c @@ -59,7 +59,7 @@ #define SIS_CTRL_KERNEL_UP 0x80 #define SIS_CTRL_KERNEL_PANIC 0x100 -#define SIS_CTRL_READY_TIMEOUT_SECS 30 +#define SIS_CTRL_READY_TIMEOUT_SECS 180 #define SIS_CTRL_READY_RESUME_TIMEOUT_SECS 90 #define SIS_CTRL_READY_POLL_INTERVAL_MSECS 10 From patchwork Tue Dec 18 23:39:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Don Brace X-Patchwork-Id: 10736595 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 7814A14E5 for ; Tue, 18 Dec 2018 23:39:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 61BBA2A9E9 for ; Tue, 18 Dec 2018 23:39:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 52A882A9D9; Tue, 18 Dec 2018 23:39:29 +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,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 59B142A9D9 for ; Tue, 18 Dec 2018 23:39:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727357AbeLRXj1 (ORCPT ); Tue, 18 Dec 2018 18:39:27 -0500 Received: from mail-eopbgr700072.outbound.protection.outlook.com ([40.107.70.72]:16928 "EHLO NAM04-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726985AbeLRXj0 (ORCPT ); Tue, 18 Dec 2018 18:39:26 -0500 Received: from BN6PR19CA0109.namprd19.prod.outlook.com (2603:10b6:404:a0::23) by BYAPR19MB2965.namprd19.prod.outlook.com (2603:10b6:a03:13d::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1425.20; Tue, 18 Dec 2018 23:39:10 +0000 Received: from BN1BFFO11FD011.protection.gbl (2a01:111:f400:7c10::1:104) by BN6PR19CA0109.outlook.office365.com (2603:10b6:404:a0::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1446.17 via Frontend Transport; Tue, 18 Dec 2018 23:39:09 +0000 Authentication-Results: spf=pass (sender IP is 208.19.99.223) smtp.mailfrom=microsemi.com; linux.vnet.ibm.com; dkim=none (message not signed) header.d=none;linux.vnet.ibm.com; dmarc=bestguesspass action=none header.from=microsemi.com; Received-SPF: Pass (protection.outlook.com: domain of microsemi.com designates 208.19.99.223 as permitted sender) receiver=protection.outlook.com; client-ip=208.19.99.223; helo=AUSMBX3.microsemi.net; Received: from AUSMBX3.microsemi.net (208.19.99.223) by BN1BFFO11FD011.mail.protection.outlook.com (10.58.144.74) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.1446.11 via Frontend Transport; Tue, 18 Dec 2018 23:39:09 +0000 Received: from AUSMBX3.microsemi.net (10.201.34.33) by AUSMBX3.microsemi.net (10.201.34.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1531.3; Tue, 18 Dec 2018 17:39:08 -0600 Received: from [127.0.1.1] (10.238.32.34) by ausmbx3.microsemi.net (10.201.34.33) with Microsoft SMTP Server id 15.1.1531.3 via Frontend Transport; Tue, 18 Dec 2018 17:39:07 -0600 Subject: [PATCH 2/3] smartpqi: add ofa support From: Don Brace To: , , , , , , , , , , , CC: Date: Tue, 18 Dec 2018 17:39:07 -0600 Message-ID: <154517634766.17054.12564725535044570724.stgit@brunhilda> In-Reply-To: <154517619004.17054.10951702672567884152.stgit@brunhilda> References: <154517619004.17054.10951702672567884152.stgit@brunhilda> User-Agent: StGit/0.19-dirty MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:208.19.99.223;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(7916004)(136003)(346002)(396003)(39860400002)(376002)(2980300002)(199004)(189003)(186003)(53936002)(478600001)(106002)(68736007)(4326008)(2906002)(33896004)(14444005)(5660300001)(356004)(103116003)(47776003)(305945005)(33716001)(126002)(8676002)(11346002)(486006)(476003)(446003)(8936002)(44832011)(81156014)(81166006)(106466001)(86362001)(230700001)(316002)(9686003)(336012)(110136005)(58126008)(77096007)(16576012)(76176011)(2486003)(4744004)(23676004)(2201001)(53946003)(575784001)(26005)(97736004)(50466002)(69596002)(921003)(83996005)(2101003)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:BYAPR19MB2965;H:AUSMBX3.microsemi.net;FPR:;SPF:Pass;LANG:en;PTR:InfoDomainNonexistent;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD011;1:q/a8RI8ikVsZ3CtXJgju1tG1pGZpdlZhsn6wqnMdPbWJWZ/28ups5etD1WAeUW2IIqpVY+ToMtge4gOb6Iqd1xzLPWhnwlC7KeHFBMIGs02Zm63PNXR0K6Dk55RfLAWP X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5f81225a-fe78-4fab-caf7-08d665420205 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4608076)(2017052603328)(7153060);SRVR:BYAPR19MB2965; X-Microsoft-Exchange-Diagnostics: 1;BYAPR19MB2965;3:D8krkguWaJog9U+HAU9UNvb8tm0n3US8ZsPBFm5ZMAzqEYFHIADvCwsrPyqcCAyHqkyhRHPah6YQeon1tjPSC75d95a/tRYEQZGFSaDsu0HPdHzl8nWvHD6xW9jQ5D/elppBhvWZiOuEfmQZDRz8YUboGPZqe3lNwruBy/UK5raf0zTHXjbabB7x8ozT40xvu/Nqy9oJfV1uO6Xhm2pdh39jzSCzDeESh6xFfdRpaXyhIZ+J/DVFkCqmbBLxZtLcdcFSkpNse7Jy6bG68Csd70yucsamUC3mFhs/OjCNNiWYRtbqIW8EJh7fidhtS6SgH5SBGGSRY1/N2gwDhQqpyVacPJrMsCaM3f2M/o3O0s4=;25:eQV09CRWFlwoCPdjeZvp+oWWdBwAzecs9ADZtiHqEWT1c8o1YTJW3MZeTyvQq97V02qZwSMG3EFwVZsV+QSpFHdpZ38H0Bc1kmr64nnfZepNbquefeQQKke+9J5e3HWRbK+59L4tWpE0OBfLgM21TzxiRs9+rJA5DYixqwtHcAVawYdSJ5brWtBLjCIJB0RDzYiQ4hjOU3wQ/jBaaaTOgDFXGzJS2LGpgfQGBWlFTx1NrC4ekEg4XH90VYgPdlu+vkDNjsUimhxorUf1JoZh/bq1yFSNMtVrCAgLc6fibBKTKbm/mmiCd7RSl8R7O0BHaLzopFYb8yoEDdgn/gw3fw== X-MS-TrafficTypeDiagnostic: BYAPR19MB2965: X-Microsoft-Exchange-Diagnostics: 1;BYAPR19MB2965;31:yqJcxU7NsyZF7ArJAs3BOpbfjl3EtAbJSe37Gz56+GBn9Z2paNSuDE03BASUNB4B2WGkMC8fCjz76RtxT+YIgLf7cHx7QFQAba2UH/nGzaiDLr2bTTmy81cX0nwDLya6NRTVV2aDgWXapeX0/yHUOlohDMRKbJTeNuUYTe6JcJGni/LHwGaHotiR7BJdN5S5doCVmru+7dBEBTQZ49HyitE30H4HeiA3f+ALloBJDC0=;20:YJM8wNUKxUFLB7blCvfyPbN+iXW2RSCOGJ9UtAtCkPWRk2gXmUHabBSfoH9VDwKPv32jYfM37XbvRYQeFNeuiR6g54XNq0lthM256uHbOI7+3NmQUxjgYMjef4YU60qC8CvTrryJ2W4tKvlbC+JlD5/ddwcbo59OmtHIKq/PKD2wQmf+ioLLCyrc6uyiByT+jhA1JLdRtfzWAg1pQa/f3ub/7DH3LiF1srm3b2vskYMv5SXd2R4TxScqlDV20zwZLw8cGjFGFn56RpEFgWy2N9bk16by1bFyK7ntfkzmziYSxr7cQnPZTFYqJpVIQZm5LegX0WfvMHLPvjnhWUafY/RkQiUs8ZUvANcCep1LJiSy2ENyRFMONSJsgXabQJuZdIsMAVFp6kjRj8Sn2TZU+naIGC95FX3Vc8B6Q/tMdrQdXQZD91MttuzTUZpsP1rFHk5VZdIbK2lW8xY1g2Ufg7yAEv38jyzYPSqMYZb2VDwnr7NFsxbo5vH8ou4ws0bZ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(3230021)(999002)(5005020)(6040522)(2401047)(8121501046)(10201501046)(3231475)(944501520)(52105112)(93006095)(93004095)(3002001)(6055026)(148016)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123560045)(20161123564045)(201708071742011)(7699051)(76991095);SRVR:BYAPR19MB2965;BCL:0;PCL:0;RULEID:;SRVR:BYAPR19MB2965; X-Microsoft-Exchange-Diagnostics: 1;BYAPR19MB2965;4:cZf7kkPYkmk05NTtSfzvUjMNJMWO+R6PqL0JdT5oUsu+hHoi6pa7pVAOrGvl2wKGzEOwbXW5OYEAz0dqYlSNix/c/gCtFOIW3OwOg2paLgcBKpawPieLAR2pbSF9BgBSZE8OwRD98HJ+xk6ukenSzN0M0RD0Y638lPZe51FoHf3SKTPCgCVqlxpNfFHMgu1Q8BCpBv3VWkx9oDmUI6JEH4XB3tUknxbpafMnlxOxaWiYy9zqbKfaPRmhG8waV+ZFiY6n1/ztYKTBTTMB8f3MAQ== X-Forefront-PRVS: 08902E536D X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BBYAPR19MB2965=3B23=3AgmwB+eS?= =?utf-8?q?bz8ww5vrt7TWNwHKj7cXSwvrczbKj0Io4wgQLx9OUyuDasSTfkm/++hBGo4gyMVYY?= =?utf-8?q?toRoLWnY9ZBZQbIvfafjE5QYMEu7BjpS47EaVWPoj4STxgAAhBMlkn7IBX5vT1zdI?= =?utf-8?q?UuCKLGw7APwFV+exrguxurhkO0M03s1ijv8Ok1kZVGF0Zj9AyN95j6JWb7WijV3Ve?= =?utf-8?q?o4JEBGqMEFph5iyQrayYKh/3uX/lik0yHCZswT0omEjaFyvTUWsP6AA3p1Stz0GSB?= =?utf-8?q?C+VAVy/aJHC72MrhVi+4YCw6/E16GiLeZRKdIX4yBolfJh69D+QYLSlTAKOHPyNIl?= =?utf-8?q?pGoeUisbQA1x3Rvor1xtpSOi+uRcVHtdDJbqvhBwTuypckFa7o2Fn3Cj30Mck3ktv?= =?utf-8?q?036+QjdLlBnVlpDfb2wQrnX93ZSQ0CxirEdX79gyO5W6FgA5R7E/OPLpo3u0fsF26?= =?utf-8?q?xAkCB3cbgHn0h8GWHkhVvyLqxbp7yYNDxWeIhKTx0YP4AtNVkdzG+xEvWBndco16o?= =?utf-8?q?kllyGsGdH1Be9q18+sDxRdZXby/4fgHD9hB96+vn0xm8lHL8vmM2Sx6Tgt7x6Zm0W?= =?utf-8?q?bnyj1DbX2iLkkCY9SnGlUiRRDK1pe9GBq8uXXuqmOy7HebyCgTeSg+3Va4ZKeJqyX?= =?utf-8?q?uiG6fosIqb1rvCuesLtR8/1D5ruaFnH1NJzNbptXErF2uaudwlSSU+I2e5eBcvNb6?= =?utf-8?q?XqE+iSH1TNqlo50uQrTQ4gCuIQTBHUxs5vF2p4SeH8y9J2Zv+hrMW0eAxaxAOnsjD?= =?utf-8?q?5D9BVg8/7JjfxHKbJQAxB2+BGKnyxqJcY4QZUKt3Lya0RLWfVIrho/jEaGdKuxPsU?= =?utf-8?q?IodzsoxILFvlnFUQHFYY50KXoWRoSQQv55qbKms2sr0uQQgSUMihANxm+EU7Q5SS4?= =?utf-8?q?LEDsWGRxrDICspiPBjCXXoqGq1fNq+B9GoeiM7+UhuniooPpTOco2GPf1bcgzXJ+Q?= =?utf-8?q?41lj7nCkQv4aj0r0KlGN+dZYocgNywF3YX6kfbwREECH+epXGxxk978UKc58bY+jX?= =?utf-8?q?NE1cO2NvYITAvqpv84d7QeW3Wg/aHmUQf9sELVsPKVMfbobo3B2UZMl1gtnM6AdSI?= =?utf-8?q?+pSXlhtlsru/79k4rnY9oemHsGGKtctbNW6K6ZNosxJfgPqhtQWxYaBmubV9/WESm?= =?utf-8?q?D5Jfq3gvZAp9fq2hClt/0lsU/kRO9ftXEKMj2iFE+QK36wnUTFOjICe++2bG419b5?= =?utf-8?q?Q79IPoO1xYD3+WAntNNrwOS4QcHCFQVPiOVOi6s92kk/Hwz3JInPGD0jMUxg=3D?= =?utf-8?q?=3D?= X-Microsoft-Antispam-Message-Info: Kksylq3mYFIVANY7amgw7dcSwJZRiYLjekujAT7naH8w0lwUQSl2y1ebXQuTMcp2qEv1y6SNZsqY6l909AF46JUhl4MVQlJFbglr5n2By2xTEk17yLqi9LyPBgKHefPfJQpS5H8tAlN3ErNTm1fNxzMi+qJtR5HSRzZTo3fnpzxu0GCY5cTXeE8S+vbiw8yJ7ZcWxtBSFc6MFAK/2DljzyYrRCLxCDwfpUUyqfMN4L2LaFP1kR/QSxtt/e7wIJfzTmavCVq8T7rcCeAtQ7oHLBcenKiNA+w250twQn4T89b77gzd0llvXgHEKJh8i4bL X-Microsoft-Exchange-Diagnostics: 1;BYAPR19MB2965;6:22wFVhGFOFvIn2E57XnzJBeoznOqd9cV5gUeHl5QJw4b0El5e66nyprDS5MsWE/OJ1vPKfHOHhu0zvh37PowyhGx7HbF54Jj/ugsMk5/6e+WEafov+GqbkHmlmGWSjLRUpi6pJlRWKNEKijyy/RX704KF/IehYyao7JqtQFZYb+rXXcoe9bUn5VWE4vz7VZBRs3eP3rSMvnIFgjmV5G6DjOqGfqRh2hOvS/ry9z6mDKsFZr0g2HzlweOR63zMWO/BnDMm1I2UHHem6RsFkeT7ymvH2P4AOQ65oMmWSuVuNL0hyodiQE9Pq2AT66+R5Ix1iLTRKAWNvTZ+M3SA/dWb24Rvkx6vANPDjK7pnn7Zyg4xu2s5JsnL7Zw5+77by/Ni75H80tGAf1pA2gKC5DkaYXXDDoWbBh3QpRNGhRWLz3nUAmI/yznlqFbIKc544NXxzbDmvsTbY55vWo7SYsIcg==;5:INrhiLlX5KekC/N06alMhIrIumVdiluCZcF53SHHR+Vfifabqw6wvK/S9tCNbS5TCibt2vwV7KaWi5xi1RSqsMZ2N2SJXS6VaMuJuG4eeEvrgvvgoa5gp6bPGQH9JPj1PSkZlPA4UWTKzLBEnzE/1csiyEnxmQFdFbHI8l+dl6g=;7:SezsgxolcgMKLgEAsdET38plkHaG6OcJRZ8bND8fHM9MIg4+ZtT0MiPFVIGV0I1lPhD7BL+Ra87V02hr+3T9Q1bLY2uxEOLql9kuL8O+XgpEca7oVqvi0H4Ich1fDCa/KO1VbBizs8wMlB33lOdqmw== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: microsemi.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Dec 2018 23:39:09.4434 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5f81225a-fe78-4fab-caf7-08d665420205 X-MS-Exchange-CrossTenant-Id: f267a5c8-86d8-4cc9-af71-1fd2c67c8fad X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f267a5c8-86d8-4cc9-af71-1fd2c67c8fad;Ip=[208.19.99.223];Helo=[AUSMBX3.microsemi.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR19MB2965 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: Mahesh Rajashekhara - when OFA event occurs, driver will stop traffic to RAID/HBA path. Driver waits for all the outstanding requests to complete. - Driver sends OFA event acknowledgment to firmware. - Driver will wait until the new firmware is up and running. - Driver will free up the resources. - Driver calls SIS/PQI initialization and rescans the device list. - Driver will resume the traffic to RAID/HBA path. Reviewed-by: Murthy Bhat Signed-off-by: Mahesh Rajashekhara Signed-off-by: Don Brace --- drivers/scsi/smartpqi/smartpqi.h | 76 ++++ drivers/scsi/smartpqi/smartpqi_init.c | 587 +++++++++++++++++++++++++++++++-- drivers/scsi/smartpqi/smartpqi_sis.c | 13 + drivers/scsi/smartpqi/smartpqi_sis.h | 1 4 files changed, 634 insertions(+), 43 deletions(-) diff --git a/drivers/scsi/smartpqi/smartpqi.h b/drivers/scsi/smartpqi/smartpqi.h index ba499a636f43..af962368818b 100644 --- a/drivers/scsi/smartpqi/smartpqi.h +++ b/drivers/scsi/smartpqi/smartpqi.h @@ -100,6 +100,12 @@ struct pqi_ctrl_registers { struct pqi_device_registers pqi_registers; /* 4000h */ }; +#if ((HZ) < 1000) +#define PQI_HZ 1000 +#else +#define PQI_HZ (HZ) +#endif + #define PQI_DEVICE_REGISTERS_OFFSET 0x4000 enum pqi_io_path { @@ -350,6 +356,10 @@ struct pqi_event_config { #define PQI_MAX_EVENT_DESCRIPTORS 255 +#define PQI_EVENT_OFA_MEMORY_ALLOCATION 0x0 +#define PQI_EVENT_OFA_QUIESCE 0x1 +#define PQI_EVENT_OFA_CANCELLED 0x2 + struct pqi_event_response { struct pqi_iu_header header; u8 event_type; @@ -357,7 +367,17 @@ struct pqi_event_response { u8 request_acknowlege : 1; __le16 event_id; __le32 additional_event_id; - u8 data[16]; + union { + struct { + __le32 bytes_requested; + u8 reserved[12]; + } ofa_memory_allocation; + + struct { + __le16 reason; /* reason for cancellation */ + u8 reserved[14]; + } ofa_cancelled; + } data; }; struct pqi_event_acknowledge_request { @@ -420,6 +440,25 @@ struct pqi_vendor_general_response { }; #define PQI_VENDOR_GENERAL_CONFIG_TABLE_UPDATE 0 +#define PQI_VENDOR_GENERAL_HOST_MEMORY_UPDATE 1 + +#define PQI_OFA_VERSION 1 +#define PQI_OFA_SIGNATURE "OFA_QRM" +#define PQI_OFA_MAX_SG_DESCRIPTORS 64 + +#define PQI_OFA_MEMORY_DESCRIPTOR_LENGTH \ + (offsetof(struct pqi_ofa_memory, sg_descriptor) + \ + (PQI_OFA_MAX_SG_DESCRIPTORS * sizeof(struct pqi_sg_descriptor))) + +struct pqi_ofa_memory { + __le64 signature; /* "OFA_QRM" */ + __le16 version; /* version of this struct(1 = 1st version) */ + u8 reserved[62]; + __le32 bytes_allocated; /* total allocated memory in bytes */ + __le16 num_memory_descriptors; + u8 reserved1[2]; + struct pqi_sg_descriptor sg_descriptor[1]; +}; struct pqi_aio_error_info { u8 status; @@ -526,6 +565,7 @@ struct pqi_raid_error_info { #define PQI_EVENT_TYPE_HARDWARE 0x2 #define PQI_EVENT_TYPE_PHYSICAL_DEVICE 0x4 #define PQI_EVENT_TYPE_LOGICAL_DEVICE 0x5 +#define PQI_EVENT_TYPE_OFA 0xfb #define PQI_EVENT_TYPE_AIO_STATE_CHANGE 0xfd #define PQI_EVENT_TYPE_AIO_CONFIG_CHANGE 0xfe @@ -685,6 +725,7 @@ struct pqi_encryption_info { #define PQI_CONFIG_TABLE_SECTION_FIRMWARE_ERRATA 2 #define PQI_CONFIG_TABLE_SECTION_DEBUG 3 #define PQI_CONFIG_TABLE_SECTION_HEARTBEAT 4 +#define PQI_CONFIG_TABLE_SECTION_SOFT_RESET 5 struct pqi_config_table { u8 signature[8]; /* "CFGTABLE" */ @@ -724,8 +765,9 @@ struct pqi_config_table_firmware_features { /* u8 features_enabled[]; */ }; -#define PQI_FIRMWARE_FEATURE_OFA 0 -#define PQI_FIRMWARE_FEATURE_SMP 1 +#define PQI_FIRMWARE_FEATURE_OFA 0 +#define PQI_FIRMWARE_FEATURE_SMP 1 +#define PQI_FIRMWARE_FEATURE_SOFT_RESET_HANDSHAKE 11 struct pqi_config_table_debug { struct pqi_config_table_section_header header; @@ -737,6 +779,22 @@ struct pqi_config_table_heartbeat { __le32 heartbeat_counter; }; +struct pqi_config_table_soft_reset { + struct pqi_config_table_section_header header; + u8 soft_reset_status; +}; + +#define PQI_SOFT_RESET_INITIATE 0x1 +#define PQI_SOFT_RESET_ABORT 0x2 + +enum pqi_soft_reset_status { + RESET_INITIATE_FIRMWARE, + RESET_INITIATE_DRIVER, + RESET_ABORT, + RESET_NORESPONSE, + RESET_TIMEDOUT +}; + union pqi_reset_register { struct { u32 reset_type : 3; @@ -1000,13 +1058,15 @@ struct pqi_io_request { struct list_head request_list_entry; }; -#define PQI_NUM_SUPPORTED_EVENTS 6 +#define PQI_NUM_SUPPORTED_EVENTS 7 struct pqi_event { bool pending; u8 event_type; __le16 event_id; __le32 additional_event_id; + __le32 ofa_bytes_requested; + __le16 ofa_cancel_reason; }; #define PQI_RESERVED_IO_SLOTS_LUN_RESET 1 @@ -1067,13 +1127,16 @@ struct pqi_ctrl_info { struct mutex scan_mutex; struct mutex lun_reset_mutex; + struct mutex ofa_mutex; /* serialize ofa */ bool controller_online; bool block_requests; bool in_shutdown; + bool in_ofa; u8 inbound_spanning_supported : 1; u8 outbound_spanning_supported : 1; u8 pqi_mode_enabled : 1; u8 pqi_reset_quiesce_supported : 1; + u8 soft_reset_handshake_supported : 1; struct list_head scsi_device_list; spinlock_t scsi_device_list_lock; @@ -1094,6 +1157,7 @@ struct pqi_ctrl_info { int previous_num_interrupts; u32 previous_heartbeat_count; __le32 __iomem *heartbeat_counter; + u8 __iomem *soft_reset_status; struct timer_list heartbeat_timer; struct work_struct ctrl_offline_work; @@ -1105,6 +1169,10 @@ struct pqi_ctrl_info { struct list_head raid_bypass_retry_list; spinlock_t raid_bypass_retry_list_lock; struct work_struct raid_bypass_retry_work; + + struct pqi_ofa_memory *pqi_ofa_mem_virt_addr; + dma_addr_t pqi_ofa_mem_dma_handle; + void **pqi_ofa_chunk_virt_addr; }; enum pqi_ctrl_mode { diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index 1b0fa974b4a7..863bd0d0345c 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c @@ -74,6 +74,13 @@ static int pqi_aio_submit_io(struct pqi_ctrl_info *ctrl_info, struct scsi_cmnd *scmd, u32 aio_handle, u8 *cdb, unsigned int cdb_length, struct pqi_queue_group *queue_group, struct pqi_encryption_info *encryption_info, bool raid_bypass); +static void pqi_ofa_ctrl_quiesce(struct pqi_ctrl_info *ctrl_info); +static void pqi_ofa_ctrl_unquiesce(struct pqi_ctrl_info *ctrl_info); +static int pqi_ofa_ctrl_restart(struct pqi_ctrl_info *ctrl_info); +static void pqi_ofa_setup_host_buffer(struct pqi_ctrl_info *ctrl_info, + u32 bytes_requested); +static void pqi_ofa_free_host_buffer(struct pqi_ctrl_info *ctrl_info); +static int pqi_ofa_host_memory_update(struct pqi_ctrl_info *ctrl_info); static int pqi_device_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info, struct pqi_scsi_dev *device, unsigned long timeout_secs); @@ -115,6 +122,7 @@ static unsigned int pqi_supported_event_types[] = { PQI_EVENT_TYPE_HARDWARE, PQI_EVENT_TYPE_PHYSICAL_DEVICE, PQI_EVENT_TYPE_LOGICAL_DEVICE, + PQI_EVENT_TYPE_OFA, PQI_EVENT_TYPE_AIO_STATE_CHANGE, PQI_EVENT_TYPE_AIO_CONFIG_CHANGE, }; @@ -297,6 +305,21 @@ static inline bool pqi_device_in_reset(struct pqi_scsi_dev *device) return device->in_reset; } +static inline void pqi_ctrl_ofa_start(struct pqi_ctrl_info *ctrl_info) +{ + ctrl_info->in_ofa = true; +} + +static inline void pqi_ctrl_ofa_done(struct pqi_ctrl_info *ctrl_info) +{ + ctrl_info->in_ofa = false; +} + +static inline bool pqi_ctrl_in_ofa(struct pqi_ctrl_info *ctrl_info) +{ + return ctrl_info->in_ofa; +} + static inline void pqi_device_remove_start(struct pqi_scsi_dev *device) { device->in_remove = true; @@ -313,6 +336,8 @@ static inline void pqi_schedule_rescan_worker_with_delay( { if (pqi_ctrl_offline(ctrl_info)) return; + if (pqi_ctrl_in_ofa(ctrl_info)) + return; schedule_delayed_work(&ctrl_info->rescan_work, delay); } @@ -322,7 +347,7 @@ static inline void pqi_schedule_rescan_worker(struct pqi_ctrl_info *ctrl_info) pqi_schedule_rescan_worker_with_delay(ctrl_info, 0); } -#define PQI_RESCAN_WORK_DELAY (10 * HZ) +#define PQI_RESCAN_WORK_DELAY (10 * PQI_HZ) static inline void pqi_schedule_rescan_worker_delayed( struct pqi_ctrl_info *ctrl_info) @@ -343,6 +368,27 @@ static inline u32 pqi_read_heartbeat_counter(struct pqi_ctrl_info *ctrl_info) return readl(ctrl_info->heartbeat_counter); } +static inline u8 pqi_read_soft_reset_status(struct pqi_ctrl_info *ctrl_info) +{ + if (!ctrl_info->soft_reset_status) + return 0; + + return readb(ctrl_info->soft_reset_status); +} + +static inline void pqi_clear_soft_reset_status(struct pqi_ctrl_info *ctrl_info, + u8 clear) +{ + u8 status; + + if (!ctrl_info->soft_reset_status) + return; + + status = pqi_read_soft_reset_status(ctrl_info); + status &= ~clear; + writeb(status, ctrl_info->soft_reset_status); +} + static int pqi_map_single(struct pci_dev *pci_dev, struct pqi_sg_descriptor *sg_descriptor, void *buffer, size_t buffer_length, enum dma_data_direction data_direction) @@ -851,7 +897,7 @@ static int pqi_write_current_time_to_host_wellness( return rc; } -#define PQI_UPDATE_TIME_WORK_INTERVAL (24UL * 60 * 60 * HZ) +#define PQI_UPDATE_TIME_WORK_INTERVAL (24UL * 60 * 60 * PQI_HZ) static void pqi_update_time_worker(struct work_struct *work) { @@ -1819,6 +1865,9 @@ static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info, spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags); + if (pqi_ctrl_in_ofa(ctrl_info)) + pqi_ctrl_ofa_done(ctrl_info); + /* Remove all devices that have gone away. */ list_for_each_entry_safe(device, next, &delete_list, delete_list_entry) { @@ -2163,7 +2212,13 @@ static int pqi_scan_scsi_devices(struct pqi_ctrl_info *ctrl_info) static void pqi_scan_start(struct Scsi_Host *shost) { - pqi_scan_scsi_devices(shost_to_hba(shost)); + struct pqi_ctrl_info *ctrl_info; + + ctrl_info = shost_to_hba(shost); + if (pqi_ctrl_in_ofa(ctrl_info)) + return; + + pqi_scan_scsi_devices(ctrl_info); } /* Returns TRUE if scan is finished. */ @@ -2190,6 +2245,12 @@ static void pqi_wait_until_lun_reset_finished(struct pqi_ctrl_info *ctrl_info) mutex_unlock(&ctrl_info->lun_reset_mutex); } +static void pqi_wait_until_ofa_finished(struct pqi_ctrl_info *ctrl_info) +{ + mutex_lock(&ctrl_info->ofa_mutex); + mutex_unlock(&ctrl_info->ofa_mutex); +} + static inline void pqi_set_encryption_info( struct pqi_encryption_info *encryption_info, struct raid_map *raid_map, u64 first_block) @@ -2566,7 +2627,7 @@ static int pqi_wait_for_pqi_mode_ready(struct pqi_ctrl_info *ctrl_info) u8 status; pqi_registers = ctrl_info->pqi_registers; - timeout = (PQI_MODE_READY_TIMEOUT_SECS * HZ) + jiffies; + timeout = (PQI_MODE_READY_TIMEOUT_SECS * PQI_HZ) + jiffies; while (1) { signature = readq(&pqi_registers->signature); @@ -3005,6 +3066,111 @@ static void pqi_acknowledge_event(struct pqi_ctrl_info *ctrl_info, pqi_send_event_ack(ctrl_info, &request, sizeof(request)); } +#define PQI_SOFT_RESET_STATUS_TIMEOUT_SECS 30 +#define PQI_SOFT_RESET_STATUS_POLL_INTERVAL_SECS 1 + +static enum pqi_soft_reset_status pqi_poll_for_soft_reset_status( + struct pqi_ctrl_info *ctrl_info) +{ + unsigned long timeout; + u8 status; + + timeout = (PQI_SOFT_RESET_STATUS_TIMEOUT_SECS * PQI_HZ) + jiffies; + + while (1) { + status = pqi_read_soft_reset_status(ctrl_info); + if (status & PQI_SOFT_RESET_INITIATE) + return RESET_INITIATE_DRIVER; + + if (status & PQI_SOFT_RESET_ABORT) + return RESET_ABORT; + + if (time_after(jiffies, timeout)) { + dev_err(&ctrl_info->pci_dev->dev, + "timed out waiting for soft reset status\n"); + return RESET_TIMEDOUT; + } + + if (!sis_is_firmware_running(ctrl_info)) + return RESET_NORESPONSE; + + ssleep(PQI_SOFT_RESET_STATUS_POLL_INTERVAL_SECS); + } +} + +static void pqi_process_soft_reset(struct pqi_ctrl_info *ctrl_info, + enum pqi_soft_reset_status reset_status) +{ + int rc; + + switch (reset_status) { + case RESET_INITIATE_DRIVER: + /* fall through */ + case RESET_TIMEDOUT: + dev_info(&ctrl_info->pci_dev->dev, + "resetting controller %u\n", ctrl_info->ctrl_id); + sis_soft_reset(ctrl_info); + /* fall through */ + case RESET_INITIATE_FIRMWARE: + rc = pqi_ofa_ctrl_restart(ctrl_info); + pqi_ofa_free_host_buffer(ctrl_info); + dev_info(&ctrl_info->pci_dev->dev, + "Online Firmware Activation for controller %u: %s\n", + ctrl_info->ctrl_id, rc == 0 ? "SUCCESS" : "FAILED"); + break; + case RESET_ABORT: + pqi_ofa_ctrl_unquiesce(ctrl_info); + dev_info(&ctrl_info->pci_dev->dev, + "Online Firmware Activation for controller %u: %s\n", + ctrl_info->ctrl_id, "ABORTED"); + break; + case RESET_NORESPONSE: + pqi_ofa_free_host_buffer(ctrl_info); + pqi_take_ctrl_offline(ctrl_info); + break; + } +} + +static void pqi_ofa_process_event(struct pqi_ctrl_info *ctrl_info, + struct pqi_event *event) +{ + u16 event_id; + enum pqi_soft_reset_status status; + + event_id = get_unaligned_le16(&event->event_id); + + mutex_lock(&ctrl_info->ofa_mutex); + + if (event_id == PQI_EVENT_OFA_QUIESCE) { + dev_info(&ctrl_info->pci_dev->dev, + "Received Online Firmware Activation quiesce event for controller %u\n", + ctrl_info->ctrl_id); + pqi_ofa_ctrl_quiesce(ctrl_info); + pqi_acknowledge_event(ctrl_info, event); + if (ctrl_info->soft_reset_handshake_supported) { + status = pqi_poll_for_soft_reset_status(ctrl_info); + pqi_process_soft_reset(ctrl_info, status); + } else { + pqi_process_soft_reset(ctrl_info, + RESET_INITIATE_FIRMWARE); + } + + } else if (event_id == PQI_EVENT_OFA_MEMORY_ALLOCATION) { + pqi_acknowledge_event(ctrl_info, event); + pqi_ofa_setup_host_buffer(ctrl_info, + le32_to_cpu(event->ofa_bytes_requested)); + pqi_ofa_host_memory_update(ctrl_info); + } else if (event_id == PQI_EVENT_OFA_CANCELLED) { + pqi_ofa_free_host_buffer(ctrl_info); + pqi_acknowledge_event(ctrl_info, event); + dev_info(&ctrl_info->pci_dev->dev, + "Online Firmware Activation(%u) cancel reason : %u\n", + ctrl_info->ctrl_id, event->ofa_cancel_reason); + } + + mutex_unlock(&ctrl_info->ofa_mutex); +} + static void pqi_event_worker(struct work_struct *work) { unsigned int i; @@ -3024,6 +3190,11 @@ static void pqi_event_worker(struct work_struct *work) for (i = 0; i < PQI_NUM_SUPPORTED_EVENTS; i++) { if (event->pending) { event->pending = false; + if (event->event_type == PQI_EVENT_TYPE_OFA) { + pqi_ctrl_unbusy(ctrl_info); + pqi_ofa_process_event(ctrl_info, event); + return; + } pqi_acknowledge_event(ctrl_info, event); } event++; @@ -3033,7 +3204,7 @@ static void pqi_event_worker(struct work_struct *work) pqi_ctrl_unbusy(ctrl_info); } -#define PQI_HEARTBEAT_TIMER_INTERVAL (10 * HZ) +#define PQI_HEARTBEAT_TIMER_INTERVAL (10 * PQI_HZ) static void pqi_heartbeat_timer_handler(struct timer_list *t) { @@ -3102,6 +3273,24 @@ static inline bool pqi_is_supported_event(unsigned int event_type) return pqi_event_type_to_event_index(event_type) != -1; } +static void pqi_ofa_capture_event_payload(struct pqi_event *event, + struct pqi_event_response *response) +{ + u16 event_id; + + event_id = get_unaligned_le16(&event->event_id); + + if (event->event_type == PQI_EVENT_TYPE_OFA) { + if (event_id == PQI_EVENT_OFA_MEMORY_ALLOCATION) { + event->ofa_bytes_requested = + response->data.ofa_memory_allocation.bytes_requested; + } else if (event_id == PQI_EVENT_OFA_CANCELLED) { + event->ofa_cancel_reason = + response->data.ofa_cancelled.reason; + } + } +} + static unsigned int pqi_process_event_intr(struct pqi_ctrl_info *ctrl_info) { unsigned int num_events; @@ -3136,6 +3325,7 @@ static unsigned int pqi_process_event_intr(struct pqi_ctrl_info *ctrl_info) event->event_id = response->event_id; event->additional_event_id = response->additional_event_id; + pqi_ofa_capture_event_payload(event, response); } } @@ -3573,7 +3763,7 @@ static int pqi_alloc_admin_queues(struct pqi_ctrl_info *ctrl_info) return 0; } -#define PQI_ADMIN_QUEUE_CREATE_TIMEOUT_JIFFIES HZ +#define PQI_ADMIN_QUEUE_CREATE_TIMEOUT_JIFFIES PQI_HZ #define PQI_ADMIN_QUEUE_CREATE_POLL_INTERVAL_MSECS 1 static int pqi_create_admin_queues(struct pqi_ctrl_info *ctrl_info) @@ -3666,7 +3856,7 @@ static int pqi_poll_for_admin_response(struct pqi_ctrl_info *ctrl_info, admin_queues = &ctrl_info->admin_queues; oq_ci = admin_queues->oq_ci_copy; - timeout = (PQI_ADMIN_REQUEST_TIMEOUT_SECS * HZ) + jiffies; + timeout = (PQI_ADMIN_REQUEST_TIMEOUT_SECS * PQI_HZ) + jiffies; while (1) { oq_pi = readl(admin_queues->oq_pi); @@ -3781,7 +3971,7 @@ static int pqi_wait_for_completion_io(struct pqi_ctrl_info *ctrl_info, while (1) { if (wait_for_completion_io_timeout(wait, - PQI_WAIT_FOR_COMPLETION_IO_TIMEOUT_SECS * HZ)) { + PQI_WAIT_FOR_COMPLETION_IO_TIMEOUT_SECS * PQI_HZ)) { rc = 0; break; } @@ -5154,7 +5344,8 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost, } pqi_ctrl_busy(ctrl_info); - if (pqi_ctrl_blocked(ctrl_info) || pqi_device_in_reset(device)) { + if (pqi_ctrl_blocked(ctrl_info) || pqi_device_in_reset(device) || + pqi_ctrl_in_ofa(ctrl_info)) { rc = SCSI_MLQUEUE_HOST_BUSY; goto out; } @@ -5299,12 +5490,48 @@ static void pqi_fail_io_queued_for_device(struct pqi_ctrl_info *ctrl_info, } } +static void pqi_fail_io_queued_for_all_devices(struct pqi_ctrl_info *ctrl_info) +{ + unsigned int i; + unsigned int path; + struct pqi_queue_group *queue_group; + unsigned long flags; + struct pqi_io_request *io_request; + struct pqi_io_request *next; + struct scsi_cmnd *scmd; + + for (i = 0; i < ctrl_info->num_queue_groups; i++) { + queue_group = &ctrl_info->queue_groups[i]; + + for (path = 0; path < 2; path++) { + spin_lock_irqsave(&queue_group->submit_lock[path], + flags); + + list_for_each_entry_safe(io_request, next, + &queue_group->request_list[path], + request_list_entry) { + + scmd = io_request->scmd; + if (!scmd) + continue; + + list_del(&io_request->request_list_entry); + set_host_byte(scmd, DID_RESET); + pqi_scsi_done(scmd); + } + + spin_unlock_irqrestore( + &queue_group->submit_lock[path], flags); + } + } +} + static int pqi_device_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info, struct pqi_scsi_dev *device, unsigned long timeout_secs) { unsigned long timeout; - timeout = (timeout_secs * HZ) + jiffies; + timeout = (timeout_secs * PQI_HZ) + jiffies; while (atomic_read(&device->scsi_cmds_outstanding)) { pqi_check_ctrl_health(ctrl_info); @@ -5323,12 +5550,15 @@ static int pqi_device_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info, return 0; } -static int pqi_ctrl_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info) +static int pqi_ctrl_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info, + unsigned long timeout_secs) { bool io_pending; unsigned long flags; + unsigned long timeout; struct pqi_scsi_dev *device; + timeout = (timeout_secs * PQI_HZ) + jiffies; while (1) { io_pending = false; @@ -5350,6 +5580,13 @@ static int pqi_ctrl_wait_for_pending_io(struct pqi_ctrl_info *ctrl_info) if (pqi_ctrl_offline(ctrl_info)) return -ENXIO; + if (timeout_secs != NO_TIMEOUT) { + if (time_after(jiffies, timeout)) { + dev_err(&ctrl_info->pci_dev->dev, + "timed out waiting for pending IO\n"); + return -ETIMEDOUT; + } + } usleep_range(1000, 2000); } @@ -5373,7 +5610,7 @@ static int pqi_wait_for_lun_reset_completion(struct pqi_ctrl_info *ctrl_info, while (1) { if (wait_for_completion_io_timeout(wait, - PQI_LUN_RESET_TIMEOUT_SECS * HZ)) { + PQI_LUN_RESET_TIMEOUT_SECS * PQI_HZ)) { rc = 0; break; } @@ -5428,11 +5665,12 @@ static int pqi_lun_reset(struct pqi_ctrl_info *ctrl_info, #define PQI_LUN_RESET_RETRY_INTERVAL_MSECS 10000 /* Performs a reset at the LUN level. */ -static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info, +static int _pqi_device_reset(struct pqi_ctrl_info *ctrl_info, struct pqi_scsi_dev *device) { int rc; unsigned int retries; + unsigned long timeout_secs; for (retries = 0;;) { rc = pqi_lun_reset(ctrl_info, device); @@ -5441,13 +5679,38 @@ static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info, break; msleep(PQI_LUN_RESET_RETRY_INTERVAL_MSECS); } - if (rc == 0) - rc = pqi_device_wait_for_pending_io(ctrl_info, - device, NO_TIMEOUT); + timeout_secs = rc ? PQI_LUN_RESET_TIMEOUT_SECS : NO_TIMEOUT; + + rc |= pqi_device_wait_for_pending_io(ctrl_info, device, timeout_secs); return rc == 0 ? SUCCESS : FAILED; } +static int pqi_device_reset(struct pqi_ctrl_info *ctrl_info, + struct pqi_scsi_dev *device) +{ + int rc; + + mutex_lock(&ctrl_info->lun_reset_mutex); + + pqi_ctrl_block_requests(ctrl_info); + pqi_ctrl_wait_until_quiesced(ctrl_info); + pqi_fail_io_queued_for_device(ctrl_info, device); + rc = pqi_wait_until_inbound_queues_empty(ctrl_info); + pqi_device_reset_start(device); + pqi_ctrl_unblock_requests(ctrl_info); + + if (rc) + rc = FAILED; + else + rc = _pqi_device_reset(ctrl_info, device); + + pqi_device_reset_done(device); + + mutex_unlock(&ctrl_info->lun_reset_mutex); + return rc; +} + static int pqi_eh_device_reset_handler(struct scsi_cmnd *scmd) { int rc; @@ -5465,28 +5728,16 @@ static int pqi_eh_device_reset_handler(struct scsi_cmnd *scmd) pqi_check_ctrl_health(ctrl_info); if (pqi_ctrl_offline(ctrl_info)) { + dev_err(&ctrl_info->pci_dev->dev, + "controller %u offlined - cannot send device reset\n", + ctrl_info->ctrl_id); rc = FAILED; goto out; } - mutex_lock(&ctrl_info->lun_reset_mutex); - - pqi_ctrl_block_requests(ctrl_info); - pqi_ctrl_wait_until_quiesced(ctrl_info); - pqi_fail_io_queued_for_device(ctrl_info, device); - rc = pqi_wait_until_inbound_queues_empty(ctrl_info); - pqi_device_reset_start(device); - pqi_ctrl_unblock_requests(ctrl_info); - - if (rc) - rc = FAILED; - else - rc = pqi_device_reset(ctrl_info, device); - - pqi_device_reset_done(device); - - mutex_unlock(&ctrl_info->lun_reset_mutex); + pqi_wait_until_ofa_finished(ctrl_info); + rc = pqi_device_reset(ctrl_info, device); out: dev_err(&ctrl_info->pci_dev->dev, "reset of scsi %d:%d:%d:%d: %s\n", @@ -5809,6 +6060,9 @@ static int pqi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) ctrl_info = shost_to_hba(sdev->host); + if (pqi_ctrl_in_ofa(ctrl_info)) + return -EBUSY; + switch (cmd) { case CCISS_DEREGDISK: case CCISS_REGNEWDISK: @@ -6471,6 +6725,11 @@ static struct pqi_firmware_feature pqi_firmware_features[] = { .feature_bit = PQI_FIRMWARE_FEATURE_SMP, .feature_status = pqi_firmware_feature_status, }, + { + .feature_name = "New Soft Reset Handshake", + .feature_bit = PQI_FIRMWARE_FEATURE_SOFT_RESET_HANDSHAKE, + .feature_status = pqi_firmware_feature_status, + }, }; static void pqi_process_firmware_features( @@ -6523,13 +6782,19 @@ static void pqi_process_firmware_features( return; } + ctrl_info->soft_reset_handshake_supported = false; for (i = 0; i < ARRAY_SIZE(pqi_firmware_features); i++) { if (!pqi_firmware_features[i].supported) continue; if (pqi_is_firmware_feature_enabled(firmware_features, firmware_features_iomem_addr, - pqi_firmware_features[i].feature_bit)) + pqi_firmware_features[i].feature_bit)) { pqi_firmware_features[i].enabled = true; + if (pqi_firmware_features[i].feature_bit == + PQI_FIRMWARE_FEATURE_SOFT_RESET_HANDSHAKE) + ctrl_info->soft_reset_handshake_supported = + true; + } pqi_firmware_feature_update(ctrl_info, &pqi_firmware_features[i]); } @@ -6610,6 +6875,13 @@ static int pqi_process_config_table(struct pqi_ctrl_info *ctrl_info) struct pqi_config_table_heartbeat, heartbeat_counter); break; + case PQI_CONFIG_TABLE_SECTION_SOFT_RESET: + ctrl_info->soft_reset_status = + table_iomem_addr + + section_offset + + offsetof(struct pqi_config_table_soft_reset, + soft_reset_status); + break; } section_offset = @@ -6892,6 +7164,24 @@ static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info) if (rc) return rc; + /* + * Get the controller properties. This allows us to determine + * whether or not it supports PQI mode. + */ + rc = sis_get_ctrl_properties(ctrl_info); + if (rc) { + dev_err(&ctrl_info->pci_dev->dev, + "error obtaining controller properties\n"); + return rc; + } + + rc = sis_get_pqi_capabilities(ctrl_info); + if (rc) { + dev_err(&ctrl_info->pci_dev->dev, + "error obtaining controller capabilities\n"); + return rc; + } + /* * If the function we are about to call succeeds, the * controller will transition from legacy SIS mode @@ -6932,9 +7222,14 @@ static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info) pqi_change_irq_mode(ctrl_info, IRQ_MODE_MSIX); ctrl_info->controller_online = true; - pqi_start_heartbeat_timer(ctrl_info); pqi_ctrl_unblock_requests(ctrl_info); + rc = pqi_process_config_table(ctrl_info); + if (rc) + return rc; + + pqi_start_heartbeat_timer(ctrl_info); + rc = pqi_enable_events(ctrl_info); if (rc) { dev_err(&ctrl_info->pci_dev->dev, @@ -6942,6 +7237,13 @@ static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info) return rc; } + rc = pqi_get_ctrl_firmware_version(ctrl_info); + if (rc) { + dev_err(&ctrl_info->pci_dev->dev, + "error obtaining firmware version\n"); + return rc; + } + rc = pqi_set_diag_rescan(ctrl_info); if (rc) { dev_err(&ctrl_info->pci_dev->dev, @@ -7059,6 +7361,7 @@ static struct pqi_ctrl_info *pqi_alloc_ctrl_info(int numa_node) mutex_init(&ctrl_info->scan_mutex); mutex_init(&ctrl_info->lun_reset_mutex); + mutex_init(&ctrl_info->ofa_mutex); INIT_LIST_HEAD(&ctrl_info->scsi_device_list); spin_lock_init(&ctrl_info->scsi_device_list_lock); @@ -7135,6 +7438,217 @@ static void pqi_remove_ctrl(struct pqi_ctrl_info *ctrl_info) pqi_free_ctrl_resources(ctrl_info); } +static void pqi_ofa_ctrl_quiesce(struct pqi_ctrl_info *ctrl_info) +{ + pqi_cancel_update_time_worker(ctrl_info); + pqi_cancel_rescan_worker(ctrl_info); + pqi_wait_until_lun_reset_finished(ctrl_info); + pqi_wait_until_scan_finished(ctrl_info); + pqi_ctrl_ofa_start(ctrl_info); + pqi_ctrl_block_requests(ctrl_info); + pqi_ctrl_wait_until_quiesced(ctrl_info); + pqi_ctrl_wait_for_pending_io(ctrl_info, PQI_PENDING_IO_TIMEOUT_SECS); + pqi_fail_io_queued_for_all_devices(ctrl_info); + pqi_wait_until_inbound_queues_empty(ctrl_info); + pqi_stop_heartbeat_timer(ctrl_info); + ctrl_info->pqi_mode_enabled = false; + pqi_save_ctrl_mode(ctrl_info, SIS_MODE); +} + +static void pqi_ofa_ctrl_unquiesce(struct pqi_ctrl_info *ctrl_info) +{ + pqi_ofa_free_host_buffer(ctrl_info); + ctrl_info->pqi_mode_enabled = true; + pqi_save_ctrl_mode(ctrl_info, PQI_MODE); + ctrl_info->controller_online = true; + pqi_ctrl_unblock_requests(ctrl_info); + pqi_start_heartbeat_timer(ctrl_info); + pqi_schedule_update_time_worker(ctrl_info); + pqi_clear_soft_reset_status(ctrl_info, + PQI_SOFT_RESET_ABORT); + pqi_scan_scsi_devices(ctrl_info); +} + +static int pqi_ofa_alloc_mem(struct pqi_ctrl_info *ctrl_info, + u32 total_size, u32 chunk_size) +{ + u32 sg_count; + u32 size; + int i; + struct pqi_sg_descriptor *mem_descriptor = NULL; + struct device *dev; + struct pqi_ofa_memory *ofap; + + dev = &ctrl_info->pci_dev->dev; + + sg_count = (total_size + chunk_size - 1); + do_div(sg_count, chunk_size); + + ofap = ctrl_info->pqi_ofa_mem_virt_addr; + + if (sg_count*chunk_size < total_size) + goto out; + + ctrl_info->pqi_ofa_chunk_virt_addr = + kcalloc(sg_count, sizeof(void *), GFP_KERNEL); + if (!ctrl_info->pqi_ofa_chunk_virt_addr) + goto out; + + for (size = 0, i = 0; size < total_size; size += chunk_size, i++) { + dma_addr_t dma_handle; + + ctrl_info->pqi_ofa_chunk_virt_addr[i] = + dma_zalloc_coherent(dev, chunk_size, &dma_handle, + GFP_KERNEL); + + if (!ctrl_info->pqi_ofa_chunk_virt_addr[i]) + break; + + mem_descriptor = &ofap->sg_descriptor[i]; + put_unaligned_le64 ((u64) dma_handle, &mem_descriptor->address); + put_unaligned_le32 (chunk_size, &mem_descriptor->length); + } + + if (!size || size < total_size) + goto out_free_chunks; + + put_unaligned_le32(CISS_SG_LAST, &mem_descriptor->flags); + put_unaligned_le16(sg_count, &ofap->num_memory_descriptors); + put_unaligned_le32(size, &ofap->bytes_allocated); + + return 0; + +out_free_chunks: + while (--i >= 0) { + mem_descriptor = &ofap->sg_descriptor[i]; + dma_free_coherent(dev, chunk_size, + ctrl_info->pqi_ofa_chunk_virt_addr[i], + get_unaligned_le64(&mem_descriptor->address)); + } + kfree(ctrl_info->pqi_ofa_chunk_virt_addr); + +out: + put_unaligned_le32 (0, &ofap->bytes_allocated); + return -ENOMEM; +} + +static int pqi_ofa_alloc_host_buffer(struct pqi_ctrl_info *ctrl_info) +{ + u32 total_size; + u32 min_chunk_size; + u32 chunk_sz; + + total_size = le32_to_cpu( + ctrl_info->pqi_ofa_mem_virt_addr->bytes_allocated); + min_chunk_size = total_size / PQI_OFA_MAX_SG_DESCRIPTORS; + + for (chunk_sz = total_size; chunk_sz >= min_chunk_size; chunk_sz /= 2) + if (!pqi_ofa_alloc_mem(ctrl_info, total_size, chunk_sz)) + return 0; + + return -ENOMEM; +} + +static void pqi_ofa_setup_host_buffer(struct pqi_ctrl_info *ctrl_info, + u32 bytes_requested) +{ + struct pqi_ofa_memory *pqi_ofa_memory; + struct device *dev; + + dev = &ctrl_info->pci_dev->dev; + pqi_ofa_memory = dma_zalloc_coherent(dev, + PQI_OFA_MEMORY_DESCRIPTOR_LENGTH, + &ctrl_info->pqi_ofa_mem_dma_handle, + GFP_KERNEL); + + if (!pqi_ofa_memory) + return; + + put_unaligned_le16(PQI_OFA_VERSION, &pqi_ofa_memory->version); + memcpy(&pqi_ofa_memory->signature, PQI_OFA_SIGNATURE, + sizeof(pqi_ofa_memory->signature)); + pqi_ofa_memory->bytes_allocated = cpu_to_le32(bytes_requested); + + ctrl_info->pqi_ofa_mem_virt_addr = pqi_ofa_memory; + + if (pqi_ofa_alloc_host_buffer(ctrl_info) < 0) { + dev_err(dev, "Failed to allocate host buffer of size = %u", + bytes_requested); + } +} + +static void pqi_ofa_free_host_buffer(struct pqi_ctrl_info *ctrl_info) +{ + int i; + struct pqi_sg_descriptor *mem_descriptor; + struct pqi_ofa_memory *ofap; + + ofap = ctrl_info->pqi_ofa_mem_virt_addr; + + if (!ofap) + return; + + if (!ofap->bytes_allocated) + goto out; + + mem_descriptor = ofap->sg_descriptor; + + for (i = 0; i < get_unaligned_le16(&ofap->num_memory_descriptors); + i++) { + dma_free_coherent(&ctrl_info->pci_dev->dev, + get_unaligned_le32(&mem_descriptor[i].length), + ctrl_info->pqi_ofa_chunk_virt_addr[i], + get_unaligned_le64(&mem_descriptor[i].address)); + } + kfree(ctrl_info->pqi_ofa_chunk_virt_addr); + +out: + dma_free_coherent(&ctrl_info->pci_dev->dev, + PQI_OFA_MEMORY_DESCRIPTOR_LENGTH, ofap, + ctrl_info->pqi_ofa_mem_dma_handle); + ctrl_info->pqi_ofa_mem_virt_addr = NULL; +} + +static int pqi_ofa_host_memory_update(struct pqi_ctrl_info *ctrl_info) +{ + struct pqi_vendor_general_request request; + size_t size; + struct pqi_ofa_memory *ofap; + + memset(&request, 0, sizeof(request)); + + ofap = ctrl_info->pqi_ofa_mem_virt_addr; + + request.header.iu_type = PQI_REQUEST_IU_VENDOR_GENERAL; + put_unaligned_le16(sizeof(request) - PQI_REQUEST_HEADER_LENGTH, + &request.header.iu_length); + put_unaligned_le16(PQI_VENDOR_GENERAL_HOST_MEMORY_UPDATE, + &request.function_code); + + if (ofap) { + size = offsetof(struct pqi_ofa_memory, sg_descriptor) + + get_unaligned_le16(&ofap->num_memory_descriptors) * + sizeof(struct pqi_sg_descriptor); + + put_unaligned_le64((u64)ctrl_info->pqi_ofa_mem_dma_handle, + &request.data.ofa_memory_allocation.buffer_address); + put_unaligned_le32(size, + &request.data.ofa_memory_allocation.buffer_length); + + } + + return pqi_submit_raid_request_synchronous(ctrl_info, &request.header, + 0, NULL, NO_TIMEOUT); +} + +#define PQI_POST_RESET_DELAY_B4_MSGU_READY 5000 + +static int pqi_ofa_ctrl_restart(struct pqi_ctrl_info *ctrl_info) +{ + msleep(PQI_POST_RESET_DELAY_B4_MSGU_READY); + return pqi_ctrl_init_resume(ctrl_info); +} + static void pqi_perform_lockup_action(void) { switch (pqi_lockup_action) { @@ -7354,11 +7868,12 @@ static __maybe_unused int pqi_suspend(struct pci_dev *pci_dev, pm_message_t stat pqi_cancel_rescan_worker(ctrl_info); pqi_wait_until_scan_finished(ctrl_info); pqi_wait_until_lun_reset_finished(ctrl_info); + pqi_wait_until_ofa_finished(ctrl_info); pqi_flush_cache(ctrl_info, SUSPEND); pqi_ctrl_block_requests(ctrl_info); pqi_ctrl_wait_until_quiesced(ctrl_info); pqi_wait_until_inbound_queues_empty(ctrl_info); - pqi_ctrl_wait_for_pending_io(ctrl_info); + pqi_ctrl_wait_for_pending_io(ctrl_info, NO_TIMEOUT); pqi_stop_heartbeat_timer(ctrl_info); if (state.event == PM_EVENT_FREEZE) diff --git a/drivers/scsi/smartpqi/smartpqi_sis.c b/drivers/scsi/smartpqi/smartpqi_sis.c index 9d3043df22af..dcd11c6418cc 100644 --- a/drivers/scsi/smartpqi/smartpqi_sis.c +++ b/drivers/scsi/smartpqi/smartpqi_sis.c @@ -34,6 +34,7 @@ #define SIS_REENABLE_SIS_MODE 0x1 #define SIS_ENABLE_MSIX 0x40 #define SIS_ENABLE_INTX 0x80 +#define SIS_SOFT_RESET 0x100 #define SIS_CMD_READY 0x200 #define SIS_TRIGGER_SHUTDOWN 0x800000 #define SIS_PQI_RESET_QUIESCE 0x1000000 @@ -90,7 +91,7 @@ static int sis_wait_for_ctrl_ready_with_timeout(struct pqi_ctrl_info *ctrl_info, unsigned long timeout; u32 status; - timeout = (timeout_secs * HZ) + jiffies; + timeout = (timeout_secs * PQI_HZ) + jiffies; while (1) { status = readl(&ctrl_info->registers->sis_firmware_status); @@ -202,7 +203,7 @@ static int sis_send_sync_cmd(struct pqi_ctrl_info *ctrl_info, * the top of the loop in order to give the controller time to start * processing the command before we start polling. */ - timeout = (SIS_CMD_COMPLETE_TIMEOUT_SECS * HZ) + jiffies; + timeout = (SIS_CMD_COMPLETE_TIMEOUT_SECS * PQI_HZ) + jiffies; while (1) { msleep(SIS_CMD_COMPLETE_POLL_INTERVAL_MSECS); doorbell = readl(®isters->sis_ctrl_to_host_doorbell); @@ -348,7 +349,7 @@ static int sis_wait_for_doorbell_bit_to_clear( u32 doorbell_register; unsigned long timeout; - timeout = (SIS_DOORBELL_BIT_CLEAR_TIMEOUT_SECS * HZ) + jiffies; + timeout = (SIS_DOORBELL_BIT_CLEAR_TIMEOUT_SECS * PQI_HZ) + jiffies; while (1) { doorbell_register = @@ -420,6 +421,12 @@ u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info) return readl(&ctrl_info->registers->sis_driver_scratch); } +void sis_soft_reset(struct pqi_ctrl_info *ctrl_info) +{ + writel(SIS_SOFT_RESET, + &ctrl_info->registers->sis_host_to_ctrl_doorbell); +} + static void __attribute__((unused)) verify_structures(void) { BUILD_BUG_ON(offsetof(struct sis_base_struct, diff --git a/drivers/scsi/smartpqi/smartpqi_sis.h b/drivers/scsi/smartpqi/smartpqi_sis.h index 2bf889dbf5ab..d018cb9c3f82 100644 --- a/drivers/scsi/smartpqi/smartpqi_sis.h +++ b/drivers/scsi/smartpqi/smartpqi_sis.h @@ -33,5 +33,6 @@ int sis_pqi_reset_quiesce(struct pqi_ctrl_info *ctrl_info); int sis_reenable_sis_mode(struct pqi_ctrl_info *ctrl_info); void sis_write_driver_scratch(struct pqi_ctrl_info *ctrl_info, u32 value); u32 sis_read_driver_scratch(struct pqi_ctrl_info *ctrl_info); +void sis_soft_reset(struct pqi_ctrl_info *ctrl_info); #endif /* _SMARTPQI_SIS_H */ From patchwork Tue Dec 18 23:39:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Don Brace X-Patchwork-Id: 10736605 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 94943924 for ; Tue, 18 Dec 2018 23:42:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 85EDD2B024 for ; Tue, 18 Dec 2018 23:42:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8460A2B02F; Tue, 18 Dec 2018 23:42:12 +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,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 1DC932B024 for ; Tue, 18 Dec 2018 23:42:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727073AbeLRXmL (ORCPT ); Tue, 18 Dec 2018 18:42:11 -0500 Received: from mail-eopbgr690056.outbound.protection.outlook.com ([40.107.69.56]:48988 "EHLO NAM04-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727319AbeLRXmL (ORCPT ); Tue, 18 Dec 2018 18:42:11 -0500 Received: from BL2PR19CA0041.namprd19.prod.outlook.com (2603:10b6:201:f::51) by DM5PR19MB1628.namprd19.prod.outlook.com (2603:10b6:3:150::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1446.17; Tue, 18 Dec 2018 23:39:16 +0000 Received: from BN1BFFO11FD019.protection.gbl (2a01:111:f400:7c10::1:131) by BL2PR19CA0041.outlook.office365.com (2603:10b6:201:f::51) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1446.17 via Frontend Transport; Tue, 18 Dec 2018 23:39:16 +0000 Authentication-Results: spf=pass (sender IP is 208.19.99.223) smtp.mailfrom=microsemi.com; linux.vnet.ibm.com; dkim=none (message not signed) header.d=none;linux.vnet.ibm.com; dmarc=bestguesspass action=none header.from=microsemi.com; Received-SPF: Pass (protection.outlook.com: domain of microsemi.com designates 208.19.99.223 as permitted sender) receiver=protection.outlook.com; client-ip=208.19.99.223; helo=AUSMBX3.microsemi.net; Received: from AUSMBX3.microsemi.net (208.19.99.223) by BN1BFFO11FD019.mail.protection.outlook.com (10.58.144.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.1446.11 via Frontend Transport; Tue, 18 Dec 2018 23:39:15 +0000 Received: from AUSMBX3.microsemi.net (10.201.34.33) by AUSMBX3.microsemi.net (10.201.34.33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.1531.3; Tue, 18 Dec 2018 17:39:14 -0600 Received: from [127.0.1.1] (10.238.32.34) by ausmbx3.microsemi.net (10.201.34.33) with Microsoft SMTP Server id 15.1.1531.3 via Frontend Transport; Tue, 18 Dec 2018 17:39:14 -0600 Subject: [PATCH 3/3] smartpqi: update driver version From: Don Brace To: , , , , , , , , , , , CC: Date: Tue, 18 Dec 2018 17:39:13 -0600 Message-ID: <154517635390.17054.16095673043284223108.stgit@brunhilda> In-Reply-To: <154517619004.17054.10951702672567884152.stgit@brunhilda> References: <154517619004.17054.10951702672567884152.stgit@brunhilda> User-Agent: StGit/0.19-dirty MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:208.19.99.223;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(7916004)(396003)(39850400004)(346002)(136003)(376002)(2980300002)(199004)(189003)(23676004)(33896004)(230700001)(97736004)(2486003)(9686003)(76176011)(77096007)(26005)(5660300001)(186003)(106466001)(103116003)(478600001)(33716001)(68736007)(58126008)(110136005)(16576012)(316002)(106002)(4326008)(8676002)(50466002)(81156014)(81166006)(53936002)(446003)(11346002)(44832011)(8936002)(476003)(486006)(69596002)(126002)(356004)(2906002)(2201001)(575784001)(86362001)(305945005)(336012)(47776003)(921003)(2101003)(83996005)(1121003);DIR:OUT;SFP:1101;SCL:1;SRVR:DM5PR19MB1628;H:AUSMBX3.microsemi.net;FPR:;SPF:Pass;LANG:en;PTR:InfoDomainNonexistent;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;BN1BFFO11FD019;1:Kz4LdqhBBUdzknOBtDCPSwO5MUO0xyRIQz3ijYm5VlCTRZE2uT8kr043UcZCCnG1SyjtbLIA2d3+S+EfIbvpetrGoqPx3+yLcEGjHAfXiriXNuCQQw2erwbNrR812mBT X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: fc249612-d450-42ee-9b6a-08d6654205bc X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(5600074)(711020)(4608076)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060);SRVR:DM5PR19MB1628; X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1628;3:yjDpAp3Xkd31I4PXW0qBQnbgiLACrGtV37Qtg0VAne9MC7SsFkp0dhMjLjeAZC40o2eJMOYKd2IyK0sTEBigNUvVUDEpNqyVkXXWQDUhRrraZDuUTpmxFteGTr3m/E+K6Pm0k3pxgR3TckYGzgeBkA0o/Xi2RCNrNvpO6pJZ7BVbD7sSidyYN5qcknCzMS6LOqDuMA6CSHU8O9CFUKrGe/T1PXE09M/ONgg31AUC26BxfzcYBgOb5YmO7wm7Fp6e7g9wOEBWaY02wJPNZvGBtKHgmimHx2kvX8XxnZujoLluP2vnwiq7AXHDtCMYSFq4FPTG17TISKiQ3fWXkIJYaKZPW7OLo8aH2TqiWztwXAo=;25:QBifDtIMq6Gyw59mXRSeLJXXrJQ/6COB4H8PIWwD5xzByi6G2GGDCfXHMYDhi2TopX63xujvjkzchVltyvXw4qVG+KeONW7gEdIHyU/nxjVPX/WmdNsrL7KoKg7qeu7fviDVP/MtcuKQNH9vBW9dg0Yq+Kz84LsYOszbPf3ykF3nswZXDMgUWdFZ+GnOg1qp8iFfIZpH8BXBBaqeLed8Z7wVKpzhhvCOnlIP0cMlehSIIMb3eN7lf9fqfJQJt7ZG6rpokHYJOqgr4HCGEQdlncLmz3AY/cWtAhDwV6hhAqX7JaIcYyrWYKc4L7bsAlt1sVhEiZPqbpS+JWzf3ZLHCQ== X-MS-TrafficTypeDiagnostic: DM5PR19MB1628: X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1628;31:YNSq6ucSKZaCvos3ke6LieyOPXeJ65K5FgGRpFgHQzd9wxr3ecIRGTyWH8+EiQPyHAZYI6O2wQhknjhCf1vCzFvAd1G44y8BSBckOqj1TVWF1ovh3kBbLcHaBIGN/S+0bFs4TG4x8nw2T1SQm0qMjUuWb/x2QL6yNNWfOfJ6mLSAF96czD2Hn6FWhjEoMpayPPdczyd3zm66agyaCOvMs2nwl9adr6duag18zO1FHu0=;20:pkskDaGidsOPLbMD0GvSanrKSvsCqeyOZ8weu8Ry3oxU1Vh8R+7IOitHhzjKRwxVTI7ZoWd8ooQvmDfNJnh3BMRXZ1o3yXxjk2FCLjsJ1Y8Fe3/mG99QiZuAnKb1tQCXwVSS+eYLfOUN1CKCr6DecNo+QDxqJJiWsIq7CGYTt5shsGpENXlZR2EYC8qRHE2/606zC/glCH9548W2ukDIOhhHjP623nvRP0WQExaAAUemtwhKKjdMpRxmD4Lwsl1kITNGL031V3AxkjmuEwYoRtym4vPjJ+X8sNKDBks+cpvxgCM/DzS+UYIAirl5nCrozKY4PiHSOLYkmbcnXscsf6TQ3cMEZkr4tA8CpRiBw2zaZgD2YqN6BZ9eZP/5WI9kQAX33doz2Bp9pUPd2u/J7k4bqVolIVzfMW2PkSxz+NGmUz/DwD7w+qlZQQUyp+yf11uapbUT4fHcldRzfS4NkH2x1QMa6RRPvqT9CAvV2pilh4/B9OPi+EbBfIqA1iNT X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(8211001083)(3230021)(999002)(6040522)(2401047)(5005006)(8121501046)(93006095)(93004095)(3231475)(944501520)(52105112)(10201501046)(3002001)(6055026)(148016)(149066)(150057)(6041310)(20161123562045)(20161123564045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(201708071742011)(7699051)(76991095);SRVR:DM5PR19MB1628;BCL:0;PCL:0;RULEID:;SRVR:DM5PR19MB1628; X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1628;4:ZEjmbAY5fWLZYaMTvFo7KGaHJMnWBHfQoIKuaM4fOiNY/GfCTKWSI1kCpr5SSXYxCi2EWjn+bW+97IJUmhvid4IaG42t5C5/3Aycpjnaksehw1FZg50cu0Yzx41J/oLtz4RZTEFZmOpjEgOupV3MZNd+SMlCiwHP128+ensmR8jU3/SGMFJHuqsVk7NN9aWTOTT0nSKoPeAKvmyoTGjihZGIg/8+jyHfl6BEMqT6vGoktSbN99QhJCVdIyOzL+JeK7ddv4j/NcMwyvrIgnDN3Q== X-Forefront-PRVS: 08902E536D X-Microsoft-Exchange-Diagnostics: =?utf-8?q?1=3BDM5PR19MB1628=3B23=3AHJvG9BY?= =?utf-8?q?EI0uN9B9HvzCwoLxBIooYC5Rcg1Sqbcs2X9OzhyYPTwjw5IFyUS+GlwweiyeDzAeg?= =?utf-8?q?931oZW1/WHt6oRpDUHopx6LHYotekdkHgaahL+On0Ew2L9XCycT6xvKuygSRZsmmm?= =?utf-8?q?86fVauqGPKbiHJ03cN0ivvQTB8AyK655Q3PktKyP+MGvmhqZZSeMaw88hqthmbvMi?= =?utf-8?q?WfAfLOdUiYLtdfjocf5LBM6eH1sp5qlwuBvwz3PoaRJ5hRfNr5E3bLB4NAY40N9YN?= =?utf-8?q?J1DoLPkiUO/l0Rq7e4sjjpCo9w7ZVUTCE1+d6eySspsbioRrSoC9gSk/Tg8NfktyM?= =?utf-8?q?S9qdw6flvmR4DXmyZGWaO2c+ke2jkmQJ6Oxc1jBu1OVDde0q66eCL7IfmNRa5JKrf?= =?utf-8?q?5+XQ/GGI/elFoB8sOsk0fJYdHK8Na4f9qNpwMfiJQtJc9PVLPrn1xJp/MWSKtTpqZ?= =?utf-8?q?Ol3rx1KSG5y+fWIid164B9ll17r65ooWQnjmrTsytpEnZbv4PnKB7eU5cBc5AtklA?= =?utf-8?q?OnY59wy7Mny1XflbpkF2BVOvBcuTHBO0Vd+h/gQBBTWCobB0fWU9IICATzc71cGIg?= =?utf-8?q?EXBxTb0RUZUTICziDbahvYI+q055i/7Pskh+vzUl+SPdnJrDXTzKjS4vOSuH726jI?= =?utf-8?q?2BBt1zHj8jN1WwiGsXGI0b0ruoUUj3xq+ZLqQa87GEDfin4Ql4xJUu36/GiK+rItj?= =?utf-8?q?PmA4WawPNvr+i8vcuygvlrLrq81e43uZOXfWWvV6MEoRITyg3f1VRU1DpF4xPcfdU?= =?utf-8?q?eKdn3cce0b5rh2FwOnpz9I7Rgzv/mvripdIy6tsGBD7EWS2kPwq2l/p2YwSu06zRq?= =?utf-8?q?/xuAVlCKbpvvkgGaIEb9eA2PnRPWR4unlC0bL/+YpTylIKcDwKHau5pRCUGK/GVzn?= =?utf-8?q?L+0EX5XbY0/0NHyzt5k2laaZfbL9xxr9dOwXhHC22FhBd3XqzIqq5htRiRW0Pt5sC?= =?utf-8?q?FOdGzrmAeaMKWBYXt+t7Avn7wHDQuMYPKs0f0/SUEwsxpMj6SZsnSRQySiv05I8Sz?= =?utf-8?q?h1k4LxRnmImqScLVzD3/rAy0y9R75YtKLA5PNEbMLuZcKuMlUgifjVeYuBCvxxnG9?= =?utf-8?q?Frz/XIFYyJlFRwlWB02PMgYW8VqWMe9Mzr/KCkud0CQNjMXaZyLDPmDvmGELLQsJs?= =?utf-8?q?omEERg8ISKMo2IETwMVpFxX3jEAg4Y6Fzu5kSkrlWXCRXFk/u1eyhcBLzwbPw=3D?= =?utf-8?q?=3D?= X-Microsoft-Antispam-Message-Info: YBUd4Bz3ylQnzqonp4MPqwfxA6TGL51xfvJ1OaSpfIkxwHt5yokFoxhXK1bqtRTDrCwqhZW6wVEnmSHjwdrQgYZQe2kCfq2OCdtThhxNMXxBkd7MQQnTWFAWUXd/o88aveq/8u6B9FCQTRnBHEacapCZzosN8VMyh8WnSbJRM4xLpRBA8FHc0/TW/uANyzL9q+fvV9NNiFIPbbiNEwufqBsH3/XflKaHEpUXmlrckFux/hE+scuzmGqyCx7tL97JU1JLrkdjZmoRqWjqSWqgOdYVewmWQWuMiW4WWTamy7c= X-Microsoft-Exchange-Diagnostics: 1;DM5PR19MB1628;6:sR/CxlQWrDBsGm6Wfy08zaE9k1dQcHn8IjeOmKIBy1kOWuGSwJ/GBisXgHuUO/8NR6878nzBgem8sAR6ocLDK2Zjkak9KdHaM6Cp8WZAjooRK6E8ID8Oyr+tKxVEVNTbPFcZ8QCBA+LhV1Rd/rQaY+dHk3c+McUEEOmEZI1Cu78b9NSBNdG7C4CUZazfe50S2d/pyE9ge1TglPfn+pTbesySN0sWo6bDUgk2fgK0eXS95NUTmd8OhOFxH0WkqBy8v1DElBfdR5iMsSp5YVISRF2D4+Aofs2nTBHainIxyEiSgySqsGg/nnSw3pfT1QPywIN2QBFG3hvBhtjvmjTKiX5Q6st9+Qx0PEuQVFdASaXkvzJnOgWdhOlGOMXTa6U5NexT+lzq3iOKR9MQpC/3WbzqU2u4oe38T00j9uuBLR37rukipbBBKysitSLKrmF+/Y5f8gSqxk+KMfPJ6xy5cw==;5:1FYa4OrM49RunZXNkuNu0zjmoFKw5m5j/4OrOwoc61rTrFQSeQZe0PMQYjkAxvo7gQ/5TJ1aLmm890/kss2L8maII4GBqUZFEDYsIkxrYk0aJRoeoJTxVBwamGdXxqBXD8DCOk7b4QlAVJf04ZdQvOli+AK5doIUJlzhO3oZCWs=;7:yxDLiGQDr6nU7meh/wAzys617mCFrzntrtTBjEqPhsTtUXmQOn5kA3xcS2ygVuI+4SpYz766pTo+L8Sbn39QHMlQWVNPSQD2GKFTQVqpR313rhexJvAsl4ZvH+MgGwiF5PgXjwEN4p9yiFYKKznWuQ== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: microsemi.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Dec 2018 23:39:15.6591 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: fc249612-d450-42ee-9b6a-08d6654205bc X-MS-Exchange-CrossTenant-Id: f267a5c8-86d8-4cc9-af71-1fd2c67c8fad X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f267a5c8-86d8-4cc9-af71-1fd2c67c8fad;Ip=[208.19.99.223];Helo=[AUSMBX3.microsemi.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR19MB1628 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 - need to bump up the driver version because of the OFA patch and the fw status register read timeout patch. Reviewed-by: Gerry Morong Signed-off-by: Don Brace --- drivers/scsi/smartpqi/smartpqi_init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index 863bd0d0345c..5e5ae47fb074 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c @@ -40,11 +40,11 @@ #define BUILD_TIMESTAMP #endif -#define DRIVER_VERSION "1.2.4-065" +#define DRIVER_VERSION "1.2.4-070" #define DRIVER_MAJOR 1 #define DRIVER_MINOR 2 #define DRIVER_RELEASE 4 -#define DRIVER_REVISION 65 +#define DRIVER_REVISION 70 #define DRIVER_NAME "Microsemi PQI Driver (v" \ DRIVER_VERSION BUILD_TIMESTAMP ")"