From patchwork Tue Dec 6 20:30:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Madhani, Himanshu" X-Patchwork-Id: 9463257 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 8C93160231 for ; Tue, 6 Dec 2016 20:46:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7E984284CD for ; Tue, 6 Dec 2016 20:46:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7371E284DC; Tue, 6 Dec 2016 20:46:51 +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 A2185284CD for ; Tue, 6 Dec 2016 20:46:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752437AbcLFUqu (ORCPT ); Tue, 6 Dec 2016 15:46:50 -0500 Received: from mail-by2nam01on0053.outbound.protection.outlook.com ([104.47.34.53]:53920 "EHLO NAM01-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751487AbcLFUqr (ORCPT ); Tue, 6 Dec 2016 15:46:47 -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=Krk1c+9wIXDBQcABEXYKE+Jpv2xaWUox2NnI32ar6ro=; b=iKNfUwDXnkhfFIeASV1UvxVx6PSOeKE2fxs0yZ0DBbDO9ZCELQOuV+91ZO6utkPQShS1GBBYC6w0X+6pY/GnnEpyDTHVNfHrnqehsG5+EFSy4S6S8NQGaTc4bqbgzorGPRsYAjwdYCoWIOSJTFVmjIWdl0px70OZU7ahcScJ9pk= Received: from SN1PR0701CA0031.namprd07.prod.outlook.com (10.162.96.41) by BY2PR07MB204.namprd07.prod.outlook.com (10.242.46.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.761.9; Tue, 6 Dec 2016 20:31:23 +0000 Received: from BN1BFFO11FD018.protection.gbl (2a01:111:f400:7c10::1:123) by SN1PR0701CA0031.outlook.office365.com (2a01:111:e400:5173::41) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.761.9 via Frontend Transport; Tue, 6 Dec 2016 20:31:21 +0000 Authentication-Results: spf=none (sender IP is 50.232.66.26) smtp.mailfrom=cavium.com; vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=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 BN1BFFO11FD018.mail.protection.outlook.com (10.58.144.81) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.734.4 via Frontend Transport; Tue, 6 Dec 2016 20:31:20 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:; UpperCasedChecksum:; SizeAsReceived:1143; Count:15 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; Tue, 6 Dec 2016 12:30:54 -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 uB6KUsT4002395; Tue, 6 Dec 2016 12:30:54 -0800 Received: (from root@localhost) by dut1171.mv.qlogic.com (8.14.7/8.14.7/Submit) id uB6KUss9002394; Tue, 6 Dec 2016 12:30:54 -0800 From: Himanshu Madhani To: , CC: , , Subject: [PATCH 14/22] qla2xxx: Add interrupt polling mechanism Date: Tue, 6 Dec 2016 12:30:43 -0800 Message-ID: <1481056251-2310-15-git-send-email-himanshu.madhani@cavium.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1481056251-2310-1-git-send-email-himanshu.madhani@cavium.com> References: <1481056251-2310-1-git-send-email-himanshu.madhani@cavium.com> MIME-Version: 1.0 X-IncomingHeaderCount: 15 X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:50.232.66.26; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(428002)(199003)(189002)(48376002)(2950100002)(42186005)(8936002)(39450400002)(38730400001)(4326007)(626004)(39410400001)(50226002)(81156014)(8676002)(47776003)(81166006)(86362001)(305945005)(101416001)(5660300001)(7846002)(36756003)(39850400001)(5001770100001)(356003)(4001430100002)(39840400001)(33646002)(6666003)(69596002)(2906002)(50466002)(189998001)(92566002)(76176999)(5003940100001)(107886002)(106466001)(50986999)(105586002)(80596001)(4720700003)(87636001); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR07MB204; H:CAEXCH02.caveonetworks.com; FPR:; SPF:None; PTR:50-232-66-26-static.hfc.comcastbusiness.net; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD018; 1:+5PxqCTTj8c9mVoXNMtKHyzFQGHcD9m+rWVVrjX7jJCHAzYI5jI2JnW9jbqJuShMUG1DrEtINNZPJ99OLLdI3UR7OnUgLIeT0LOqBA2VrofaK1p70H/z2oy+qVYeAYLaQSbOs5U7XscUe0zYrgBxKaD0hdzncOpzmbYKSJd2FBUJ5ExX8Ngvl/+ZI8y4Ui+/4x3jD7XKXKnjtTyoo7PhqeEWPwsChlqAshRGF2T8HsrLJdbjCDOqe4YjH7j0gfUT7ef6wT2g59DTFr/YDD7XUu2+MlNZ+r8r/Xkp3CG5lUc6cwkHnlc7QBECxiLAR6PZOQY669IbmDc32Bp7SMMtOtjffDSeFaC8Ywr74m3DfO2UMJkDAGyRTzs2fetIQFhLGkk4pala+bEv8gXEYcqJbGnsgL/tOmBGhBIvfJ6QbpwlNUwM4j/TI68HvB//4e7m/dx/La24wf2WgQ9yx7qcXD4ZmT4sNKFqV1VRmy0o7yQGgR3dqvMOXv7x8TbkjKcf3/nfvk7Fgk85bUvsidWk3Q== X-MS-Office365-Filtering-Correlation-Id: 8149cacc-366b-443d-d2fa-08d41e16d701 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BY2PR07MB204; X-Microsoft-Exchange-Diagnostics: 1; BY2PR07MB204; 3:f01rvfk6c+kVXKttrAN5ZklhnJf6t8V7RQeMws8UtaneroFMCJ1Z753tUt4mMtX7BYP0SXzoEFR6Ree+woS81M1/wUTyzvK2lH2ipQGxSyrAC6xOksyvqel+mdNb6Pukl5UF+zZg2LOTIAQqKAcIDN0rMWNliUamW4fABOcmAvLw3f3GbkslynNwBMImTlLKPg2SR4I37FdFt2C9jFDaEaipW/ZcBmvzD2g6DJm2/LRuJtOSNzFbPGyfEPKqKz0lci5NBwh4U7Ask88RzJKFQ0ONBOX1Wk4rzJCXIP84BnFggfDhsXYXBd+77d01F60zocLD5w+2aQHQ/bbcGvyjp4RAoxhJ69F8kERXptbcXpo= X-Microsoft-Exchange-Diagnostics: 1; BY2PR07MB204; 25:kz4GOWw3i8nlBEAlrYrcOTcHcmRg+6dTQNlmMeggfJRIsALKhUGvrN/7rBqo83RbvNAV1cqUSuxpZibzte4v28M9Qpt6dCfn7DJ5s/wDhjx5hB9S2YyitSzRqysbXhi0p2XEhVu1QTkeji0AYnzViN3HfKKH8VajkmGVKz0NmQ3wop5FYASNffmOLO33PpTu37fnKx7ZVFIsSpwzxzVNRHt2WaCIEO4pcqq0h9xzff9U0fR3eYng5xutBRBPy/7wZbEecyPHxXZb24ppJxZvduJglYheIzHv7TbjMvrSk2Q7ntqnu+anrJiaGUNpx/W1H4a0z4AApLUyq3ZNdRyKNyO4HKYCxW6oGH3FGl120bGUHScH9vDnbDUvelPhe4FLf67v4wtbyAKHpLAcU0WBGjHA+5tVJvtE/SN9phkvTxZzijdsH2oe549Z2Spkuk/E66wyidsOAVMq6Oxf8Kzck3wV+GqZzfztxz02MZA2XCdUq2Oi4ur083mG51AOOq+of++odRyZYlBRqo1ZhLKxYTfGSWIQCqveMBRrtWDbgDjLupFfj2DXCC9lwd/2gRjejAHVRCpvj+EaEOZ6VcXVUvfgZ8U/e8MDF6GHVaAr6EZffm9SXAlc7quJLpJhZ/jlszE/ED3+udUj8kT2+2vtk06iTTg+WrWXpta8Hx36mjoneN/RzPDL6IEiUnCr9dx+J2nSZtsVmbh8tXJL7XMXajjePh/lFhD983h6ow8rpQGL4+irgq1VpGXoiKVdlorRBASXwviJh+WyNW2Jjz7m2MuZoaAdI9aOx37/fnEUauAcdEknkDrkX0uvch3yZ5p+bxVlYjhBkCZ4caBddF3CZNdAC4K8w3JZEa4P8Bbc3q2K2PfZFBmIukju215lQHMB X-Microsoft-Exchange-Diagnostics: 1; BY2PR07MB204; 31:PCvPaxtYmrb6X9wPI4/rPB6kF5gNaMzet+rWC9XADqKdA7D/rOpBu8LBQAQEK9RU+m24Ww5Qky4DJF7NZd5xJgfMpPEETTMpgf8dTYaEg/s4ir2TOepuur6jUqAGrxEj2JGmDL78nT8TXDiEABJTUCs6COW5ydlNROy9CXpbMbvNqrBMXdbTP60tbw7KWbTFLEsSngLXubdwpJ5875k+RBi5pr5m8BWOVNjtnkn71kqJ2d+XZbNxIGh2mbJ/bnjf4UKW7UPAtqqW4X+2gjFjYuYDQzVtgYgurRgxYXTPmuw=; 20:5ECDz8KGt71/gvH2iM7ZsxS7MH9IDeW57J7P+KhjJnPpafBDyfCH1FdFH3dHPkQSFlxdSoGAGgJsJI/Mg+rReiX1tea2RqmbXX2uco39ffYv2IcMBpDXZeKTbzmurFagoGGKTwLEIEv9Lyk6QhsrMyFAx3tbcjhGfXmZkdM0a9+sEWvEG7nwcJ9U7hmJVg2kpScuJ3BmeeJt7bmnSPocr9pJqUvbsA9Xymo37CY9kCepiOLSASJQ6CHEyBFikOC9VwwXu3LC4Xo8WGr78Hz2ijzCEXoSoannHW/SVrbRPikLFyKKDQmMjvw2SS8SBCi/LhkX60RNoWGiOJIeTLGabxXffQT3ESJPscHvdNCp5HZfdwQHf1Vr+e1v9mhF031iFUNhIyQs1JOoi6EsWdWp1MKPRfeyPAKStMNem3ep79Vr/QJChU5ZIE+ZAEO3FXzXwFQghC2k6I7joK0G/OD6y3/Hce7tXjprLPhR4mNX9CgTrdzmRU3LbOZYrv2bSXlQ X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(13017025)(13023025)(13015025)(13024025)(13018025)(8121501046)(5005006)(10201501046)(3002001)(6041248)(20161123564025)(20161123562025)(20161123555025)(20161123560025)(6072148); SRVR:BY2PR07MB204; BCL:0; PCL:0; RULEID:; SRVR:BY2PR07MB204; X-Microsoft-Exchange-Diagnostics: 1; BY2PR07MB204; 4:MwChSS6xULrb8aOFwCxqDgPJ5PHlNmu/gCDY2yRhazenzJsXxvlh7jFajFscIbE32RcmQuve8XT4Z441C9O8dlyYsVTAYIzxFHaIdQRX9uD/ql2W28D29E3qFuyjn4ZwwN+EfXN4U09Jrh8lsRt34y7Pj8czosih+3+LG2+O+QpA0fV9OtXulsEH3rfAQ8AUh0bSMU49PRR/3M7VEWPQCHuZ280BjTJE6UGg4EEqZq766QMd30QThIqCliScLSQLmFvXVzXwzKATU/u59fQqK8pJkKI/rZgxo3flZ++uTAkBfi406bH+23k+iuN6HOTVOPzFsycxC2Gig55uBaxhbsIYYL8r81zpq/oNXs9742AvNir7QGMnSygW9b/BrO+tNWxJ2BWRd3bd/eYx1PVADNFxnTc7b1VUffVtAXfgx+rqkPZ+geYrXrOdXcUM5a67+zCGV0lhSRypsD6fEzG3qBc/Z0LLbiefoTUrmESmKumaKOaH5xww0gxyXytS/sVvLaeffSzLfSoQMvlhqC4Yy7/erQHZhQJU/+rPyuKQVBITT9N+/1UKrsg8T1Djs4UjMjF8YZVBLnMisHIocibLWHZCxbjVEc4KmS0FMCkbtxvkttnoIjoZKIWFGDT75VFP9RmihB6cVe8rqzq7EDKqV/fzutGh4U8mthkyugA+veI= X-Forefront-PRVS: 01480965DA X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR07MB204; 23:qtURlGx68E0FMOwP8+XBmWBlqe0kTwOBXT9OjS6IJm?= =?us-ascii?Q?eFsOuqSkYbp2MngifM36AI+ocIJFFRR7DZB57zPjtjiUwzIDFmz6Lj/My+Kc?= =?us-ascii?Q?1nyTnePGWrrXzQxmd/C0AyJ96K1VXtaMMMeH0mFvTL9m+9+ctsvqKeMgGhhc?= =?us-ascii?Q?gblzYRjVpD8mtISMzMhbOffgljpjEUCN5dRsSTjRDjP3VxjjUL0R4MsMEYNM?= =?us-ascii?Q?Q+bjGuPjVRiCihrH3zSRGMDm1jeijtvEvOpWTL4Ndyzv4X9WDuIO3goW2KzR?= =?us-ascii?Q?PrUkHrzM8OSRP6DfaOInirCV8QMpJuMk7bU40LqmY/W/U3jxT3oAxiRA7QD7?= =?us-ascii?Q?K1KQ8OVAiIAp8BJTR/5+6/kilr+LMoiCRbQ5hMxIaiQb5iJkXIdKDWUkP5uG?= =?us-ascii?Q?vjACjpZ59zxCFYijiPgeR82kxtJwcHmEoSKRzrTJ/+CnKF/nQWBOjINhovT/?= =?us-ascii?Q?YEeDHYX7RIzQh18EqWJuNwxFrkNpTxlYYAZwhoV953nJZd/5jAyVT33IbVXE?= =?us-ascii?Q?Um2J/eBd+zRYGmpqlJ+4HAekHH8NIfJROwwGqKoS0CtHQvipgXbGgEAiBux3?= =?us-ascii?Q?J4Vt9cIOWiLUIl0S6DVqa0bLL9fgzQOb4FphgOjq7hcsK9wMlZVo11RLCnNE?= =?us-ascii?Q?jghafSemTiYWhEitYPAEpvRoKLv4xf0uRrBd4+xZdXk81berzhX71AjG2yDy?= =?us-ascii?Q?4lym2Ybgh3lGuiK5vHPjndLsB41foY0VXok7f4ejiJRuG41XpcNKcJ48tYDj?= =?us-ascii?Q?Y4eQ6oh/gSUNkA7sl+TXkGf7oWUpp+dCtUNiJpM0/XOb3L2wsfv7Z88NEJOI?= =?us-ascii?Q?cKi0JIToGQvxdtcNFCsOlA4B5hS8UobeKDCofC0jsp2uPIV8dj5VhikZizi0?= =?us-ascii?Q?isfjGQ+teNz+IxYQNSK0tZN8h7ecr6lNM29QFhbm18vZ1glJMOp2HcwLYgD0?= =?us-ascii?Q?sDNwx/mhFhcQBAOrFDUeCmLb0XDb3SNKaCFXhBcId1hu8QMGRA7CICF5WtZU?= =?us-ascii?Q?WEO2uArokpM+MqEwRsqOPeH9UjaYk8pVW9ST+RZEHAamZEOp3TEUSVyk06m8?= =?us-ascii?Q?dylWYINcC3tGTzSk1hYtMpuYVQ+H3dUbXPOicpVJI5tJXuSvn8z36N1MwaZd?= =?us-ascii?Q?LnH7MYtW1eCMaUq0fwR2d40DGTybY5YWkYgpBzbrr1Ep5x4iioGLQxIaACFh?= =?us-ascii?Q?Kb+VA9o/4U6tk=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR07MB204; 6:Q7wWT1FYThTABVoJkFWUNoR+C7RQE9dIhg1RKoAXVsaN6/utNUreSGhs3IvU/Yg2h3B9I6b06oUXuTm5BJq7bXBbNjqsfF0IjUKSVaZYCqBhJo/4li66jTZjcOoQn3uvca6pTHnXD0aeXM6U0OrxziqK0DX6B+krK53SZOaF86uC4bgxfwvICCO52ihSBB9s3jMe8kS/pG1tz6xilbJ0gttCSQ15Ntk/efO1hGJcY96cgMWbLYHKvggke26/3ne9MRatHLQAUAaVu6vxKsV+tFXWV8AgjHd9twn8siDXuSmu+A4jZ1UktWTy2cfHN93wDjT23YgTqNpkWbcYr8RiCyBZjBOGBs5UDkH2HnlJhOlvMuZC0brLOyd+zFiKhQtr10sG48KfMb9O1fape8Ur9S6MobFhWmJBcx3FPIJhk9l1laQjlYREKGZkUlDMZ37d7aoKaOLKkk9jSmakBeTSuw==; 5:P/o9WCEXPdI27E8GpiTGhqRS2o7hsQ6r1UwAkl4AXJ6as63eT7DZIEbjoJ34kcfz+IwoIzvctYS3xcd2teE5C7DTvR6kFcbltqr2puvGAtQZjWZMN0XERFHxImOgtNRUk7i8J8LwEIhsliearTs01g==; 24:62+c93F2E1hZuXHrxUI3MWfjIva/WaqMW8W829W0ajayyeLuIKsNZT/EJzjUbmxGSO9O6flFbu49+Jsbh0HY98hV/s50g0XuqkjdZC1R54A= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR07MB204; 7:F8ZBACeogYyMCbHzZbTAjQKUkFFHCbFJu++fIw2Dl+1MOebpqJAfaEcWvaDdWUHY4M6rKVPzC8qKQJ4waAQMOK1ZXW7eT7Xm69/bx54ch77QqFl+sdPwl3k1YDaqpF5js3UoLjkcCYabMdUOg94vMwJCFRib0PRJpSkf+NtJHK9tfv7GNclniDEiaBGG7TJLZqQy77/tIP6hShgRdDqdrHTs8BfuWhRoeFu6/iSwKoXs5uqumZtFKRObkwyQJYXnGJpyTlBnrHCyNTEUq5sRFTi+uSlTB6tb2gE6Sux8gkWejygOC/QS93rBShrzE1KYpsBdYq3BSOLkOdGWEr8LowAGhDD1Ser5HnOIPLWtHAlqU6jt49QtgGnnkoNY6uaq4CO8zvAbJzkGc1KQrHbCQp1XDbWKUY4RT8UqqKCpE+6W83DxnF8X8/4RAc2x4lsE/kklTuf1YeJ8Ul5Ax+lmqw== X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Dec 2016 20:31:20.7829 (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: BY2PR07MB204 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 This patch adds capability to poll for an interrupt, If hardware does not generate any interrupt for 2 seconds. Signed-off-by: Quinn Tran Signed-off-by: Himanshu Madhani --- drivers/scsi/qla2xxx/qla_def.h | 8 +++++ drivers/scsi/qla2xxx/qla_dfs.c | 75 +++++++++++++++++++++++++++++++++++++++ drivers/scsi/qla2xxx/qla_gbl.h | 1 + drivers/scsi/qla2xxx/qla_isr.c | 22 ++++++++++-- drivers/scsi/qla2xxx/qla_os.c | 31 ++++++++++++++++ drivers/scsi/qla2xxx/qla_target.c | 6 ++++ 6 files changed, 141 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 6bf7ff9..09da61f 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -2921,6 +2921,10 @@ struct qla_msix_entry { void *handle; struct irq_affinity_notify irq_notify; int cpuid; + irqreturn_t (*irq_handler)(int, void *); + u32 intr_cnt; + u32 last_intr_cnt; + struct work_struct intr_work; }; #define WATCH_INTERVAL 1 /* number of seconds */ @@ -3826,6 +3830,10 @@ struct qla_hw_data { struct qlt_hw_data tgt; int allow_cna_fw_dump; + + int irqpoll_interval, irqpoll_cnt; + struct dentry *dfs_irqpoll; +#define MAX_IRQPOLL_INTV 30 }; struct qla_tgt_counters { diff --git a/drivers/scsi/qla2xxx/qla_dfs.c b/drivers/scsi/qla2xxx/qla_dfs.c index f69ff52..18cedf7 100644 --- a/drivers/scsi/qla2xxx/qla_dfs.c +++ b/drivers/scsi/qla2xxx/qla_dfs.c @@ -12,6 +12,68 @@ static struct dentry *qla2x00_dfs_root; static atomic_t qla2x00_dfs_root_count; + +static int +qla_dfs_irqpoll_show(struct seq_file *s, void *unused) +{ + struct scsi_qla_host *vha = s->private; + struct qla_hw_data *ha = vha->hw; + + seq_printf(s, "IRQ poll interval: %d Seconds (max=%d, def=0/off)\n", + ha->irqpoll_interval, MAX_IRQPOLL_INTV); + + return 0; +} + +static ssize_t qla_dfs_irqpoll_write(struct file *file, const char __user *ubuf, + size_t len, loff_t *offp) +{ + struct seq_file *s = file->private_data; + char *buf; + int ret = 0; + int interval = 0; + struct scsi_qla_host *vha = s->private; + struct qla_hw_data *ha = vha->hw; + + buf = memdup_user(ubuf, len); + if (IS_ERR(buf)) + return PTR_ERR(buf); + + if (sscanf(buf, "%d", &interval) != 1) + return -EINVAL; + + if (interval > MAX_IRQPOLL_INTV || interval < 0) + return -ERANGE; + + ha->irqpoll_interval = interval; + + if (ha->irqpoll_interval == 0) + ql_log(ql_log_info, vha, 0xffff, + "IRQ Poll turned off.\n"); + else + ql_log(ql_log_info, vha, 0xffff, + "IRQ Poll turned on(%d).\n", ha->irqpoll_interval); + + + kfree(buf); + return (ret) ? ret : len; +} + +static int +qla_dfs_irqpoll_open(struct inode *inode, struct file *file) +{ + struct scsi_qla_host *vha = inode->i_private; + return single_open(file, qla_dfs_irqpoll_show, vha); +} + +static const struct file_operations dfs_irqpoll = { + .open = qla_dfs_irqpoll_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .write = qla_dfs_irqpoll_write, +}; + static int qla2x00_dfs_irq_cpuid_show(struct seq_file *s, void *unused) { @@ -357,6 +419,14 @@ goto out; } + ha->dfs_irqpoll = debugfs_create_file("irq_poll_interval", + S_IRUSR, ha->dfs_dir, vha, &dfs_irqpoll); + if (!ha->dfs_irqpoll) { + ql_log(ql_log_warn, vha, 0xffff, + "Unable to create debugFS irq_poll_interval node.\n"); + goto out; + } + out: return 0; @@ -367,6 +437,11 @@ { struct qla_hw_data *ha = vha->hw; + if (ha->dfs_irqpoll) { + debugfs_remove(ha->dfs_irqpoll); + ha->dfs_irqpoll = NULL; + } + if (ha->dfs_irq_cpuid) { debugfs_remove(ha->dfs_irq_cpuid); ha->dfs_irq_cpuid = NULL; diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 3593a39..944f37a 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -140,6 +140,7 @@ int qla24xx_post_newsess_work(struct scsi_qla_host *, port_id_t *, extern int ql2xexlogins; extern int ql2xexchoffld; extern int ql2xfwholdabts; +extern struct workqueue_struct *qla_wq; extern int qla2x00_loop_reset(scsi_qla_host_t *); extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int); diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index c7f73b1..eee98c9 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -3003,6 +3003,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha, } ha = rsp->hw; reg = &ha->iobase->isp24; + ha->msix_entries[1].intr_cnt++; spin_lock_irqsave(&ha->hardware_lock, flags); @@ -3047,6 +3048,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha, ha = rsp->hw; reg = &ha->iobase->isp24; status = 0; + ha->msix_entries[0].intr_cnt++; spin_lock_irqsave(&ha->hardware_lock, flags); vha = pci_get_drvdata(ha->pdev); @@ -3150,6 +3152,16 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha, return IRQ_HANDLED; } +static +void qla_irq_poll(struct work_struct *work) +{ + struct qla_msix_entry *qentry = + container_of(work, struct qla_msix_entry, intr_work); + + if (qentry) + qentry->irq_handler(qentry->vector, qentry->handle); +} + /* Interrupt handling helpers. */ struct qla_init_msix_entry { @@ -3235,18 +3247,23 @@ struct qla_init_msix_entry { rsp->msix = qentry; scnprintf(qentry->name, sizeof(qentry->name), msix_entries[i].name); - if (IS_P3P_TYPE(ha)) + if (IS_P3P_TYPE(ha)) { ret = request_irq(qentry->vector, qla82xx_msix_entries[i].handler, 0, qla82xx_msix_entries[i].name, rsp); - else + + qentry->irq_handler = qla82xx_msix_entries[i].handler; + } else { ret = request_irq(qentry->vector, msix_entries[i].handler, 0, msix_entries[i].name, rsp); + qentry->irq_handler = msix_entries[i].handler; + } if (ret) goto msix_register_fail; qentry->have_irq = 1; qentry->in_use = 1; + INIT_WORK(&qentry->intr_work, qla_irq_poll); /* Register for CPU affinity notification. */ irq_set_affinity_notifier(qentry->vector, &qentry->irq_notify); @@ -3278,6 +3295,7 @@ struct qla_init_msix_entry { qentry->have_irq = 1; qentry->irq_notify.notify = qla_irq_affinity_notify; qentry->irq_notify.release = qla_irq_affinity_release; + qentry->irq_handler = msix_entries[QLA_ATIO_VECTOR].handler; /* Register for CPU affinity notification. */ irq_set_affinity_notifier(qentry->vector, &qentry->irq_notify); diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 4be58b0..18795c3 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -36,6 +36,9 @@ * CT6 CTX allocation cache */ static struct kmem_cache *ctx_cachep; + +struct workqueue_struct *qla_wq; + /* * error level for logging */ @@ -5895,6 +5898,26 @@ void qla2x00_relogin(struct scsi_qla_host *vha) qla2xxx_wake_dpc(vha); } + if (ha->irqpoll_interval && ha->msix_count && + (atomic_read(&vha->loop_state) == LOOP_READY) && + (IS_QLA83XX(ha) || IS_QLA27XX(ha))) { + + struct qla_msix_entry *qentry; + + ha->irqpoll_cnt++; + if (ha->irqpoll_cnt >= ha->irqpoll_interval) { + ha->irqpoll_cnt = 0; + /* scan default & rspq 1 */ + for (index = 0; index < 2; index++) { + qentry = &ha->msix_entries[index]; + if (qentry->last_intr_cnt == qentry->intr_cnt) { + queue_work_on(qentry->cpuid, qla_wq, &qentry->intr_work); + } + qentry->last_intr_cnt = qentry->intr_cnt+1; + } + } + } + qla2x00_restart_timer(vha, WATCH_INTERVAL); } @@ -6369,6 +6392,13 @@ struct fw_blob * { int ret = 0; + qla_wq = alloc_workqueue("qla_wq", WQ_MEM_RECLAIM, 0); + if (!qla_wq) { + ql_log(ql_log_fatal, NULL, 0xffff, + "Unable to allocate qla_wq...Failing load!.\n"); + return -ENOMEM; + } + /* Allocate cache for SRBs. */ srb_cachep = kmem_cache_create("qla2xxx_srbs", sizeof(srb_t), 0, SLAB_HWCACHE_ALIGN, NULL); @@ -6455,6 +6485,7 @@ struct fw_blob * kmem_cache_destroy(ctx_cachep); fc_release_transport(qla2xxx_transport_template); fc_release_transport(qla2xxx_transport_vport_template); + destroy_workqueue(qla_wq); } module_init(qla2x00_module_init); diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index e6b2a45..cc24d1a 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -7138,8 +7138,14 @@ static void qlt_disable_vha(struct scsi_qla_host *vha) unsigned long flags; rsp = (struct rsp_que *) dev_id; + if (!rsp) { + ql_log(ql_log_info, NULL, 0xffff, + "%s: NULL atio queue pointer.\n", __func__); + return IRQ_NONE; + } ha = rsp->hw; vha = pci_get_drvdata(ha->pdev); + ha->msix_entries[2].intr_cnt++; spin_lock_irqsave(&ha->tgt.atio_lock, flags);