From patchwork Fri Jan 20 06:28:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 9527495 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 B146760113 for ; Fri, 20 Jan 2017 06:29:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9EAEF2867A for ; Fri, 20 Jan 2017 06:29:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 91F5C2867E; Fri, 20 Jan 2017 06:29:23 +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=-6.8 required=2.0 tests=BAYES_00,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 6DCB92867A for ; Fri, 20 Jan 2017 06:29:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751403AbdATG3T (ORCPT ); Fri, 20 Jan 2017 01:29:19 -0500 Received: from mail-cys01nam02on0045.outbound.protection.outlook.com ([104.47.37.45]:44864 "EHLO NAM02-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751252AbdATG26 (ORCPT ); Fri, 20 Jan 2017 01:28:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=ebBMHDlWL0zotLI8TV1C+SgyjxT4/UEZcLAq8plUpFg=; b=PRn8GwW42SKgqoae7049hQ/PPLUtpsXrQF2H7kS86GjficRpCCf0S1gZsWYufjSjaM9OYlBx0+48oss5AW+fWVmH6/EHGGIvs5LWp2iF74lETyL2tQpNh1ianSjGGjmKfIM0Kghbo44gu2PJb26o8ROlb+bh8LzHB2t46p7vpRw= Received: from BN6PR07CA0034.namprd07.prod.outlook.com (10.172.104.20) by BN1PR07MB198.namprd07.prod.outlook.com (10.242.216.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Fri, 20 Jan 2017 06:28:26 +0000 Received: from BN1BFFO11FD032.protection.gbl (2a01:111:f400:7c10::1:134) by BN6PR07CA0034.outlook.office365.com (2603:10b6:404:a3::20) 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; Fri, 20 Jan 2017 06:28:27 +0000 Authentication-Results: spf=none (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; linux-iscsi.org; dkim=none (message not signed) header.d=none; linux-iscsi.org; dmarc=none action=none header.from=cavium.com; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) Received: from CAEXCH02.caveonetworks.com (50.232.66.26) by BN1BFFO11FD032.mail.protection.outlook.com (10.58.144.95) 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; Fri, 20 Jan 2017 06:28:26 +0000 Received: from dut1171.mv.qlogic.com (172.29.51.171) by CAEXCH02.caveonetworks.com (10.17.4.29) with Microsoft SMTP Server id 14.2.309.2; Thu, 19 Jan 2017 22:28:11 -0800 Received: from dut1171.mv.qlogic.com (localhost [127.0.0.1]) by dut1171.mv.qlogic.com (8.14.7/8.14.7) with ESMTP id v0K6SA0b001321; Thu, 19 Jan 2017 22:28:10 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id v0K6SAgK001320; Thu, 19 Jan 2017 22:28:10 -0800 From: Himanshu Madhani To: , , , CC: , , Subject: [PATCH v4 09/12] qla2xxx: Add Dual mode support in the driver Date: Thu, 19 Jan 2017 22:28:01 -0800 Message-ID: <1484893684-1255-10-git-send-email-himanshu.madhani@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1484893684-1255-1-git-send-email-himanshu.madhani@cavium.com> References: <1484893684-1255-1-git-send-email-himanshu.madhani@cavium.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26; IPV:CAL; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(979002)(6009001)(7916002)(39450400003)(2980300002)(428002)(189002)(199003)(6666003)(2950100002)(50226002)(4720700003)(50986999)(76176999)(5660300001)(81166006)(81156014)(8936002)(50466002)(48376002)(38730400001)(4001430100002)(33646002)(356003)(36756003)(2906002)(26826002)(39060400001)(54906002)(4326007)(305945005)(101416001)(5001770100001)(105586002)(2201001)(47776003)(80596001)(92566002)(86362001)(575784001)(5003940100001)(8676002)(189998001)(69596002)(107886002)(626004)(42186005)(106466001)(87636001)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN1PR07MB198; H:CAEXCH02.caveonetworks.com; FPR:; SPF:None; PTR:50-232-66-26-static.hfc.comcastbusiness.net; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD032; 1:VaLUxKjRm8fqYj2Kml6EguV8Sv/riVcMl4klf23b3hXPQVmDLR8AqrCYxrwnwONU7yRpjOLFzY0YkgV4V98y4311/C4crcX1r+0iZpJtCcb4aMAhCl7KvIbz6Db6aCS/RsUQ3azaHq41qUJ445dLOgGfnpqjAq3AEKz0FLGe/hiX1sFfAF+zRF4Zou4Fbv6SiuWsjQlvoEkqUMaaWZ6+AyyBn5rfxuj+JBmI+vml6os44w5i9D0dzy0wpvHAv6p7pPdbpZhBAFrV6Rqn3audSPpc/qB+1SblP64ebcLy77gDWS71a/IpBUO3pIU65q6gCW+f0zF2wyLu6RzZ9VtAKTUMwcN1ON62aXCZfoGUg3qAmFSGmziBd3SR1swqU6/BCCG1zCLMLs6ekBKW8wysJvuQOuO5tm9fd2fj0ef7Tj0vLcbeECNQifG2gASGj5uPK5XiYI8DRm8ucuwH6iCdn+dttfrfc3YhoMYHM20oIQiFz85fjdd7YwFJiSDA/QnM X-MS-Office365-Filtering-Correlation-Id: eae0336a-63f8-408f-3b64-08d440fd8ae7 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BN1PR07MB198; X-Microsoft-Exchange-Diagnostics: 1; BN1PR07MB198; 3:Ju8at3u8gxqUn+Arh6dgcEa7Byc173vLsL+x7WYrpWuLoZcWJ2mr78WSw6XOSR7t8bppsTogMiH47FgL938NaWfCirg6HfnUSAfrdnb/kJIgzPXOCTSy6w/41zkDC2Af75tmt6uw0BRvD5Xyi2HM+KGp9RQ5zvO4b/RX3yQKmySp5xw3+LqEa7+FcMPsripIeL7PlxwXlfUZx9TMybXVtm7YreIXv84k7mRESy5kngOjQxNeOneKCHwWIIa0yh+AB6f1fu/7d2nM6pQn6DCfbYCACq3z2Sl9r1PkrcaNntO2PScRTdigKF8HjPriBl5rB6Jy/jPEagO1dFU2YDZNbsdxOozD/oiCcdvQd0jlPPE= X-Microsoft-Exchange-Diagnostics: 1; BN1PR07MB198; 25:dmfUdeCSnIQjxN3RJETUdhXmVxR9MTgFdQHsQ/eycbDtlvg5LohcGty6f7nnd9e/Yl9H79nCYWpeBO/qij7fVr65YW3Nuq940029hH7gdnIEcUZ7K1d5IMVZshNkNT4af/WuB2MzLF+OvkWbUE9yMuftFBuNd+KVLotOHdRHMgTPcjcuN95t1CrCUNgEp151ehZvqDXoiQSJK7sbnYWcFU6k3jpmTRQkhV9QgvhZFnU0ABcciB3xS8FvHDpkXr2pGaEYPFZiQ3NAM/8DDMQFU5Z5w54FnZTFAZT5dYRO6P3C1NAQr729i6g7CyZinllBc8Vhr1k1xWzhYfWT+HkbURX7pKvKpqjbx/2uMKreplBAbXyyGIyyZmI0Gbg/mlpdYlw0uBsiaq4l8WR/k7YqS2Pt92Wt5jLGlmbDMvBFVef6YQFBkOPvQCnhpYL3eJppQ6QXjoSq5mIEFZAdd4sltGyQJborZSoivajYQbn3Kqzy9ceYIVuzzv47t5eZ8/CZlHXVE+yRyBr9P2WYcJlQnWjCb5whWIKGkS6EwZLf0wJ0suaTMhBlxRqjfqJEheMpkILS4pO03kxUgIN3amBvinb9HKVVUTykSkciM0cLlqS+0mO7kTwautEvw7NvD7vCu1pPK6H03BpJMcNxwMx/DwCaQUvWZOF17vZmxven/bxxrMwqG6pjQQUqyLFmwBtavZC2L7FiVAD9KL3f0YbVz0iY972MbPcOo+YwvxXruiWp4xOakc3o1ruQsIPda3X9om54WWid5DSGHBsY3v4UrqnhftLYJdSgHfjLdY5c6PVlF0qFT6LPR+ChGINCMCuss2KKwSNU0ekJS/I+gon7jn/zQL7AnJgPC8jjOZHQEmU= X-Microsoft-Exchange-Diagnostics: 1; BN1PR07MB198; 31:ea9H7M1pRwW0YN2NU8/BYoqyUDkCIAX15kiHB4wKCSnH36xWWlT+8+OLgXKQnjqMswBastbNSEFvlmvbC7fV+PkxXdN91xEDEWh0HmV+iwEn4OpMMvP5cfX+VGVV8ipHHLB8r5TYvgIrJrGbfGDGddEkmQqCJLwagNLgJf6HcpfMGu7gYf11kdZok+4foT285IiRPWtjKxxtz9dHK9AEkHr9d9o5AF7nbSPa4hgFDpuZdG98EZnDcFGjzR+rlJxVMlQe+YIo6ARuVwwXj5b+FTpfW/kaCJymDbAck573Y5I=; 20:kAXbpCZHX+FBxcYOKjYAalJKB1PaaM7u6NtZz9FrAYw1m5FUwSyQELsiKDjpH0CB2oy4hEpSaFD21JUSoyCnWkYORVQolnuEZV1aFEB+4VGMhrSeVPhdot3yeXmV/mUJ6ofdkbVje5z4/+PgLg365CwdOH0Yufoz2fcvZEY9xpeIciMV81TnAQ0NfaU7TU3kPXO8efkw/xpFcLKLo2Eoz1Hl4mp25HCdtG1ZppE68tqnjm9wVHdEVYlAzIuHwvJA33bHg/WtrR7l5Uj6OpCfjuRQRh4tOptmHhqE8PrqapEybXymQxldbX2pCVxT1iKwLvWySETmpKRYPCMa9m4PoFFzJfeB84+ial1Xspzg+FMU8/wjAB8ZRglbFUEYOIxmMhO7U31P/5k3aCit2uxJJgOFPx4gxAQ1w26SEYUX4v4yE5JulfZFK6OXO+h/oNOGZ7jYgdB6k9naswVabbKKkCIU/d0AkKST2NG+Gka1D2XQgxO6DjJHN69rMiUyFHJX X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13023025)(13013025)(13021025)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123562025)(20161123555025)(20161123560025)(20161123564025)(6072148); SRVR:BN1PR07MB198; BCL:0; PCL:0; RULEID:; SRVR:BN1PR07MB198; X-Microsoft-Exchange-Diagnostics: 1; BN1PR07MB198; 4:vAz5zlzE5ClPcErqHAwiAFwpHTkQqF/48RIsEnMxRILPnj6lhyuRYIwk7no0dZYa2MF+QfmE3HcnWYLyAVkDjSNX19G3pxYq5ul13wa7BbjCi5AFQgsY4WLKpkq5++uhF9LUddqxky9K/l+nF5FhSuYwnF4sXOjKcwYAaSp3v8erZPakNzkzUiIm5QWBM9tgj3rlx1pw6B+jJLNmF6Iv7S66HRLBmkHwAnrzT50JFby2P3/ny51dp067CQym+oaXWH4nRPzkoYevN1ZWj+vf8K2O0HTjDqc0W8mgZ2HwUzNKKK/ceyXRyvOtXjBlBhvggdV6TlWoLOA7lhrFwncvvTeeEZgDzRvasynUL+/y2Lv198IsXTajHSxUoxFxt+WQ7p8WeWD5DcI+fJJjIfb42VrohOcYtnnKkz9Xy+o4O7MymGfB1P965fugB9f5jH2wTr0xSI0NqF9CTmd2McM40kTWW2Fd9KHRYneTYmYEMozzlYA2IhbdG0fSaK+M8hsBT9UFa82gwRtln4WEbfSFeQetqcwkMTtvnVOxSUtv+jhXVrnP6Lh1tvKWazPm3fcXEHONBLz3lZj5TGDHuTXKXTjKa6J8ZFeVoia8TloPIBslFqPy4MSUFecmlzp8ylOr X-Forefront-PRVS: 01930B2BA8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN1PR07MB198; 23:M4Q8ixXqA5H2RebAmzjA4ISsEcBpNYCBtg1krengb1?= =?us-ascii?Q?oYJaiGXzXP9abJN0tdl49bEiU5aTetZsnkn0gGKQ/vUgMkix7fQslJWcFDvS?= =?us-ascii?Q?e5V2Ocod7ohvjJLX6jmSBPtgBN6HpUBlcWVwv/b7O0rPPSnZQpb1TfMsY1rX?= =?us-ascii?Q?Q6fQv2Ci1xKf6tUEqgCyFCOyhuwG5j69f94sYnMlMYrXOmFDm27cWxIs9phw?= =?us-ascii?Q?Kt6XKG6Byy2i1Qyt0+0jwwF1yxIbHEptVMYjDDOST///vWQUawOzMLIdOTfg?= =?us-ascii?Q?5+Dfrc0wDANaMPKtyuR4doQjQpXeKNtzCkAUuTNyQdNVu/FMcGtC7K8D4b16?= =?us-ascii?Q?If1Im61zpz27CYb778LV4ZdhQ4RpxegaMy7oNOUEOAV3Hpm064hhurmjqm3G?= =?us-ascii?Q?iTh8jU48lCSS5YqEehMR00NgwcEvV0tm+pOzbo4YJil5UznU+6yjmUw7xyxQ?= =?us-ascii?Q?TJ+ZfS3EFurXG+RPL4zdB0uCXXto2LtX2fMEBcAkNVpDox8HxPwEyAJm0Uhd?= =?us-ascii?Q?gb8TYlxMF0pPpDyPveGaN1tbM07tVHuSnGP5NeU1WNwy4B4YDO3zCcy12OPT?= =?us-ascii?Q?faCAbfkyjUZjpMTkS/s3p714+CPCnebJ0PewBvkXXf7RRgYbt+dsUa+SZqCN?= =?us-ascii?Q?QBoltpuGcriBneVBEVeLfnClYW8MZlEhR/SSXLc4JQeKKD0nTxPoKePIkvA7?= =?us-ascii?Q?UNe/msXDZHIcDtcLzK/64gd+G6ELqV0M/DCHcR2ajIERT646E8Giu6QUHHEG?= =?us-ascii?Q?DMIG5jyh582GkBh9TzasEpYVAcVs3KlC0H0MhC3o93rdfoPj2h/yhibB+jx0?= =?us-ascii?Q?aCNFyKLCeoh5IYke0pQDDlzRLFNWThvNZu4NAM0uwMlfbzIR2/aZUh0B2NzJ?= =?us-ascii?Q?gUu4MJQTViJgZvKTcVu14Suh04rp8hOMYqaM+nfW2BDuKmAVesd+t3Juyht3?= =?us-ascii?Q?uIAEwxe4FuZO2UCIMxx5WihKL+x7mjVSjyiilAuikDjzHRPqsvnUvb/drTXW?= =?us-ascii?Q?nNA+WshfLZA5qJa7zBRVixpoUgfV3b2F4egEwKRHgB+rOE9UrGJyPwQOjZoz?= =?us-ascii?Q?Ivada7hDQr79W0BN1wBMhuLMLnZR5wLxzDfmOMjfDr9LZr51txp4BDU9j1Wc?= =?us-ascii?Q?38OSY3VhTCwwM0IEO5UV1tNsTvswxqY4+pEYtNfwrcjIkHhMJHLzXW3r8Vf8?= =?us-ascii?Q?OMPj4p99kF9iZK3uHdqbHma8cka+ufw2Nlyfvplg07qmd3SGh9V2uzDWB6jL?= =?us-ascii?Q?iT1bGKjIqySCJavdYdvnSKtWjd+b1SXejYYM8PDc/tbyarcpdHZUwZBRMiNA?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN1PR07MB198; 6:OY27Yp/mbUpuKyE4e7lgKhfJASImL7TvED42QzqcLw958GkQnsLaO1G1TfQHJjEh6Ytac51p9b28nY+9Au9mD6OeeKmMm3dJh7resRLjKO26BFm26XN4Pt58tIThYiolRvt9tRz/A/78L6AQVUoOULSWgSBeIodhO5SEWEnerFffIjHfeK3I4Wd/B0W0L9r8hsbVmJ86NILc49Y56DpZ1zHLGHAU+9pIIw1s06iW/DCRU27Z7RoiXTSLFe4kqWXN1dW6Af+PZTcA92J5wm362yQuujmTyTF3aDXZWfSGL2EZtEEVpkwWFIxriTCNTC+hnjPTJN5sHbNljl+wYC92vbw2TW38Vz0U7N72CvDJohL4mvqIlsG0Jfd7WtR83pHafOKBYWirOTjvAWsLq2kD2Ne7eS5/AYyf6NITd9+qIgA=; 5:Glm0SYlLXbr9BvF8sQ+uHAnHUN2buPpIL50B9Sa5KZ1CYNLBKTBBH8/4f28WRKwbKKauuQ6wAbhxG4VaPdLdnTNiiX/B2PqUT9QbGTGCts64rAvuu71teGDSY2leh5Nzrsk5yY5ZE8FZ/zlM0prLSwfi/1UyPNcY4CRCPTaVhvs=; 24:carAHx176RuFjJ0jmXNuUS4Z6sGxXcGH4SRrpFasS8BLtmQybGeqhJiVOGG1dkbniz27KQRO8u+B05hx1pj4RCWGJvcJqpFY7VXNDPsdp+s= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN1PR07MB198; 7:8ME27GFyK28Qz2W6vlTu3lpia0oiFrmX7eKl0wKqyGNbPGC4CXMBQA2IWwZulmwl6NZks3nTvyVjqjsvl3AVckcLOQIpxCay03362Owixc+acVh7C8QYoeNmSAyiwhN7sufzs4Xyam3yqRFPHtfBFJa5+stBSLJ0IhcL+dYkiCue8gtgQHj6QxynQ7+rubU04JRxSoqgck0AW82UWO2sYec+aN6xbnq/3C6yrYCk1nPxdWMYv+Lj5RTqMs9OuxF/SjIDXeuSVS7ZeiGEjmxNkAnwce5A2z+dyvAFzsqncvTK+yajQdvavcliXY1qjiEPzNwNsgEhX7prgJ1tajUEJMxvzL1bdPfhmrsxKLJXUUNQB7QIfzvLzy/eQveOecylx5eirq4J0XOqtdrjeVVSKscKQS71Ymt/3d86wxRD1H8e4tjN3IAU2RPbFH2okLnulenXm3LIXwl663hbJ6Ax8w== X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jan 2017 06:28:26.3964 (UTC) X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=711e4ccf-2e9b-4bcf-a551-4094005b6194; Ip=[50.232.66.26]; Helo=[CAEXCH02.caveonetworks.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR07MB198 Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Quinn Tran Add switch to allow both Initiator Mode & Target mode to operate at the same time. Signed-off-by: Quinn Tran Signed-off-by: Himanshu Madhani --- drivers/scsi/qla2xxx/qla_def.h | 1 + drivers/scsi/qla2xxx/qla_init.c | 6 +- drivers/scsi/qla2xxx/qla_isr.c | 19 ++++++- drivers/scsi/qla2xxx/qla_target.c | 110 +++++++++++++++++++++++++++++++------ drivers/scsi/qla2xxx/qla_target.h | 3 + drivers/scsi/qla2xxx/tcm_qla2xxx.c | 2 +- 6 files changed, 119 insertions(+), 22 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 253f991..fd179df 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -3390,6 +3390,7 @@ struct qla_hw_data { #define FLOGI_SP_SUPPORT BIT_13 uint8_t port_no; /* Physical port of adapter */ + uint8_t exch_starvation; /* Timeout timers. */ uint8_t loop_down_abort_time; /* port down timer */ diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 8b7c046..4c0a2d8 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1568,8 +1568,7 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, } } - if (qla_ini_mode_enabled(vha) || - qla_dual_mode_enabled(vha)) + if (qla_ini_mode_enabled(vha) || qla_dual_mode_enabled(vha)) rval = qla2x00_init_rings(vha); ha->flags.chip_reset_done = 1; @@ -3994,7 +3993,8 @@ static void qla2xxx_nvram_wwn_from_ofw(scsi_qla_host_t *vha, nvram_t *nv) * Process any ATIO queue entries that came in * while we weren't online. */ - if (qla_tgt_mode_enabled(vha)) { + if (qla_tgt_mode_enabled(vha) || + qla_dual_mode_enabled(vha)) { if (IS_QLA27XX(ha) || IS_QLA83XX(ha)) { spin_lock_irqsave(&ha->tgt.atio_lock, flags); diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 7ad9cdf..c67b52c 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -1029,7 +1029,8 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *, qla2x00_mark_all_devices_lost(vha, 1); - if (vha->vp_idx == 0 && !qla_ini_mode_enabled(vha)) + if (vha->vp_idx == 0 && + (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha))) set_bit(SCR_PENDING, &vha->dpc_flags); set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags); @@ -1641,6 +1642,7 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *, fcport->d_id.b.area, fcport->d_id.b.al_pa, le32_to_cpu(logio->io_parameter[0])); + vha->hw->exch_starvation = 0; data[0] = MBS_COMMAND_COMPLETE; if (sp->type != SRB_LOGIN_CMD) goto logio_done; @@ -1676,6 +1678,21 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *, case LSC_SCODE_NPORT_USED: data[0] = MBS_LOOP_ID_USED; break; + case LSC_SCODE_NOXCB: + vha->hw->exch_starvation++; + if (vha->hw->exch_starvation > 5) { + ql_log(ql_log_warn, vha, 0xffff, + "Exchange starvation. Resetting RISC\n"); + + vha->hw->exch_starvation = 0; + + if (IS_P3P_TYPE(vha->hw)) + set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags); + else + set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags); + qla2xxx_wake_dpc(vha); + } + /* drop through */ default: data[0] = MBS_COMMAND_ERROR; break; diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index b5cfab0..225d2bf 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -55,8 +55,17 @@ "disabled on enabling target mode and then on disabling target mode " "enabled back; " "\"disabled\" - initiator mode will never be enabled; " + "\"dual\" - Initiator Modes will be enabled. Target Mode can be activated " + "when ready " "\"enabled\" (default) - initiator mode will always stay enabled."); +static int ql_dm_tgt_ex_pct = 50; +module_param(ql_dm_tgt_ex_pct, int, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(ql_dm_tgt_ex_pct, + "For Dual Mode (qlini_mode=dual), this parameter determines " + "the percentage of exchanges/cmds FW will allocate resources " + "for Target mode."); + int ql2x_ini_mode = QLA2XXX_INI_MODE_EXCLUSIVE; static int temp_sam_status = SAM_STAT_BUSY; @@ -1295,7 +1304,8 @@ int qlt_stop_phase1(struct qla_tgt *tgt) wait_event(tgt->waitQ, test_tgt_sess_count(tgt)); /* Big hammer */ - if (!ha->flags.host_shutting_down && qla_tgt_mode_enabled(vha)) + if (!ha->flags.host_shutting_down && + (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha))) qlt_disable_vha(vha); /* Wait for sessions to clear out (just in case) */ @@ -5263,6 +5273,32 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); break; + case MBA_REJECTED_FCP_CMD: + ql_dbg(ql_dbg_tgt_mgt, vha, 0xffff, + "qla_target(%d): Async event LS_REJECT occurred " + "(m[0]=%x, m[1]=%x, m[2]=%x, m[3]=%x)", vha->vp_idx, + le16_to_cpu(mailbox[0]), le16_to_cpu(mailbox[1]), + le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); + + if (le16_to_cpu(mailbox[3]) == 1) { + /* exchange starvation. */ + vha->hw->exch_starvation++; + if (vha->hw->exch_starvation > 5) { + ql_log(ql_log_warn, vha, 0xffff, + "Exchange starvation-. Resetting RISC\n"); + + vha->hw->exch_starvation = 0; + if (IS_P3P_TYPE(vha->hw)) + set_bit(FCOE_CTX_RESET_NEEDED, + &vha->dpc_flags); + else + set_bit(ISP_ABORT_NEEDED, + &vha->dpc_flags); + qla2xxx_wake_dpc(vha); + } + } + break; + case MBA_PORT_UPDATE: ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03d, "qla_target(%d): Port update async event %#x " @@ -5272,10 +5308,11 @@ void qlt_async_event(uint16_t code, struct scsi_qla_host *vha, le16_to_cpu(mailbox[2]), le16_to_cpu(mailbox[3])); login_code = le16_to_cpu(mailbox[2]); - if (login_code == 0x4) + if (login_code == 0x4) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03e, "Async MB 2: Got PLOGI Complete\n"); - else if (login_code == 0x7) + vha->hw->exch_starvation = 0; + } else if (login_code == 0x7) ql_dbg(ql_dbg_tgt_mgt, vha, 0xf03f, "Async MB 2: Port Logged Out\n"); break; @@ -5826,7 +5863,10 @@ static void qlt_set_mode(struct scsi_qla_host *vha) vha->host->active_mode = MODE_TARGET; break; case QLA2XXX_INI_MODE_ENABLED: - vha->host->active_mode |= MODE_TARGET; + vha->host->active_mode = MODE_UNKNOWN; + break; + case QLA2XXX_INI_MODE_DUAL: + vha->host->active_mode = MODE_DUAL; break; default: break; @@ -5849,8 +5889,8 @@ static void qlt_clear_mode(struct scsi_qla_host *vha) vha->host->active_mode = MODE_INITIATOR; break; case QLA2XXX_INI_MODE_ENABLED: - vha->host->active_mode &= ~MODE_TARGET; - vha->host->active_mode |= MODE_INITIATOR; + case QLA2XXX_INI_MODE_DUAL: + vha->host->active_mode = MODE_INITIATOR; break; default: break; @@ -5945,9 +5985,6 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) void qlt_vport_create(struct scsi_qla_host *vha, struct qla_hw_data *ha) { - if (!qla_tgt_mode_enabled(vha)) - return; - vha->vha_tgt.qla_tgt = NULL; mutex_init(&vha->vha_tgt.tgt_mutex); @@ -5978,7 +6015,6 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) ct_req->req.rff_id.fc4_feature = BIT_1; } else if (qla_dual_mode_enabled(vha)) ct_req->req.rff_id.fc4_feature = BIT_0 | BIT_1; - } /* @@ -5997,7 +6033,7 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) uint16_t cnt; struct atio_from_isp *pkt = (struct atio_from_isp *)ha->tgt.atio_ring; - if (!qla_tgt_mode_enabled(vha)) + if (qla_ini_mode_enabled(vha)) return; for (cnt = 0; cnt < ha->tgt.atio_q_length; cnt++) { @@ -6090,8 +6126,10 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) qlt_24xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_24xx *nv) { struct qla_hw_data *ha = vha->hw; + u32 tmp; + u16 t; - if (qla_tgt_mode_enabled(vha)) { + if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) { if (!ha->tgt.saved_set) { /* We save only once */ ha->tgt.saved_exchange_count = nv->exchange_count; @@ -6104,7 +6142,24 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) ha->tgt.saved_set = 1; } - nv->exchange_count = cpu_to_le16(0xFFFF); + if (qla_tgt_mode_enabled(vha)) { + nv->exchange_count = cpu_to_le16(0xFFFF); + } else { /* dual */ + if (ql_dm_tgt_ex_pct > 100) { + ql_dm_tgt_ex_pct = 50; + } else if (ql_dm_tgt_ex_pct == 100) { + /* leave some for FW */ + ql_dm_tgt_ex_pct = 95; + } + + tmp = ha->orig_fw_xcb_count * ql_dm_tgt_ex_pct; + tmp = tmp/100; + if (tmp > 0xffff) + tmp = 0xffff; + + t = tmp & 0xffff; + nv->exchange_count = cpu_to_le16(t); + } /* Enable target mode */ nv->firmware_options_1 |= cpu_to_le32(BIT_4); @@ -6189,11 +6244,13 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) qlt_81xx_config_nvram_stage1(struct scsi_qla_host *vha, struct nvram_81xx *nv) { struct qla_hw_data *ha = vha->hw; + u32 tmp; + u16 t; if (!QLA_TGT_MODE_ENABLED()) return; - if (qla_tgt_mode_enabled(vha)) { + if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) { if (!ha->tgt.saved_set) { /* We save only once */ ha->tgt.saved_exchange_count = nv->exchange_count; @@ -6206,7 +6263,23 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) ha->tgt.saved_set = 1; } - nv->exchange_count = cpu_to_le16(0xFFFF); + if (qla_tgt_mode_enabled(vha)) { + nv->exchange_count = cpu_to_le16(0xFFFF); + } else { /* dual */ + if (ql_dm_tgt_ex_pct > 100) { + ql_dm_tgt_ex_pct = 50; + } else if (ql_dm_tgt_ex_pct == 100) { + /* leave some for FW */ + ql_dm_tgt_ex_pct = 95; + } + + tmp = ha->orig_fw_xcb_count * ql_dm_tgt_ex_pct; + tmp = tmp/100; + if (tmp > 0xffff) + tmp = 0xffff; + t = tmp & 0xffff; + nv->exchange_count = cpu_to_le16(t); + } /* Enable target mode */ nv->firmware_options_1 |= cpu_to_le32(BIT_4); @@ -6316,10 +6389,11 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) qlt_modify_vp_config(struct scsi_qla_host *vha, struct vp_config_entry_24xx *vpmod) { - if (qla_tgt_mode_enabled(vha)) + /* enable target mode. Bit5 = 1 => disable */ + if (qla_tgt_mode_enabled(vha) || qla_dual_mode_enabled(vha)) vpmod->options_idx1 &= ~BIT_5; - /* Disable ini mode, if requested. */ + /* Disable ini mode, if requested. bit4 = 1 => disable */ if (qla_tgt_mode_enabled(vha)) vpmod->options_idx1 &= ~BIT_4; } @@ -6474,6 +6548,8 @@ static int __init qlt_parse_ini_mode(void) ql2x_ini_mode = QLA2XXX_INI_MODE_DISABLED; else if (strcasecmp(qlini_mode, QLA2XXX_INI_MODE_STR_ENABLED) == 0) ql2x_ini_mode = QLA2XXX_INI_MODE_ENABLED; + else if (strcasecmp(qlini_mode, QLA2XXX_INI_MODE_STR_DUAL) == 0) + ql2x_ini_mode = QLA2XXX_INI_MODE_DUAL; else return false; diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 5e56192..ac86b37 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h @@ -45,10 +45,12 @@ #define QLA2XXX_INI_MODE_STR_EXCLUSIVE "exclusive" #define QLA2XXX_INI_MODE_STR_DISABLED "disabled" #define QLA2XXX_INI_MODE_STR_ENABLED "enabled" +#define QLA2XXX_INI_MODE_STR_DUAL "dual" #define QLA2XXX_INI_MODE_EXCLUSIVE 0 #define QLA2XXX_INI_MODE_DISABLED 1 #define QLA2XXX_INI_MODE_ENABLED 2 +#define QLA2XXX_INI_MODE_DUAL 3 #define QLA2XXX_COMMAND_COUNT_INIT 250 #define QLA2XXX_IMMED_NOTIFY_COUNT_INIT 250 @@ -975,6 +977,7 @@ extern int qlt_lport_register(void *, u64, u64, u64, * is not set. Right now, ha value is ignored. */ #define QLA_TGT_MODE_ENABLED() (ql2x_ini_mode != QLA2XXX_INI_MODE_ENABLED) + extern int ql2x_ini_mode; static inline bool qla_tgt_mode_enabled(struct scsi_qla_host *ha) diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index e37d7ee..8b878a2 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c @@ -1744,7 +1744,7 @@ static int tcm_qla2xxx_lport_register_npiv_cb(struct scsi_qla_host *base_vha, (struct tcm_qla2xxx_lport *)base_vha->vha_tgt.target_lport_ptr; struct fc_vport_identifiers vport_id; - if (!qla_tgt_mode_enabled(base_vha)) { + if (qla_ini_mode_enabled(base_vha)) { pr_err("qla2xxx base_vha not enabled for target mode\n"); return -EPERM; }