From patchwork Thu Feb 2 19:42:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 9553187 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 976B2604A7 for ; Thu, 2 Feb 2017 20:00:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 889F728480 for ; Thu, 2 Feb 2017 20:00:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7D73028497; Thu, 2 Feb 2017 20:00: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.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=unavailable 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 92C4628491 for ; Thu, 2 Feb 2017 20:00:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751844AbdBBUAV (ORCPT ); Thu, 2 Feb 2017 15:00:21 -0500 Received: from mail-dm3nam03on0056.outbound.protection.outlook.com ([104.47.41.56]:55040 "EHLO NAM03-DM3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751476AbdBBUAT (ORCPT ); Thu, 2 Feb 2017 15:00:19 -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=dh5FPHlL8CDksdGO12AON7iyXu94z98ynGOFZ6+5DN8=; b=lJHIplF3gmWBbmyvTZB236+Gu5TJLDQBX0Nfd88kv1o5O/aJoYY4/JVlX3d4tMssYxoi5nlNjNWjdCqmy1o4TN1XP1aneUwzian0VSZnMg5xAbEG54zryzwg0O9PF8Y/dEFMmiLKRGar2t6CihduVP9EBLVu/JkWR6ujcRPsf7M= Received: from MWHPR07CA0026.namprd07.prod.outlook.com (10.169.230.12) by CO1PR07MB208.namprd07.prod.outlook.com (10.242.167.149) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13; Thu, 2 Feb 2017 19:43:16 +0000 Received: from BY2FFO11FD017.protection.gbl (2a01:111:f400:7c0c::143) by MWHPR07CA0026.outlook.office365.com (2603:10b6:300:1c::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16 via Frontend Transport; Thu, 2 Feb 2017 19:43:16 +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 BY2FFO11FD017.mail.protection.outlook.com (10.1.14.105) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.874.2 via Frontend Transport; Thu, 2 Feb 2017 19:43:15 +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, 2 Feb 2017 11:43:08 -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 v12Jgsor000412; Thu, 2 Feb 2017 11:42:54 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id v12Jgs0M000411; Thu, 2 Feb 2017 11:42:54 -0800 From: Himanshu Madhani To: , , , CC: , , Subject: [PATCH 04/15] qla2xxx: Use IOCB interface to submit non-critical MBX. Date: Thu, 2 Feb 2017 11:42:27 -0800 Message-ID: <1486064558-365-5-git-send-email-himanshu.madhani@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1486064558-365-1-git-send-email-himanshu.madhani@cavium.com> References: <1486064558-365-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:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(39450400003)(2980300002)(428002)(189002)(199003)(106466001)(305945005)(5660300001)(105586002)(4326007)(92566002)(47776003)(6666003)(4720700003)(2950100002)(356003)(48376002)(2201001)(81166006)(50466002)(38730400001)(69596002)(86362001)(50986999)(76176999)(575784001)(101416001)(50226002)(8676002)(80596001)(36756003)(81156014)(54906002)(2906002)(1691005)(5003940100001)(189998001)(626004)(42186005)(8656002)(8936002)(107886002)(5001770100001)(33646002)(4001430100002)(87636001); DIR:OUT; SFP:1101; SCL:1; SRVR:CO1PR07MB208; 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; BY2FFO11FD017; 1:G4pa7wXCy0BBL+wHySqKfDWqs+sgWzAcRS6T9ZsnrXSS7/XL8n9cNeOh5EKWcUgYOCOwpMD+IqC3Q/8DG72YbbRF097ETk7IushqK91EC+O7QRM/htm7tyPRqHh8PZq2D/vH2NjPAYwiKHdAICrE72Ic8OUFAeibI5uu1CaDm725ppTKgawlrT8tSB8nNmxD1qND0K7L1c2HCXqKiCt3So2itvIdE+8tPAUIqWgGhKLVl4yGwoT6tzRAs8hKavHBUpu7V06BZbZqVaQmk3/nDgjgMdHumITQLnOZvvy8TL5RfUjAe65vMmM62YAvAHWB+HOVG0LHv+jwVgaocFbsyJ3YrMtN0b1z8MojStxIgkP+YVOCcOQz5jq/DuFSxLAMlTo1xhMsBj9X+BPjDDr2j2D8G+C7ohtoBeaDlWx3HWSgEIzikh71HeOEvuU2q/x2m/O7rK3vQFFdTWE1hPnIIq8fPjMs3LBosGu3lducZvdLXU25ITEYz/T6ccDjHALaCeyZQCzcIk/4fZeSKffHeT4EMASKcDIc1H2ezU/gRe8= X-MS-Office365-Filtering-Correlation-Id: f7d296e8-51de-41d3-9652-08d44ba3bb4c X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:CO1PR07MB208; X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 3:cyR0w1RXXyD8xjOMGr6XKMMfdWTQdAHKEFa7sKH1TVtdEyFIjYdj6T0p7L9dVpkfy1oyqWXqRbeQW3FvE4WsZHn15Vy+9JH4bEhWn1NZndkKyYtjouBv3TyTXUK5lrHGxL55LXrjPkVhyNUEzxkU/yX//9bzyXXrNqKdupLgs6GbOHDgSyHtUS3RoaRPKY8/HrvY4hAAZ0c1NHfuC+c9hSF9linNiCZ0NykYA09drmtkmKitGXFTvZEgiQe9L48slci9z8V6QOmUGLPYs6GEo2wAQEKtrqj3+sZLkHgGF44Idis5yNNULkwup/CiohTKxNGP891/mn8d750yu5JyHoA5T8H3V4qrPL2oQLsYVnUGR9OIHtyi/fbTJ2XeLEkh; 25:/BUhM3v0JplKqi4txeGw0b3xFhIERKDaj+rJh/xYc2A3FnNfpPjsHH+ZKe39uC+cO7KG44oDXPSlOWg2Blei/2u6JnzYHZpLXOXeKZ5hVpYdOoYtGZefbsCow3J7/PInljzUCetdYUjnm6TzohyJg3swYkeIJHOhx8gKo1TFTW0UDLONMf8LQ0BAqqwoo56Rl5/5ocDrE0tC+ekdbJzsGEsrQD6O03vEP5/WnKxizmYhS8UJUaGGRZJoju004jCtVuaCzf5BEFEkILmD9vq4P4p7sOrAmrRdtqVsGYt5gVN/OYPkO+z2zb8bt6BDYB4YoXDmXBaTtbbEjoXhC+w1De4eYXVqvFx5Vy4T9h26o6oFxr2I8f6VwGeJTnLdq/BhHsxCembK1+MrLnYbh3mxtbWNmw4IPtP7HfaIf1pzVr3+tihGUMGVSIs2z8jbqSfRFIZC4x+M6e6cCPiGzUHu2g== X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 31:cNssu4KWuhp1TMTdAWbhF2pMG8kmgLdm4TH6GbKdx1UY9ZFG81Ve8DyzkywHXJDwHd5RJQBDchFK6RtcdOniZT9MUJs8Zl4eLfE1yGzs00Vbz+0TdhWP6WmHcCLIQsgpkiHLGD8N5hGiPi7jCmfkeTx6lPiXty8DjvvhAqTSMMP2hh4rRCoymvJdYJyHFEDcp0wQivziy3wTXNHGKDhMBT9/jJhH1XMMRUzIIit1i5ZyWhhhpepguYN0d1pA2svrpgwRH1eMeDRkxZW/QlazLg==; 20:xcYrP1X7qWToK3rNJ8csi/5YddBNCHtgRBmiLYl3spbzNtC//H0ZMyRFa9zjoHk/pzSzmIcxLHObOupFw3z8RvgTWrfHxIiYegtVZCQxxngi70lITOrs8Nf9POZe4h4BPPX1qR57vdyqKkxJ7YJ4OLS8NuG3RdodMCQyoTLBvE//uBK3BTvR6iUJ9U9I0CwzS4ULZWMnDGCFMmwtIPoQj9Sr+BrKiaKzKotRWOnpDJyvDkMnIdTSfnwgb1EzGJPPwS813sLoI2saaLxMBOtcZxSCwQDwLE0yxWcDZk4w2uVEkZMhhl7W/IffCWu2B/s+MLFL7mgwWSy8n+kTP53Y+XYX0QfCK6FvOmmNPuD+E7T4lGLrd3fciFtlXj9qBDTuL6l0yPYUmUOD4VI7yffrBLcfRESVJCe/c/nVTs+k3dPnw0clGE0FjV2nqwTauyGJo364p5a+R6Gao9xq/LjRqdcELYMCzQUeUmy/Jv7r39W4Md58ARK9pnPbrwsitNQa X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13018025)(13017025)(13023025)(13015025)(5005006)(8121501046)(13024025)(10201501046)(3002001)(6041248)(20161123558025)(20161123564025)(20161123562025)(20161123555025)(20161123560025)(6072148); SRVR:CO1PR07MB208; BCL:0; PCL:0; RULEID:; SRVR:CO1PR07MB208; X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 4:RQEPvWpGj36GurzmsXA2GIZKdFv+OXdgiyo1gsoXl6Y1ndhSzoyI2uMAFtm2YWJT6pE400iSSz2GiimWR0SIbQXrj9EWAn7gwqjURhU0xwOBR+ToIUF4sVpN+HxqGyeU6orSGOAyUHczrKmKHBUrxBIt0FCbqbN7SUHlEKcys5DyCi3OkcAoMFS1Sv0XUWcUDu3ziZOD3oS3i6la+teJW/VKsjuOCmcxYzCnxnE6d73ml+7msp33rDwBJw4IhQi1ZVwLbxVZ360kQomQmULslnbGX15+tE8Ic0f29uCvJcvaY4m52/MCmHxOaqN8K8vFXxqYE5X5sNt8rJWVQZeIfs+zc2/MKJ+GqIfWBePKmwHDjjlXD3NX84bWq0guBo7oFNC1o4Bu/Na8YNWLvYqetqE5FClF2EwYebkj7Y6GLoOKfLAsmhfgvAc+HYN1c0LqMZZHD2w3e4udOYr64julsCmr4MSCKamxikdhLHZmpC3fOq1pBCb1/2a6o2Mdh7C4smVGtt3nPJ6GkswDSEjSWa33pXn9QY2XFYGFn2OLW/iCscNY+0b+8szyLGyduPspP+n51VfgAsowgmUlNgBFV2+LM5782b3q5DBLYnlUZSTv7wjtOY9MBVDYUYFhofRycJwVGV6d1DCr/tRFye6EM3te1Lm51lOg4vSAFhBk7oZ8ZnzkhZJcGi3bVgygoCwKnzKE7WAuQd0uxgYFUiNUXA== X-Forefront-PRVS: 02065A9E77 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CO1PR07MB208; 23:cbyP8K7IvJu6Kk4VfdO82HE+NAzU9/T6Sh4TPhLXGn?= =?us-ascii?Q?yV9vljpBnt4RpiU6iYYhcjtGGw6MESZX65kMyRnkBzmBtIWzULieCh14ngV5?= =?us-ascii?Q?6Py9vplVwLLdSx8I3Nar2H+lMDdU6qluw3Lzlcf4pEuC8i7JI1eC/13rj4OP?= =?us-ascii?Q?JNSXZXBhOfgb4wKri12WogjdDgK3WUcKnbYhpErE6XS0GRG/Y6mIftUp09q8?= =?us-ascii?Q?Tq6mv2HUYiniuPSXBnBwiVFu3hKbQbWApXjeb/tTSwpNzJOdT9kyrzlviCgf?= =?us-ascii?Q?IlFFLiewjgIGg833meb0O5LeKP1FZpxZZzPxMmG8CRxZ/3SxJPmaovthEMr2?= =?us-ascii?Q?U0eDXCWzofA6YTcQQ2tEXHjqxMnDHgelUWXW4E5FMsLqdC3KYLyd4MF9U/S9?= =?us-ascii?Q?7mxRTyaSkQHNj+CKHFjsmRyKUxOS0aUyElzuoK9WFqPtdIHRn/7hbd+jd/Cy?= =?us-ascii?Q?beRMdGOp2GJ1K9fcFWb7TkQb3JRrLR/aUf7m+frdtY4ojXZ3Ae8DP8WaSl3S?= =?us-ascii?Q?DvczJydhouQeZ8RcZkPIe+OlCyVROhu4ecTOnaTCl80WiMB+Kh+QR1lAfA5h?= =?us-ascii?Q?rCfITDZMvNHjDaugugt+yIczdhS0coUtLv1cYgf09tVVQaUgUkx83ZfZ+qWo?= =?us-ascii?Q?y5asoRPwNdsp5H5z65GZdfmmsz2TQRD6Ov9DfQuQXrGS9jn6SATaLT30vAHa?= =?us-ascii?Q?MReGLNt/Xac5tCxkor5+Mw+86ZRwm93/CExGxutrY/KpQQyYxcwjAG80gS+B?= =?us-ascii?Q?p4HhGlXxXgbPge0KNbsXu77r5xUhqtaCFBLL/tpXBhYups1EqmOkCFWsWYIy?= =?us-ascii?Q?lW20ji+5ZhqQMjMHYxKqTdDO1uFT/ruPDsafBtQ4TB5zetkmbxXILvitEqpK?= =?us-ascii?Q?hMrsHPBy6V0hHK43WPJ2Pt0rbzI9ec5vP5rsEyddfjF+1F9Kyi5oc43tWu9U?= =?us-ascii?Q?igs5mZQuDAGty0vPRKL33PJouUhCzPVaHxVOIY2VC68tvMkKJBiVZEqu0iTp?= =?us-ascii?Q?hqCa9IgDu5Cb8xClIFhHJn/h1g7Fap1rGYl/9FbLN3JdauWCTgJnEVob5+YM?= =?us-ascii?Q?SJh5naHGlCwzsjpvjz4gf1/l6bgZHE5gdLSZyLUATLQzRafrB5xEmARYeDqN?= =?us-ascii?Q?O2SmoP6NDvWOmU71K4vmaGZqqjkIvJ1k3Bmpmryb36osBz78R1fEkWgs6mDq?= =?us-ascii?Q?tNtHXHpxsTlYY=3D?= X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 6:jgvVnlarmb2jQaRKEjPsO9YIEFEU2v/rxeZbYiJlqZG6Lf9D7rIwLM0uGtbe8+3I1Z7krzyKlieMFO0dqehX7A7EKi38yWrvRPRC+hdKA9oIso76zxN4+oBVBcam1+WmymzIF94lqY2VTjg8SVtMPt34u96cYnHU8xeUL4AvSX58lNuz43URmRKZucCvhy3FEHmtq+PLedgH0IpjWaj9kJmMCcURLfZUp0qdfdmdwWA9Q5AwiPRhdQAYC6TdT1oF7awea0X0S51yRpm4Z5VWRS+7knI3TLPSnrnEHhCLYkHh9qhBC37cNlNxokeFlvLMjwyrRJ+VC3Y3zEH+SINrFoJWV73Cyc9hGasd2eKMHgjcqiXb1wpjbwBJE1DERSifR+9X8rHmbWNR5C7jHbnsUuqBgLQV4KjF5GIRpT5S0QU=; 5:45F+pchet0MT8NQjp0bf9ZkyZgb/LYYHtrQGasetbA5beIcxIxNu+kZKCF8lTKX5j1bqjdjnyFQr3dAdcyA3T6yRmTNwhN1PLEj5mshuvBnpJO00N+Q9TlKQ4RIEcmZ/NF190Sa6G9AOVz2Hwa6w/UGnBmtRTxNESt3J7mqld8s=; 24:eJJ6gC/M8GaknlJMfGhMuP+C7z+A/xZt9KJHDkvs9Pqlb4Lvymen7/tZNwHLu4GNfDQhi7eZ6IJWqH4emdn0dp9e7cy9TX8wGTdPZU7IELM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CO1PR07MB208; 7:HrOsmPvGZNC0s41d+4ORMWcMj0TNfvx7/q5CBL9osv5YeN7YSaVFVdCYvj7bMoNypu7HDruWb6KyT9w1YHwEhIA280YbGYQfU69roCHi43aRLTGTopa3Vggn5TYSc0YAN476imQsjbQ8KXl17KaNuWWayIghIT2j5qCdPBCtmyK36dy1R8cmivt05KdS/fsb8KLlvJUvigHGYvq8VrOub105NNre0wZomEZPulhdC1lWhAxTRa3gOXoV0yaaCY+5w0BhvOlRwZZbmnWfxKuR3ERvOXBW2xCC+uv/sDn7sQZdvzH3c81vcb6o64lyDzi4dys4SStPt6/IZKK4xeg5ClyofGRj4odYIbwTvKfnJfA5iMd4oPROHi4fFva7rlmNlElcNuTPxJ1+sxS8Qp5pYIIQl4Knx81DTCcw4aVUxFbHsEw6Bep11xDOuqwDRLd3EKGVV1kC17onO7uDN2y4Wb0vqfpzBJwTztXEAAEpkfQ/UV/5H5p0pzrQMHDUGW40qFZX4cs6Y/Z1ZZFjf0U5MJaq0J8eGmHA7Rx+5icXi+3W5qCUOCLIi0KMxj2KeLJh X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Feb 2017 19:43:15.8165 (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: CO1PR07MB208 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 The Mailbox interface is currently over subscribed. We like to reserve the Mailbox interface for the chip managment and link initialization. Any non essential Mailbox command will be routed through the IOCB interface. The IOCB interface is able to absorb more commands. Following commands are being routed through IOCB interface - Get ID List (007Ch) - Get Port DB (0064h) - Get Link Priv Stats (006Dh) Signed-off-by: Quinn Tran Signed-off-by: Himanshu Madhani --- drivers/scsi/qla2xxx/qla_def.h | 8 +- drivers/scsi/qla2xxx/qla_gbl.h | 10 +- drivers/scsi/qla2xxx/qla_init.c | 46 +------ drivers/scsi/qla2xxx/qla_isr.c | 2 +- drivers/scsi/qla2xxx/qla_mbx.c | 273 ++++++++++++++++++++++++++++++++++++-- drivers/scsi/qla2xxx/qla_target.c | 4 +- 6 files changed, 279 insertions(+), 64 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index b180d51..2825204 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -395,11 +395,15 @@ struct srb_iocb { struct completion comp; } abt; struct ct_arg ctarg; +#define MAX_IOCB_MB_REG 28 +#define SIZEOF_IOCB_MB_REG (MAX_IOCB_MB_REG * sizeof(uint16_t)) struct { - __le16 in_mb[28]; /* fr fw */ - __le16 out_mb[28]; /* to fw */ + __le16 in_mb[MAX_IOCB_MB_REG]; /* from FW */ + __le16 out_mb[MAX_IOCB_MB_REG]; /* to FW */ void *out, *in; dma_addr_t out_dma, in_dma; + struct completion comp; + int rc; } mbx; struct { struct imm_ntfy_from_isp *ntfy; diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 862d5f5..48a1190 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -194,6 +194,7 @@ void qla2x00_handle_login_done_event(struct scsi_qla_host *, fc_port_t *, uint16_t *); int qla24xx_post_gnl_work(struct scsi_qla_host *, fc_port_t *); void qla2x00_schedule_work(struct scsi_qla_host *); +int qla24xx_async_abort_cmd(srb_t *); /* * Global Functions in qla_mid.c source file. @@ -369,7 +370,7 @@ extern int qla24xx_build_scsi_crc_2_iocbs(srb_t *, extern int qla24xx_get_isp_stats(scsi_qla_host_t *, struct link_statistics *, - dma_addr_t, uint); + dma_addr_t, uint16_t); extern int qla24xx_abort_command(srb_t *); extern int qla24xx_async_abort_command(srb_t *); @@ -473,6 +474,13 @@ extern int qla24xx_set_fcp_prio(scsi_qla_host_t *, uint16_t, uint16_t, extern int qla26xx_dport_diagnostics(scsi_qla_host_t *, void *, uint, uint); +int qla24xx_send_mb_cmd(struct scsi_qla_host *, mbx_cmd_t *); +int qla24xx_gpdb_wait(struct scsi_qla_host *, fc_port_t *, u8); +int qla24xx_gidlist_wait(struct scsi_qla_host *, void *, dma_addr_t, + uint16_t *); +int __qla24xx_parse_gpdb(struct scsi_qla_host *, fc_port_t *, + struct port_database_24xx *); + /* * Global Function Prototypes in qla_isr.c source file. */ diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index e84ab37..5aca3df 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -629,7 +629,6 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) struct srb *sp = s; struct scsi_qla_host *vha = sp->vha; struct qla_hw_data *ha = vha->hw; - uint64_t zero = 0; struct port_database_24xx *pd; fc_port_t *fcport = sp->fcport; u16 *mb = sp->u.iocb_cmd.u.mbx.in_mb; @@ -649,48 +648,7 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) pd = (struct port_database_24xx *)sp->u.iocb_cmd.u.mbx.in; - /* Check for logged in state. */ - if (pd->current_login_state != PDS_PRLI_COMPLETE && - pd->last_login_state != PDS_PRLI_COMPLETE) { - ql_dbg(ql_dbg_mbx, vha, 0xffff, - "Unable to verify login-state (%x/%x) for " - "loop_id %x.\n", pd->current_login_state, - pd->last_login_state, fcport->loop_id); - rval = QLA_FUNCTION_FAILED; - goto gpd_error_out; - } - - if (fcport->loop_id == FC_NO_LOOP_ID || - (memcmp(fcport->port_name, (uint8_t *)&zero, 8) && - memcmp(fcport->port_name, pd->port_name, 8))) { - /* We lost the device mid way. */ - rval = QLA_NOT_LOGGED_IN; - goto gpd_error_out; - } - - /* Names are little-endian. */ - memcpy(fcport->node_name, pd->node_name, WWN_SIZE); - - /* Get port_id of device. */ - fcport->d_id.b.domain = pd->port_id[0]; - fcport->d_id.b.area = pd->port_id[1]; - fcport->d_id.b.al_pa = pd->port_id[2]; - fcport->d_id.b.rsvd_1 = 0; - - /* If not target must be initiator or unknown type. */ - if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0) - fcport->port_type = FCT_INITIATOR; - else - fcport->port_type = FCT_TARGET; - - /* Passback COS information. */ - fcport->supported_classes = (pd->flags & PDF_CLASS_2) ? - FC_COS_CLASS2 : FC_COS_CLASS3; - - if (pd->prli_svc_param_word_3[0] & BIT_7) { - fcport->flags |= FCF_CONF_COMP_SUPPORTED; - fcport->conf_compl_supported = 1; - } + rval = __qla24xx_parse_gpdb(vha, fcport, pd); gpd_error_out: memset(&ea, 0, sizeof(ea)); @@ -1270,7 +1228,7 @@ void qla2x00_fcport_event_handler(scsi_qla_host_t *vha, struct event_arg *ea) complete(&abt->u.abt.comp); } -static int +int qla24xx_async_abort_cmd(srb_t *cmd_sp) { scsi_qla_host_t *vha = cmd_sp->vha; diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index bd998bf..ce64eb2 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -2706,7 +2706,7 @@ struct scsi_dif_tuple { return; abt = &sp->u.iocb_cmd; - abt->u.abt.comp_status = le32_to_cpu(pkt->nport_handle); + abt->u.abt.comp_status = le16_to_cpu(pkt->nport_handle); sp->done(sp, 0); } diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index db32822..cacb0d7 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -10,6 +10,29 @@ #include #include +static struct mb_cmd_name { + uint16_t cmd; + char *str; +} mb_str[] = { + {0xffff, "unknown"}, + {MBC_GET_PORT_DATABASE, "GPDB"}, + {MBC_GET_ID_LIST, "GIDList"}, + {MBC_GET_LINK_PRIV_STATS, "Stats"}, +}; + +static char *mb_to_str(uint16_t cmd) +{ + int i; + struct mb_cmd_name *e; + + for (i = 0; i < ARRAY_SIZE(mb_str); i++) { + e = mb_str + i; + if (cmd == e->cmd) + return e->str; + } + return mb_str[0].str; /* unknown */ +} + struct rom_cmd { uint16_t cmd; } rom_cmds[] = { @@ -2820,7 +2843,7 @@ static int is_rom_cmd(uint16_t cmd) int qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats, - dma_addr_t stats_dma, uint options) + dma_addr_t stats_dma, uint16_t options) { int rval; mbx_cmd_t mc; @@ -2830,19 +2853,17 @@ static int is_rom_cmd(uint16_t cmd) ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1088, "Entered %s.\n", __func__); - mcp->mb[0] = MBC_GET_LINK_PRIV_STATS; - mcp->mb[2] = MSW(stats_dma); - mcp->mb[3] = LSW(stats_dma); - mcp->mb[6] = MSW(MSD(stats_dma)); - mcp->mb[7] = LSW(MSD(stats_dma)); - mcp->mb[8] = sizeof(struct link_statistics) / 4; - mcp->mb[9] = vha->vp_idx; - mcp->mb[10] = options; - mcp->out_mb = MBX_10|MBX_9|MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; - mcp->in_mb = MBX_2|MBX_1|MBX_0; - mcp->tov = MBX_TOV_SECONDS; - mcp->flags = IOCTL_CMD; - rval = qla2x00_mailbox_command(vha, mcp); + memset(&mc, 0, sizeof(mc)); + mc.mb[0] = MBC_GET_LINK_PRIV_STATS; + mc.mb[2] = MSW(stats_dma); + mc.mb[3] = LSW(stats_dma); + mc.mb[6] = MSW(MSD(stats_dma)); + mc.mb[7] = LSW(MSD(stats_dma)); + mc.mb[8] = sizeof(struct link_statistics) / 4; + mc.mb[9] = cpu_to_le16(vha->vp_idx); + mc.mb[10] = cpu_to_le16(options); + + rval = qla24xx_send_mb_cmd(vha, &mc); if (rval == QLA_SUCCESS) { if (mcp->mb[0] != MBS_COMMAND_COMPLETE) { @@ -5829,3 +5850,227 @@ struct cs84xx_mgmt_cmd { return rval; } + +static void qla2x00_async_mb_sp_done(void *s, int res) +{ + struct srb *sp = s; + + sp->u.iocb_cmd.u.mbx.rc = res; + + complete(&sp->u.iocb_cmd.u.mbx.comp); + /* don't free sp here. Let the caller do the free */ +} + +/* + * This mailbox uses the iocb interface to send MB command. + * This allows non-critial (non chip setup) command to go + * out in parrallel. + */ +int qla24xx_send_mb_cmd(struct scsi_qla_host *vha, mbx_cmd_t *mcp) +{ + int rval = QLA_FUNCTION_FAILED; + srb_t *sp; + struct srb_iocb *c; + char *name; + + if (!vha->hw->flags.fw_started) + goto done; + + sp = qla2x00_get_sp(vha, NULL, GFP_KERNEL); + if (!sp) + goto done; + + sp->type = SRB_MB_IOCB; + sp->name = mb_to_str(mcp->mb[0]); + name = sp->name; + + qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); + + memcpy(sp->u.iocb_cmd.u.mbx.out_mb, mcp->mb, SIZEOF_IOCB_MB_REG); + + c = &sp->u.iocb_cmd; + c->timeout = qla2x00_async_iocb_timeout; + init_completion(&c->u.mbx.comp); + + sp->done = qla2x00_async_mb_sp_done; + + rval = qla2x00_start_sp(sp); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0xffff, + "%s: %s Failed submission. %x.\n", + __func__, sp->name, rval); + goto done_free_sp; + } + + ql_dbg(ql_dbg_mbx, vha, 0xffff, "MB:%s hndl %x submitted\n", + sp->name, sp->handle); + + wait_for_completion(&c->u.mbx.comp); + memcpy(mcp->mb, sp->u.iocb_cmd.u.mbx.in_mb, SIZEOF_IOCB_MB_REG); + + rval = c->u.mbx.rc; + switch (rval) { + case QLA_FUNCTION_TIMEOUT: + ql_dbg(ql_dbg_mbx, vha, 0xffff, "%s: %s Timeout. %x.\n", + __func__, name, rval); + break; + case QLA_SUCCESS: + ql_dbg(ql_dbg_mbx, vha, 0xffff, "%s: %s done.\n", + __func__, sp->name); + sp->free(sp); + break; + default: + ql_dbg(ql_dbg_mbx, vha, 0xffff, "%s: %s Failed. %x.\n", + __func__, sp->name, rval); + sp->free(sp); + break; + } + + return rval; + +done_free_sp: + sp->free(sp); +done: + return rval; +} + +/* + * qla24xx_gpdb_wait + * NOTE: Do not call this routine from DPC thread + */ +int qla24xx_gpdb_wait(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt) +{ + int rval = QLA_FUNCTION_FAILED; + dma_addr_t pd_dma; + struct port_database_24xx *pd; + struct qla_hw_data *ha = vha->hw; + mbx_cmd_t mc; + + if (!vha->hw->flags.fw_started) + goto done; + + pd = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &pd_dma); + if (pd == NULL) { + ql_log(ql_log_warn, vha, 0xffff, + "Failed to allocate port database structure.\n"); + goto done_free_sp; + } + memset(pd, 0, max(PORT_DATABASE_SIZE, PORT_DATABASE_24XX_SIZE)); + + memset(&mc, 0, sizeof(mc)); + mc.mb[0] = MBC_GET_PORT_DATABASE; + mc.mb[1] = cpu_to_le16(fcport->loop_id); + mc.mb[2] = MSW(pd_dma); + mc.mb[3] = LSW(pd_dma); + mc.mb[6] = MSW(MSD(pd_dma)); + mc.mb[7] = LSW(MSD(pd_dma)); + mc.mb[9] = cpu_to_le16(vha->vp_idx); + mc.mb[10] = cpu_to_le16((uint16_t)opt); + + rval = qla24xx_send_mb_cmd(vha, &mc); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0xffff, + "%s: %8phC fail\n", __func__, fcport->port_name); + goto done_free_sp; + } + + rval = __qla24xx_parse_gpdb(vha, fcport, pd); + + ql_dbg(ql_dbg_mbx, vha, 0xffff, "%s: %8phC done\n", + __func__, fcport->port_name); + +done_free_sp: + if (pd) + dma_pool_free(ha->s_dma_pool, pd, pd_dma); +done: + return rval; +} + +int __qla24xx_parse_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, + struct port_database_24xx *pd) +{ + int rval = QLA_SUCCESS; + uint64_t zero = 0; + + /* Check for logged in state. */ + if (pd->current_login_state != PDS_PRLI_COMPLETE && + pd->last_login_state != PDS_PRLI_COMPLETE) { + ql_dbg(ql_dbg_mbx, vha, 0xffff, + "Unable to verify login-state (%x/%x) for " + "loop_id %x.\n", pd->current_login_state, + pd->last_login_state, fcport->loop_id); + rval = QLA_FUNCTION_FAILED; + goto gpd_error_out; + } + + if (fcport->loop_id == FC_NO_LOOP_ID || + (memcmp(fcport->port_name, (uint8_t *)&zero, 8) && + memcmp(fcport->port_name, pd->port_name, 8))) { + /* We lost the device mid way. */ + rval = QLA_NOT_LOGGED_IN; + goto gpd_error_out; + } + + /* Names are little-endian. */ + memcpy(fcport->node_name, pd->node_name, WWN_SIZE); + memcpy(fcport->port_name, pd->port_name, WWN_SIZE); + + /* Get port_id of device. */ + fcport->d_id.b.domain = pd->port_id[0]; + fcport->d_id.b.area = pd->port_id[1]; + fcport->d_id.b.al_pa = pd->port_id[2]; + fcport->d_id.b.rsvd_1 = 0; + + /* If not target must be initiator or unknown type. */ + if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0) + fcport->port_type = FCT_INITIATOR; + else + fcport->port_type = FCT_TARGET; + + /* Passback COS information. */ + fcport->supported_classes = (pd->flags & PDF_CLASS_2) ? + FC_COS_CLASS2 : FC_COS_CLASS3; + + if (pd->prli_svc_param_word_3[0] & BIT_7) { + fcport->flags |= FCF_CONF_COMP_SUPPORTED; + fcport->conf_compl_supported = 1; + } + +gpd_error_out: + return rval; +} + +/* + * qla24xx_gidlist__wait + * NOTE: don't call this routine from DPC thread. + */ +int qla24xx_gidlist_wait(struct scsi_qla_host *vha, + void *id_list, dma_addr_t id_list_dma, uint16_t *entries) +{ + int rval = QLA_FUNCTION_FAILED; + mbx_cmd_t mc; + + if (!vha->hw->flags.fw_started) + goto done; + + memset(&mc, 0, sizeof(mc)); + mc.mb[0] = MBC_GET_ID_LIST; + mc.mb[2] = MSW(id_list_dma); + mc.mb[3] = LSW(id_list_dma); + mc.mb[6] = MSW(MSD(id_list_dma)); + mc.mb[7] = LSW(MSD(id_list_dma)); + mc.mb[8] = 0; + mc.mb[9] = cpu_to_le16(vha->vp_idx); + + rval = qla24xx_send_mb_cmd(vha, &mc); + if (rval != QLA_SUCCESS) { + ql_dbg(ql_dbg_mbx, vha, 0xffff, + "%s: fail\n", __func__); + } else { + *entries = mc.mb[1]; + ql_dbg(ql_dbg_mbx, vha, 0xffff, + "%s: done\n", __func__); + } +done: + return rval; +} diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 821e63f..e9e081b 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -1217,7 +1217,7 @@ static int qla24xx_get_loop_id(struct scsi_qla_host *vha, const uint8_t *s_id, } /* Get list of logged in devices */ - rc = qla2x00_get_id_list(vha, gid_list, gid_list_dma, &entries); + rc = qla24xx_gidlist_wait(vha, gid_list, gid_list_dma, &entries); if (rc != QLA_SUCCESS) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xf045, "qla_target(%d): get_id_list() failed: %x\n", @@ -5541,7 +5541,7 @@ static fc_port_t *qlt_get_port_database(struct scsi_qla_host *vha, fcport->loop_id = loop_id; - rc = qla2x00_get_port_database(vha, fcport, 0); + rc = qla24xx_gpdb_wait(vha, fcport, 0); if (rc != QLA_SUCCESS) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xf070, "qla_target(%d): Failed to retrieve fcport "