From patchwork Mon Jan 23 18:09:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Raghava Aditya Renukunta X-Patchwork-Id: 9533801 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 10FF96042F for ; Tue, 24 Jan 2017 00:47:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F356327CAF for ; Tue, 24 Jan 2017 00:47:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E69A527F8C; Tue, 24 Jan 2017 00:47:32 +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=-5.2 required=2.0 tests=BAYES_00, DATE_IN_PAST_06_12, DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID 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 03BE927CAF for ; Tue, 24 Jan 2017 00:47:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751916AbdAXAr2 (ORCPT ); Mon, 23 Jan 2017 19:47:28 -0500 Received: from mail-sn1nam01on0053.outbound.protection.outlook.com ([104.47.32.53]:30400 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751885AbdAXArB (ORCPT ); Mon, 23 Jan 2017 19:47:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mscc365.onmicrosoft.com; s=selector1-microsemi-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=5xahkV+KQyY/d+qoi54iyaJ4UFIYQxzJFk9LYZETyzU=; b=HLAjjJS++iAhFC+tkvn5EnxOvdODehLuFsIp5cIUpUlELUXeDiZ7Z/RlLJ5dOHgg6SPwYEhsaPaUEg7MW5y9awZ2mJlbGWkKBRf2kPM2iOEipwDljxvb13DCprH4NRKUB4KcbfpPwhxxmQ3/Pl/hE6UZ9Sy3FSsvi8NVD5SmrOw= Received: from BN1PR02CA0045.namprd02.prod.outlook.com (10.141.56.45) by BY1PR0201MB0983.namprd02.prod.outlook.com (10.161.203.13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13; Tue, 24 Jan 2017 00:46:07 +0000 Received: from BL2FFO11FD022.protection.gbl (2a01:111:f400:7c09::127) by BN1PR02CA0045.outlook.office365.com (2a01:111:e400:2a::45) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13 via Frontend Transport; Tue, 24 Jan 2017 00:46:07 +0000 Authentication-Results: spf=none (sender IP is 208.19.100.21) smtp.mailfrom=microsemi.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=microsemi.com; Received-SPF: None (protection.outlook.com: microsemi.com does not designate permitted sender hosts) Received: from avsrvexchhts1.microsemi.net (208.19.100.21) by BL2FFO11FD022.mail.protection.outlook.com (10.173.161.101) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.803.8 via Frontend Transport; Tue, 24 Jan 2017 00:46:06 +0000 Received: from localhost (10.181.116.230) by avsrvexchhts1.microsemi.net (10.100.34.105) with Microsoft SMTP Server (TLS) id 14.3.339.0; Mon, 23 Jan 2017 16:45:52 -0800 From: Raghava Aditya Renukunta To: , , CC: , , , Subject: [PATCH 17/24] aacraid: Added support to abort cmd and reset lun Date: Mon, 23 Jan 2017 10:09:01 -0800 Message-ID: <20170123180908.3465-18-RaghavaAditya.Renukunta@microsemi.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170123180908.3465-1-RaghavaAditya.Renukunta@microsemi.com> References: <20170123180908.3465-1-RaghavaAditya.Renukunta@microsemi.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:208.19.100.21; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(6009001)(7916002)(39850400002)(39410400002)(39860400002)(39840400002)(39450400003)(2980300002)(428002)(199003)(189002)(106466001)(38730400001)(105586002)(77096006)(6666003)(305945005)(69596002)(8676002)(626004)(68736007)(36756003)(4001430100002)(53936002)(2950100002)(76506005)(57986006)(54906002)(76176999)(97736004)(50986999)(356003)(5001770100001)(2906002)(5660300001)(8936002)(47776003)(4326007)(92566002)(5003940100001)(86362001)(1076002)(101416001)(107886002)(81166006)(50226002)(2201001)(81156014)(189998001)(50466002)(104016004)(48376002)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:BY1PR0201MB0983; H:avsrvexchhts1.microsemi.net; FPR:; SPF:None; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD022; 1:pmxnFddUhMoL9f3uJ1VJLc015IVC8yRq6SzndKCJ03K0Oo3DDK+kFudWRFSLUYUgOj8Ie8UR019Y09hNkMgrvz21LEdnQN6dsBvjzhLox2n1lVGbZrGIvFVuu3yZRyJ0NUrnnVjLxpsb/oRRfnTGbUZz2HPaasXEl/ywz+rylZSmpy0pHCDrXfyqMEZWi7FKvq138RIP1yd986Z6H/PM+aVqeTN2GWpJTOnjYKfIKZPj6yyiaIGUz6dmkfLu+/6dAV8QUnItviMBRMWTso0+IEGMYndpMQplXqlubmSQ5WsOUG021cF7EYBsKDls4/ANPwUr/hma1ac2YYcX6Cm4kr8Rpygi02ZOPTkiNprdkOorOwOuH0YzhJRl/0nXcdRIf0EO3aEEpiTB+J9NS3tM+fFKCxEp5VJhKwY47OpS8TcvYI40zSafNwqrgzpAswSmHLrqKd/geHuZ/yFzxbrLgwH7ydy2JQpJjnaNGr44FeK/waCXlOXOdTfbpMFbSZOm+BFyqrfSdmr5FSRXM0voq1Yrk9HJAbFOQyAKlck7jd65KkiozHcfR2CCd9vkcvX2 X-MS-Office365-Filtering-Correlation-Id: bbbce6b2-c2fa-45fb-804c-08d443f261c5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BY1PR0201MB0983; X-Microsoft-Exchange-Diagnostics: 1; BY1PR0201MB0983; 3:tjLAwP31G+q/BFsGmFI25EeL5Xchqh36M0mckUre/Ihshhu+daHxHchSOG5BnvrQLuo8IrJZlWlj79ujLIGNW+rwKCLmcSXxAcwSYjhxw9zAzxld7Q2vnprT1VC9jYqYlm+RHfw8ZM/S29Uv+ZkdcQCrEkpBg04c+HP77Okc56gxCks5TFaVYxpRp7MTXrT/7XgwTJu+DeVpVdSu8pYheC7amxg/K6/45EZEEW3UK7Cq4kbog8nFl1wJSevj++65wBfnv+4m5ON+1jHn13Puy+RBA47RJ/obKkv8zWJy2Butjoh2WBCbKgMal51p8d5FLpp9m1qfW5i8lcMwj6DZsxVdjkUCKsvYh+lKwUx8jGG14YvnBpUC7hIn57ufrbDj X-Microsoft-Exchange-Diagnostics: 1; BY1PR0201MB0983; 25:6cGIU0+w5RAY5RDR4cejcsKRogmWN2jho/1YwAXzZk4Mfar05sW94YcjLrT19JZ8XroJQw0J9Xri3A3SJlkMLmEWCw2KMoE1eKq0W29ktX4XurwoFqyVo5Z2USXqPFspTvAE8gj8VNVXYWRk3HzdL5uWpi6T1IkU7XUwjkMQsWgGP3JLc5AWXz3pEzG4xS/G8A7JGaq33Uhfo7fTcdo2qZlaXteozBbfVrEB2Rc8bGXEqc8xRm9n18tAd1hF5Yg+FOgjNKha4B4/4x1452q8C1bYhLdkZY87tFUO4nRim6CZ/L5BOwY+UMkTNxCwJxNmvybfK0zAmzbRfAv9WJ/BEGxNjPy/tAi5ZeXoWPcxP+6Bv639o35TcRI/iQ+2oFR6/P/VYW3y6ztfG7sh7bAF4xphlWloSewphYifCGOUerIRYVogoy/j4DTck+P6H1p4ovIVXOT43fmFuzZ+2I5F0RuUfSRagHwZiGWmr3qaC/HqEVrHB1aGDLr4K8ZSa6tt7IzuhzcUWDYXbbGSSaejaNzBfVZhpb2fDceR2qwc1FRPrneIO6RqcdqpjPU68nSQM9jipGQZ65/4GLDPYUiVS4zXSTrtPhxyTDyBiETFnK9RnwWTsd80JNCb6YsDuLXCHw3ILlsDYlNA4fUDFeIezQPZBEjjHT0Xq3UZp63QtceTrP1h97M0RLQiJ1Prj0bGu4sROLPqGHGnGUaaC9VKuxdLoGVPWGOfBbq9ziS9WgQBkV60n8V6ThuyaG22lsQ4zCUP2Ad8Cu2cID1AezeS/nJBfw3Gj9K91Zser2RmN4msX+Vq8AvjejlJZRNS+K3nby8DZTswz4Uu/wJfoByRP+s9WTsgJKV0bt2SJ/63Vh0= X-Microsoft-Exchange-Diagnostics: 1; BY1PR0201MB0983; 31:3BWgjvr1VrdbLDO9G1RFzM6qHgIOZzFaG7bDJkKbj0jR1mz4xv1qX0pkR2dnMBeThPb9Gw++y5ZrBwoeNIghWhlaCK3kLH4m/wb+NIVDo8Qv71DCRlkecPnk0ojvCYMCVf2RKHlLT7Tp0+LkrYDQlqYC8tmijYWc0i1IcHDOlgld1/+3v5sfS9BgOGNMpSui2BMbO+9fByI2B4JjyVrKX6dV+alfs9IpDWrDv2uJ8K7uXIW4lkrOL/xJTLUo1Pd9EukgCXxqihi5ZXLwO9BFpBFbU99o04wfqlNo/hlzi54=; 20:bt8+/6/eL9tOw8DavE69S6N5F3+QCH2DapfS1uweTXs6nnVKR4uHODl/ID7uyczLujdJEEtjk/a8GOFIhqCjuhqBz4lwE4a1vM3LutuFUjIe/YJJzOwjbMYrvDF4t2bhQzvDvRdt14rSEGM4Pz+PJMRFxyYh42YlByzT1/tFYGUqnl3GGAtz2LGzTIu2xPVg07LBwyL7MNRpm5qtVJd+lrZqdamgzLKeQsjMUYqHM4EmkSKhsJC0RAo3bKcpjDE9LeIMCrsj4g6mS3EKE3nM200MfMWpk+ESoM3rCroJAyf/To/hXFb5/4LXynyOstPcAEVFUVRUKg3pCN1KUrJVjVUFIsZsiZ4MkenZCgKhUSnkKBtRx/IwV9GR65Jsa/2VK57mXsCzTkKuXGXRwyOcwLpW/5AohrNjCNvH7zIIo450Y9X67S+DhWHODlT4zno5+q/7fyEDNM+P0jb5FjMbyStdceO8PUQ/ut1Pm3Ka9FfAOVluKFQ7buCWopXuYNxb X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(72170198267865); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13015025)(13023025)(13024025)(13017025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6041248)(20161123564025)(20161123562025)(20161123560025)(20161123555025)(6072148); SRVR:BY1PR0201MB0983; BCL:0; PCL:0; RULEID:; SRVR:BY1PR0201MB0983; X-Microsoft-Exchange-Diagnostics: 1; BY1PR0201MB0983; 4:kU1wRzmauMnclJ2our6GMgXqPEwDOiIsIcvryEed1WiRI4c2AsL1lWSt6qI2UDdLVHxjTz8xJAuZ0ah7voxzD/XPhcl2P7UZq88MqqWvbNvv0QNy5ha6Z8Nb4lhwyoSiNX44W/Hf3UjBMfTDLWr3MR/0C4ujNOgIc4vCymA6eGVa6RbzBI3WBvnHJE+xiYolgtLmKvikNxAUKhuy56Md8buih1K+0IQMb9tY0ikX260C5ZlmYSnb2THYBUvWEBGjAZwS5QuKQkAtGrjLWDDVETyhe/cgtebqeJJpX7fYxJn3hIge/Co8hOW6pG7avdWRI5m6s8poKHJ5F0jCdZcSrENziatnQZ9tZpptNlHQNfdbNABWdespFmPwwZ0x4bzdasp+WRHFVpiIRlcf3JrN3gRmEbJlQSr6kzlshna1NfXds15OXPViLFs247NITIntT6ykLHdsersUI2qNUnlqsG1k77gmyz6vvVSdtGRTxHOZ3phauwQ/MpuP0fs5KmHkk+By9NOYUiZg0CMHqavwwzOfkRf5In7VNzYNX5GD3PyXlXayMp1ERntBhw8nUTTVy1wQyD9ywWOpLUWJ7mTSKgbaXBzOxHs6aCwL04hsBJ9uiSJ4+Z584rXh1xc7jg3HxU3XRK6Q9F+hythsYIL5ZItCpjRp5iLBOc4HEe3TVaNK87RMnMRYY+ysRVcXBc0kY/8xiXoVweh31i6MWY1gUQDJz8w9tA/m9io93bpol9Q= X-Forefront-PRVS: 0197AFBD92 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR0201MB0983; 23:GpPd2hhmtLIHprHgiVJnLVEW2Y3wxTpQf+NzDIO?= =?us-ascii?Q?A4iOPAsiYhLKFfCctWv78WPgN2HwpeGDamUudjXkt4dQStjlH95Qza3+/N28?= =?us-ascii?Q?pKeoAm/g1wDg3Vb1TKvfnc88lo2//LdnVnSKchck4RxnvBnLARZtZ40SlSFr?= =?us-ascii?Q?fd14PzYWlPBkDHBzoQAU4j8FiFRZvFZ+UP1AR8Ftpbvh0fwgZrN1SZ7CqtdF?= =?us-ascii?Q?pWjmcO3d+AQ5ihbXEH/Ua5k2fBDV8fFQN8SQynjSHqk/OflQQ5aA2FFQIvXH?= =?us-ascii?Q?Wt06jdASdFliAFd23SpdGJ8C7pJplpUeITTJKGZxGhb6uDDIz5GisxVUuO1C?= =?us-ascii?Q?HdgWlmx1rL6U3GQbVfyUCsKbhYZnmpS1gWZIMBs3V8XP1/Sd6ma1Pcf5uqw/?= =?us-ascii?Q?qW6MsrtQaKeK9yLuha9MW2nEf4a3DFF5I8GGKep/eiyy5TjFwNfwGlT0SqWW?= =?us-ascii?Q?iOIjRHDDAWfa6IgATSFRpp0sIMSXJ8QXVBuhrtd3ZY0IQ9jszcRvpmqFZF/B?= =?us-ascii?Q?m8h0lQPBdJm2kfKtgVd3JceO4hnOks3NPrzVHdEeu2TgcJr7un6mWTvwEJG5?= =?us-ascii?Q?rzzuHhrtiAH15KsR83j4a1MbW75iqBktXT5XT8dqetViE9mAJLu60kwKNvwS?= =?us-ascii?Q?DZbolpsGMh1APa9qgk+gMr547txhOikqg+2etAAGWpoVdJzE8PUGbEIJsrhP?= =?us-ascii?Q?cyQ6JFf4eDbrPkDHp8kdHRsu6siqBtHCdqFXFOKVgpqDvCCFtSpS7760aq2r?= =?us-ascii?Q?Fbgy5f2mqcYShnFHFXdIrdIWoGNelb9Slvub1A4UE7THswOW60McCXniiDT2?= =?us-ascii?Q?kAMs8LvovsD/HG5/XXHt8p/RaYCOQZwqvD9qsa5ojcNlpydMw9M+7SGc97GY?= =?us-ascii?Q?SZ+nOqj5XI/koNUMIvMbDFTLF7ibuzm2gC+6pQbwHIdfnbhpogh3ML/2lrNv?= =?us-ascii?Q?lI5mwwKa+QmO2mg+upA591UQqmIrrRNpEl9nYNXQGsBLqGRDoCAJrkt5Ti46?= =?us-ascii?Q?qLbJqSGnYD/HrGL9lf4a/rhUikAHJtP0flPNgWH70gqft+vnApDHQhSZGXRv?= =?us-ascii?Q?ISI5d9QFVeUkBqxrdM/x3DeEIL/PlCTJlsfKldfvQibzQ9cKjCYoHWCCUv1e?= =?us-ascii?Q?toLHLv7uYTUeQMhSRRJTyjxnYx0VrSJLrhCeT/M2ENnMwY7Id0Av3F9AVz75?= =?us-ascii?Q?919ehvaOzByEO6Qs2hLZ/MRJY+XXT+8tHWCpyf3IofdCYTHMJDIQadh1XlF9?= =?us-ascii?Q?errm3sXzGDxUJWG6uBfcuNGiLMEpxPq6N4JMQ5nmF1h3Qw0JYHeu1rjdU85V?= =?us-ascii?Q?3k3jXYV06eTKTyZ8KNCdt0MUnObuVAtkZ5c3JKmZKCwT3GAN3y4SVIj74q+E?= =?us-ascii?Q?lW/9cdHW8bAg8FeXA7UU9H08+8pE=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR0201MB0983; 6:77jU1DymdBEA+ZFMnwWY3w8XtJaF34eW6Hd0XZWAgJQxCTl3E/nUwmyWiJ24ZX/x/QBU3jysWp3bOJOpyFeCPxYm4m7Ius4TZKkKxca4Ql7+qqmg8zMXxePda2rcfWcHHqPUgqCmR0g/h3BNH1J51uIUEKbJu3wMINN34NSTwNCNW5STtKRRIfbi2j6xjMEgvm1rEuU2LGzdrx39M27IIFPwc5Y/5aTUkbGGbX88LE6kLmbrSJGTAfibxDw8ovHoqz2SCUOhYZ9SJZZcsWvBHFAXf+jzDMZS47OibeGPGTwEPKAU3tl25sb45EEsuxuU+IpXLCGls5Cu2PYAO8/lUkpF+H9vdRb8DjjNjk5MuzUpGPpNZcCI3r6+ZTMcAH82Qvcu/vuct9AXAiJapDGcjhhs/WYwIrQz/G4i8A49QMTBcgNVevC9QVOckGKDfXfbmv1IEOJ9RdyqNG0mp3Ayqg==; 5:HJQjLyzvVGzrIUxw3pD4/2CdacCvVCLvTv74jaMYls9z0iUhrbUE44TnjrRhDAY0iYPbEq6iJvZVxYT/u59Kz27jsh4GAo2e0uvkMRajrJ9D2UWFGSevy8Yf/WQ/3BB1+vARa+pYIwdemuNRR02jvQ==; 24:Vb80lGrZ/ya+outXVtvchWOH1XGQLHAjCPKxj15RkmPQAoIsARspIOIY93mfwx7LTID/3zKhae7bnt/OGrM+Rjx5abUEhMuX0oXoBGL3xwI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY1PR0201MB0983; 7:sSc2kAxn9mR8JivcCpqYsNj+FbQiAtlmi7N0hIh9PiB9hVAum5wX8pMGljwoGxfrOuXIC8UrZbROL7IYqeahtqMFA/V8FJTJI03KAfFFUIYcz22A6Ak546eFqhLB9KKq3hcLlzIjcoJkY7aYnUE/YBBviOl/GoFnm+SMpHF77UVvFVKivzH3dkHgkH0gs6bFyLG8gRRs6J+EuMJLSM9PZO+7dtaCBZj2Tcm7YPLAVigys6VmQJUD9PMTvzVTk8KC9tWFHYdjt08On5BZHOKLNGXY7nZPHTjHE2ijAaFQD2zHSUsxf0GzDtVVK4MUvUkEiyHXw7muNExO4XYnyJQHLFifXOZfXiV5kkGpaXgd6i0u1qHpJf7+oCe4vGSeZdr3ov8sY9KskQd3FF7s5joN5GPwrMSXL745XUu10QifNioTFzQXsmW4iMiGRsMzxbxjxCVp0b93U+zhB1R3C8+RbA== X-OriginatorOrg: microsemi.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jan 2017 00:46:06.4130 (UTC) X-MS-Exchange-CrossTenant-Id: f267a5c8-86d8-4cc9-af71-1fd2c67c8fad X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f267a5c8-86d8-4cc9-af71-1fd2c67c8fad; Ip=[208.19.100.21]; Helo=[avsrvexchhts1.microsemi.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0201MB0983 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 Added task management command support to abort any timed out commands in case of a eh_abort call and to reset lun's in case of eh_reset call. Signed-off-by: Raghava Aditya Renukunta Signed-off-by: Dave Carroll --- drivers/scsi/aacraid/aacraid.h | 48 ++++++ drivers/scsi/aacraid/linit.c | 349 +++++++++++++++++++++++++++++++---------- drivers/scsi/aacraid/src.c | 33 +++- 3 files changed, 343 insertions(+), 87 deletions(-) diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 6ca77ff..814310a 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h @@ -206,6 +206,53 @@ struct aac_hba_cmd_req { */ }; +/* Task Management Functions (TMF) */ +#define HBA_TMF_ABORT_TASK 0x01 +#define HBA_TMF_LUN_RESET 0x08 + +struct aac_hba_tm_req { + u8 iu_type; /* HBA information unit type */ + u8 reply_qid; /* Host reply queue to post response to */ + u8 tmf; /* Task management function */ + u8 reserved1; + + __le32 it_nexus; /* Device handle for the command */ + + u8 lun[8]; /* SCSI LUN */ + + /* Used to hold sender context. */ + __le32 request_id; /* Sender context */ + __le32 reserved2; + + /* Request identifier of managed task */ + __le32 managed_request_id; /* Sender context being managed */ + __le32 reserved3; + + /* Lower 32-bits of reserved error data target location on the host */ + __le32 error_ptr_lo; + /* Upper 32-bits of reserved error data target location on the host */ + __le32 error_ptr_hi; + /* Length of reserved error data area on the host in bytes */ + __le32 error_length; +}; + +struct aac_hba_reset_req { + u8 iu_type; /* HBA information unit type */ + /* 0 - reset specified device, 1 - reset all devices */ + u8 reset_type; + u8 reply_qid; /* Host reply queue to post response to */ + u8 reserved1; + + __le32 it_nexus; /* Device handle for the command */ + __le32 request_id; /* Sender context */ + /* Lower 32-bits of reserved error data target location on the host */ + __le32 error_ptr_lo; + /* Upper 32-bits of reserved error data target location on the host */ + __le32 error_ptr_hi; + /* Length of reserved error data area on the host in bytes */ + __le32 error_length; +}; + struct aac_hba_resp { u8 iu_type; /* HBA information unit type */ u8 reserved1[3]; @@ -223,6 +270,7 @@ struct aac_hba_resp { struct aac_native_hba { union { struct aac_hba_cmd_req cmd; + struct aac_hba_tm_req tmr; u8 cmd_bytes[AAC_MAX_NATIVE_SIZE-FW_ERROR_BUFFER_SIZE]; } cmd; union { diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index e95f1e5..0b06d1d 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -566,46 +566,134 @@ static int aac_eh_abort(struct scsi_cmnd* cmd) struct scsi_device * dev = cmd->device; struct Scsi_Host * host = dev->host; struct aac_dev * aac = (struct aac_dev *)host->hostdata; - int count; + int count, found; + u32 bus, cid; int ret = FAILED; - printk(KERN_ERR "%s: Host adapter abort request (%d,%d,%d,%llu)\n", - AAC_DRIVERNAME, - host->host_no, sdev_channel(dev), sdev_id(dev), dev->lun); - switch (cmd->cmnd[0]) { - case SERVICE_ACTION_IN_16: - if (!(aac->raw_io_interface) || - !(aac->raw_io_64) || - ((cmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16)) - break; - case INQUIRY: - case READ_CAPACITY: - /* Mark associated FIB to not complete, eh handler does this */ + bus = aac_logical_to_phys(scmd_channel(cmd)); + cid = scmd_id(cmd); + if (aac->hba_map[bus][cid].devtype == AAC_DEVTYPE_NATIVE_RAW) { + struct fib *fib; + struct aac_hba_tm_req *tmf; + int status; + u64 address; + __le32 managed_request_id; + + pr_err("%s: Host adapter abort request (%d,%d,%d,%d)\n", + AAC_DRIVERNAME, + host->host_no, sdev_channel(dev), sdev_id(dev), (int)dev->lun); + + found = 0; for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { - struct fib * fib = &aac->fibs[count]; - if (fib->hw_fib_va->header.XferState && - (fib->flags & FIB_CONTEXT_FLAG) && - (fib->callback_data == cmd)) { - fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT; - cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER; + fib = &aac->fibs[count]; + if (*(u8 *)fib->hw_fib_va != 0 && + (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA) && + (fib->callback_data == cmd)) { + found = 1; + managed_request_id = ((struct aac_hba_cmd_req *) + fib->hw_fib_va)->request_id; + break; + } + } + if (!found) + return ret; + + /* start a HBA_TMF_ABORT_TASK TMF request */ + fib = aac_fib_alloc(aac); + if (!fib) + return ret; + + tmf = (struct aac_hba_tm_req *)fib->hw_fib_va; + memset(tmf, 0, sizeof(*tmf)); + tmf->tmf = HBA_TMF_ABORT_TASK; + tmf->it_nexus = aac->hba_map[bus][cid].rmw_nexus; + tmf->lun[1] = cmd->device->lun; + + address = (u64)fib->hw_error_pa; + tmf->error_ptr_hi = cpu_to_le32((u32)(address >> 32)); + tmf->error_ptr_lo = cpu_to_le32((u32)(address & 0xffffffff)); + tmf->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE); + + fib->hbacmd_size = sizeof(*tmf); + cmd->SCp.sent_command = 0; + + status = aac_hba_send(HBA_IU_TYPE_SCSI_TM_REQ, fib, + (fib_callback) aac_hba_callback, + (void *) cmd); + + /* Wait up to 2 minutes for completion */ + for (count = 0; count < 120; ++count) { + if (cmd->SCp.sent_command) { ret = SUCCESS; + break; } + msleep(1000); } - break; - case TEST_UNIT_READY: - /* Mark associated FIB to not complete, eh handler does this */ - for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { - struct scsi_cmnd * command; - struct fib * fib = &aac->fibs[count]; - if ((fib->hw_fib_va->header.XferState & cpu_to_le32(Async | NoResponseExpected)) && - (fib->flags & FIB_CONTEXT_FLAG) && - ((command = fib->callback_data)) && - (command->device == cmd->device)) { - fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT; - command->SCp.phase = AAC_OWNER_ERROR_HANDLER; - if (command == cmd) + + if (ret != SUCCESS) + pr_err("%s: Host adapter abort request timed out\n", + AAC_DRIVERNAME); + } else { + pr_err( + "%s: Host adapter abort request.\n" + "%s: Outstanding commands on (%d,%d,%d,%d):\n", + AAC_DRIVERNAME, AAC_DRIVERNAME, + host->host_no, sdev_channel(dev), sdev_id(dev), + (int)dev->lun); + switch (cmd->cmnd[0]) { + case SERVICE_ACTION_IN_16: + if (!(aac->raw_io_interface) || + !(aac->raw_io_64) || + ((cmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16)) + break; + case INQUIRY: + case READ_CAPACITY: + /* + * Mark associated FIB to not complete, + * eh handler does this + */ + for (count = 0; + count < (host->can_queue + AAC_NUM_MGT_FIB); + ++count) { + struct fib *fib = &aac->fibs[count]; + + if (fib->hw_fib_va->header.XferState && + (fib->flags & FIB_CONTEXT_FLAG) && + (fib->callback_data == cmd)) { + fib->flags |= + FIB_CONTEXT_FLAG_TIMED_OUT; + cmd->SCp.phase = + AAC_OWNER_ERROR_HANDLER; ret = SUCCESS; + } } + break; + case TEST_UNIT_READY: + /* + * Mark associated FIB to not complete, + * eh handler does this + */ + for (count = 0; + count < (host->can_queue + AAC_NUM_MGT_FIB); + ++count) { + struct scsi_cmnd *command; + struct fib *fib = &aac->fibs[count]; + + if ((fib->hw_fib_va->header.XferState & + cpu_to_le32 + (Async | NoResponseExpected)) && + (fib->flags & FIB_CONTEXT_FLAG) && + ((command == fib->callback_data)) && + (command->device == cmd->device)) { + fib->flags |= + FIB_CONTEXT_FLAG_TIMED_OUT; + command->SCp.phase = + AAC_OWNER_ERROR_HANDLER; + if (command == cmd) + ret = SUCCESS; + } + } + break; } } return ret; @@ -620,70 +708,165 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) { struct scsi_device * dev = cmd->device; struct Scsi_Host * host = dev->host; - struct scsi_cmnd * command; - int count; struct aac_dev * aac = (struct aac_dev *)host->hostdata; - unsigned long flags; - - /* Mark the associated FIB to not complete, eh handler does this */ - for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) { - struct fib * fib = &aac->fibs[count]; - if (fib->hw_fib_va->header.XferState && - (fib->flags & FIB_CONTEXT_FLAG) && - (fib->callback_data == cmd)) { - fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT; - cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER; + int count; + u32 bus, cid; + int ret = FAILED; + + bus = aac_logical_to_phys(scmd_channel(cmd)); + cid = scmd_id(cmd); + if (bus < AAC_MAX_BUSES && cid < AAC_MAX_TARGETS && + aac->hba_map[bus][cid].devtype == AAC_DEVTYPE_NATIVE_RAW) { + struct fib *fib; + int status; + u64 address; + u8 command; + + pr_err("%s: Host adapter reset request. SCSI hang ?\n", + AAC_DRIVERNAME); + + fib = aac_fib_alloc(aac); + if (!fib) + return ret; + + + if (aac->hba_map[bus][cid].reset_state == 0) { + struct aac_hba_tm_req *tmf; + + /* start a HBA_TMF_LUN_RESET TMF request */ + tmf = (struct aac_hba_tm_req *)fib->hw_fib_va; + memset(tmf, 0, sizeof(*tmf)); + tmf->tmf = HBA_TMF_LUN_RESET; + tmf->it_nexus = aac->hba_map[bus][cid].rmw_nexus; + tmf->lun[1] = cmd->device->lun; + + address = (u64)fib->hw_error_pa; + tmf->error_ptr_hi = cpu_to_le32 + ((u32)(address >> 32)); + tmf->error_ptr_lo = cpu_to_le32 + ((u32)(address & 0xffffffff)); + tmf->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE); + fib->hbacmd_size = sizeof(*tmf); + + command = HBA_IU_TYPE_SCSI_TM_REQ; + aac->hba_map[bus][cid].reset_state++; + } else if (aac->hba_map[bus][cid].reset_state >= 1) { + struct aac_hba_reset_req *rst; + + /* already tried, start a hard reset now */ + rst = (struct aac_hba_reset_req *)fib->hw_fib_va; + memset(rst, 0, sizeof(*rst)); + /* reset_type is already zero... */ + rst->it_nexus = aac->hba_map[bus][cid].rmw_nexus; + + address = (u64)fib->hw_error_pa; + rst->error_ptr_hi = cpu_to_le32((u32)(address >> 32)); + rst->error_ptr_lo = cpu_to_le32 + ((u32)(address & 0xffffffff)); + rst->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE); + fib->hbacmd_size = sizeof(*rst); + + command = HBA_IU_TYPE_SATA_REQ; + aac->hba_map[bus][cid].reset_state = 0; } - } - printk(KERN_ERR "%s: Host adapter reset request. SCSI hang ?\n", + cmd->SCp.sent_command = 0; + + status = aac_hba_send(command, fib, + (fib_callback) aac_hba_callback, + (void *) cmd); + + /* Wait up to 2 minutes for completion */ + for (count = 0; count < 120; ++count) { + if (cmd->SCp.sent_command) { + ret = SUCCESS; + break; + } + msleep(1000); + } + + if (ret != SUCCESS) + pr_err("%s: Host adapter reset request timed out\n", + AAC_DRIVERNAME); + } else { + struct scsi_cmnd *command; + unsigned long flags; + + /* Mark the assoc. FIB to not complete, eh handler does this */ + for (count = 0; + count < (host->can_queue + AAC_NUM_MGT_FIB); + ++count) { + struct fib *fib = &aac->fibs[count]; + + if (fib->hw_fib_va->header.XferState && + (fib->flags & FIB_CONTEXT_FLAG) && + (fib->callback_data == cmd)) { + fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT; + cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER; + } + } + + pr_err("%s: Host adapter reset request. SCSI hang ?\n", AAC_DRIVERNAME); - if ((count = aac_check_health(aac))) - return count; - /* - * Wait for all commands to complete to this specific - * target (block maximum 60 seconds). - */ - for (count = 60; count; --count) { - int active = aac->in_reset; + count = aac_check_health(aac); + if (count) + return count; + /* + * Wait for all commands to complete to this specific + * target (block maximum 60 seconds). + */ + for (count = 60; count; --count) { + int active = aac->in_reset; - if (active == 0) - __shost_for_each_device(dev, host) { - spin_lock_irqsave(&dev->list_lock, flags); - list_for_each_entry(command, &dev->cmd_list, list) { - if ((command != cmd) && - (command->SCp.phase == AAC_OWNER_FIRMWARE)) { - active++; - break; + if (active == 0) + __shost_for_each_device(dev, host) { + spin_lock_irqsave(&dev->list_lock, flags); + list_for_each_entry(command, &dev->cmd_list, + list) { + if ((command != cmd) && + (command->SCp.phase == + AAC_OWNER_FIRMWARE)) { + active++; + break; + } } - } - spin_unlock_irqrestore(&dev->list_lock, flags); - if (active) - break; + spin_unlock_irqrestore(&dev->list_lock, flags); + if (active) + break; + } + /* + * We can exit If all the commands are complete + */ + if (active == 0) + return SUCCESS; + ssleep(1); } + pr_err("%s: SCSI bus appears hung\n", AAC_DRIVERNAME); + /* - * We can exit If all the commands are complete + * This adapter needs a blind reset, only do so for + * Adapters that support a register, instead of a commanded, + * reset. */ - if (active == 0) - return SUCCESS; - ssleep(1); + if (((aac->supplement_adapter_info.SupportedOptions2 & + AAC_OPTION_MU_RESET) || + (aac->supplement_adapter_info.SupportedOptions2 & + AAC_OPTION_DOORBELL_RESET)) && + aac_check_reset && + ((aac_check_reset != 1) || + !(aac->supplement_adapter_info.SupportedOptions2 & + AAC_OPTION_IGNORE_RESET))) { + /* Bypass wait for command quiesce */ + aac_reset_adapter(aac, 2); + } + ret = SUCCESS; } - printk(KERN_ERR "%s: SCSI bus appears hung\n", AAC_DRIVERNAME); /* - * This adapter needs a blind reset, only do so for Adapters that - * support a register, instead of a commanded, reset. + * Cause an immediate retry of the command with a ten second delay + * after successful tur */ - if (((aac->supplement_adapter_info.SupportedOptions2 & - AAC_OPTION_MU_RESET) || - (aac->supplement_adapter_info.SupportedOptions2 & - AAC_OPTION_DOORBELL_RESET)) && - aac_check_reset && - ((aac_check_reset != 1) || - !(aac->supplement_adapter_info.SupportedOptions2 & - AAC_OPTION_IGNORE_RESET))) - aac_reset_adapter(aac, 2); /* Bypass wait for command quiesce */ - return SUCCESS; /* Cause an immediate retry of the command with a ten second delay after successful tur */ + return ret; } /** diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c index 124efe6..40a486f 100644 --- a/drivers/scsi/aacraid/src.c +++ b/drivers/scsi/aacraid/src.c @@ -497,10 +497,35 @@ static int aac_src_deliver_message(struct fib *fib) vector_no = fib->vector_no; if (native_hba) { - ((struct aac_hba_cmd_req *)fib->hw_fib_va)->reply_qid - = vector_no; - ((struct aac_hba_cmd_req *)fib->hw_fib_va)->request_id - += (vector_no << 16); + if (fib->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) { + struct aac_hba_tm_req *tm_req; + + tm_req = (struct aac_hba_tm_req *) + fib->hw_fib_va; + if (tm_req->iu_type == + HBA_IU_TYPE_SCSI_TM_REQ) { + ((struct aac_hba_tm_req *) + fib->hw_fib_va)->reply_qid + = vector_no; + ((struct aac_hba_tm_req *) + fib->hw_fib_va)->request_id + += (vector_no << 16); + } else { + ((struct aac_hba_reset_req *) + fib->hw_fib_va)->reply_qid + = vector_no; + ((struct aac_hba_reset_req *) + fib->hw_fib_va)->request_id + += (vector_no << 16); + } + } else { + ((struct aac_hba_cmd_req *) + fib->hw_fib_va)->reply_qid + = vector_no; + ((struct aac_hba_cmd_req *) + fib->hw_fib_va)->request_id + += (vector_no << 16); + } } else { fib->hw_fib_va->header.Handle += (vector_no << 16); }