From patchwork Mon Jan 23 18:08:54 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: 9533795 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 192F26042F for ; Tue, 24 Jan 2017 00:47:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 05A5427C05 for ; Tue, 24 Jan 2017 00:47:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EE1D127E33; Tue, 24 Jan 2017 00:47:27 +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 AFDD327C05 for ; Tue, 24 Jan 2017 00:47:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751936AbdAXArT (ORCPT ); Mon, 23 Jan 2017 19:47:19 -0500 Received: from mail-by2nam03on0084.outbound.protection.outlook.com ([104.47.42.84]:10432 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751355AbdAXArB (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=NlyuxPVWLwkLZw5zZ6HzBJQElETITiSNSA3VEuM5Xvk=; b=WkdENO0Fxy9q3zOhKQSdl27P98tGwlBLBtqNmDG5VLnsQSxnumYDhtNMIHJibmtw6cgkrB6PlFyaCmPSuNsNQX1JUbqs1+BNNf//cozNwXa6Vm6EoI+aGULfZKmcHSOtX9exAWeRVbwm8cZXSa85ZQ25EO539yicMyKA3yRoRRA= Received: from BN1PR02CA0015.namprd02.prod.outlook.com (10.141.56.15) by DM2PR0201MB0990.namprd02.prod.outlook.com (10.160.219.12) 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:00 +0000 Received: from BL2FFO11FD022.protection.gbl (2a01:111:f400:7c09::133) by BN1PR02CA0015.outlook.office365.com (2a01:111:e400:2a::15) 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:00 +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:45:59 +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:49 -0800 From: Raghava Aditya Renukunta To: , , CC: , , , Subject: [PATCH 10/24] aacraid: Reworked aac_command_thread Date: Mon, 23 Jan 2017 10:08:54 -0800 Message-ID: <20170123180908.3465-11-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)(6009001)(7916002)(39840400002)(39450400003)(39860400002)(39850400002)(39410400002)(2980300002)(428002)(189002)(199003)(189998001)(4326007)(97736004)(5001770100001)(5660300001)(38730400001)(1076002)(8676002)(107886002)(2950100002)(50226002)(77096006)(54906002)(2906002)(8936002)(104016004)(305945005)(5003940100001)(6666003)(626004)(356003)(81156014)(36756003)(50986999)(76176999)(57986006)(76506005)(68736007)(2201001)(81166006)(101416001)(53936002)(92566002)(4001430100002)(69596002)(86362001)(47776003)(50466002)(106466001)(105586002)(48376002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM2PR0201MB0990; H:avsrvexchhts1.microsemi.net; FPR:; SPF:None; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD022; 1:ZG1/8EEWidQN54G8bjHmo/fr8evqZlxz0YoK1D4cAQbjd8FPN8vZS0t/DPjOeMeW8mc6ieHYW7JstgLdejC7n4n1mEFo9Tx1IjBH8gkyLPZtSfUZcdbZT59svmX8JXXeQ0PnsJUPBS3GAwdD+OZyzc4m/je/HfY4tQgZTtEAK+9kQCg3BS/8Tg6yyPCzKR9mXfHq+3N3KaaPDkLiaoOfIf9pPYvAzND5cijO97gt29L3eLBLWC6AESE67+RQJ1oGCQRLKpI19BqRet6f3DKqlWM9VlSiTnlTPzcnPgsdzP7FGetDZBbpGFNiBAlmvVrw7VitvBGJuzMMqRXapWJEbnRLv7jad1YSp2Qig0kzJSj5eOB955g/hNgzauWwy5IQp+ifgHUvXEJG5aCFINI8CpuOyoBMahC4qv74TWI9QNQwsWXfOwe5UxkAwrufkV0iw8J6ZQYNmfqWZ/1JqK9eH1e/BhMmxOjzb/+Rsnt9pMVXPOfn2Mzr2VDJX2JygR2b7T21tGEvzdiVqLu0G1lpiddpl0scbQqAFwxewHvGAwAWDeq+ERlvIoQwgwaM6dZS X-MS-Office365-Filtering-Correlation-Id: 9f51bc1e-1f24-401b-9905-08d443f25dd6 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:DM2PR0201MB0990; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0201MB0990; 3:En6LT2csGnrMncC+/KHAEblSW48Zm3mSuW+ek0g9zSSLmPgZHDMgN0+v9uh2n0o8vCAWh+/0rQn9rlo5dELQRzsCh6S01O75oN9mUwj9TWTu8yHTXEebLFgCZCdBlhMUKyZSLozhQfWZgPxUCr3tecD3IdiRO2STg7nNb1+Hu17lWcZeQ1h9fhf+VFNC/JOK/j574kLnBOADKyT0buRtgeRHHYYklw0P1HawHgW0s7ikXeKovUO44SxfWRjoiFwKAJD1dc6wZE74f/UBj6b7H0pB/o9v92zxsvjDdgMRusFMONKi2krElzjmMpGPneQNDPrxPXBPKyPcLoW4WhmHvzCOdSdO1inT/H4y8DHnn9tq2iwma/YEVVy2kkAzqjVb X-Microsoft-Exchange-Diagnostics: 1; DM2PR0201MB0990; 25:NjA/D22FKi8Tmp/txnMaosTqBqjmvP0j874CHQAHgUR082Gj/Mq8tk1MDFicIe1B6g39hrOXSgLxEN8xnz/B3uLVsU9EUyZDKzhYEzvvkH4uFhswDmH/vk5JIuHPWDgpG7TqnKeQJncbLfMdMnqNqiM/R/DYs4GCpWZ6rrn8F/JJi+8E5yesfOdbqPpRb8uwMBr6FE/5sJk+PvcTLw6HvvLss7J+XGLi7zthQ4/3B21/Cca7o60kkNtWm2VK8rgd9BlrGV6TQlMM1QHzXjpZMpCli4KxjC1kYF+NGm4BVY6x2V9yJcppS1/f+Rxy8Myt86lFV4moeS3VeuslM1/sxvJ5rn/U2ml7JT/v/1r/I+txQpmae+VXMqt2JkkhvdL2fXawJKIylHVF6m76mqEO3D+Z6n0FIS6U16A+FhgGV+GazCgGS9e8cAtRT/BgDE2Nh9pXs9rCGspNyvD+g6daxtkZYx27dB18nBtlo+sSdGwCEiy75aJAZgA0FKiapaqRcdUpl6iYUS+4ZWMcpgKB6PsmW0pzPC76Sy958OgCxJIYv3KyznD+f9jCBoZG5NqBQBt53RBfLHrVGo+2oiOfiL3xe4P7VHmcwyS4/mg1Qt14RGY6luh0QNMW+2PaZvqUjGUik2x+ukXsaEKcpROS9nh8pX6xgTDg+B1DjDQfTViezHnMzasvxSjiSAV+2axyrZvEPwnH3OPZMj9nnzSNBZ0SQoeWaB+evN3O3kSqS1xOrVSBbNIbyGxEacf983hXs93aoWbI4TRnNr+FmoJarybaNIu1toTp+/iT0C0fVIDVWRrbMIVFkQhNnZulZ+458mdWOcgKDrVvEoFtLtyFBEGtWFeNnCcECuyV3Jqd/BsbXO4A3x0l56qgseBBjJj6 X-Microsoft-Exchange-Diagnostics: 1; DM2PR0201MB0990; 31:b8vB7HiafHfkAPaSfbaWlVukcFW2A4b6Os47b/rLGISbn01GQK/BU1NtWBzYZzM//y+6nzjkLBzvojE/FoejTkOBIoUAZ28odsyriVXPfgNjTxmy4tQDrcdZJ6m4iSqhollUn8ELcfclOE2tyE6kk1l82UV6Lu7IUFWrDnY+mGd7TWO5jKA42O2MhdtBxQl4RLw/2UkpfK1N9RUFEbVyPhIUQbd95dbWIJHoI92WpScJvGZyIsqjDFl7w7k1yBlcfVWtxLl+3+RVuwzoC4mxCg==; 20:t6uWrPDJ/RKv8cCVzavarxAuLtVcwedWbH+3zmi8kYq5YOJGeEheSfmkVLLF9naMwhY167VJ6GT1XbC43Twx39/Jf9Vx0vavo9LRJbB/tHSgJQXY9onqFq5DTReRzRoA9GYbKB+VSFrDAo2/23QDojSJ2ZBuIWlnw5Uaw5L+au2Wbb2Z7Wjo3tuQX6SRIB4fGwosawAPRWiAGJVXYcu2AFiUsRYS3SVGt6D3QxFwlePgpFTLvG8YW80ADt4Lpg+BcJ3pIBAT2MoXkrOGVZS3o0S8CzCOCt1xFYKyry2z5LXw9ZhNbnk6TwIluoYs3BRkeQzcF/AXCtz/IJzXAwRMDWK9YrTc9NTQPAkvbC7F/KnsCWvzd3i/bFBHl4EcuyRCpkp7CHpZ+0rjkzchV1vEf8W1V87jcb51XqW0iF+KrZfNEZ+0nqi5nly5yL3N2F5xMRhGe6Sx9XHllw8UHNjwz5Svxk+Xrzou9VKDjbgH7KF2/zK/ralnfPU6QumXzpg+ 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)(13018025)(13017025)(13015025)(13023025)(13024025)(8121501046)(5005006)(10201501046)(3002001)(6055026)(6041248)(20161123555025)(20161123560025)(20161123558021)(20161123564025)(20161123562025)(6072148); SRVR:DM2PR0201MB0990; BCL:0; PCL:0; RULEID:; SRVR:DM2PR0201MB0990; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0201MB0990; 4:dIKDALoGQ2FVaLVYqe2DwuoAvBxV8rrvdRe7YacIcsgE5NDB/H64Ibs5VcWIGN1GB38pCEvMIzzwTKRavI1OiTDDRf65YHZiCedsKbTDXQtULPX8X0Lb1IISmjeKJAm+zVUpill6+R26mkjYFkJ55dtDdi13iZvKBoCvFQUZAgketNGxv61fC3pvvq/NT2qrF+18FMwEkaaf2ZkMQfs6rwveKeJp8AuPAnsoD2wNkusGmR+SFZiFu3my3I8AQcp87ewRU049eYQL/ZxCyJEe4QmTJcZAMexibzOdF3woNO0p9R4dux4NS+3OIPJmXP9SR4dEIQOqAj73kpMoYUmYJ2F0wEyxHKLwByUl9BTmOBIhSNKqaDX7r1s9Yj8IPo9MrZdg+SbdQ7pRQLKIZISmjXExZlV9s5NfHr8vFbUCfIf4jJMxaW+DpcY1YW3vMb8qxSHLFYF/0pcZmfyCo7FGAaEXtvPPXm/oEaS26LBgMTzwdbMg6LVz/Y2v9jdmaDqNtfnsw8sQFhQRJ9zKODwNE9XldUrMA66TeVCU1jHKSBsChcLBpFYLCugJRKCkTgib7W6xXGgUcmazpbLbVbwMx4JYVPzIXqxlVeMO6xDKj+EJHmLV1eGNVX7X4bxSzJojLAE42+JbGS0ZCp5hcPeylxjf4wZ8TjhLjUJPeGIWB9arB8ZbZn2QRLca9+Ycowx14pknkXUcdGCG+f/oAsgxYTbNA/3qgfvXT7O+zW1aFQMutSFsKJNZHPGLTwEY7CbkpFc1gnbdoShRQmAbFnJUbQ== X-Forefront-PRVS: 0197AFBD92 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0201MB0990; 23:eTGsDd9usrk27tErL+Q94UE/4pEsEze+6qKA+dw?= =?us-ascii?Q?DPQWKhyQiPSsaCjlgBWl+hStdwncEpJtiAzDuk41X2HldRGtT00oCNOSdPCw?= =?us-ascii?Q?a4vv6TDTRBo0+gVQBwI54ku9y+mf7vAAxtkxvmhNri5SJ9ZS/yQSx4Ln55tA?= =?us-ascii?Q?fssZwdci0yvfXZwZlX/NPjNFP6r+bFdletBMGLYOCX8nlGcUhmLmW5bLKS8p?= =?us-ascii?Q?9fa5DovdiOZfCp9ZUY5++DEt9uIRYwogzEU83rOyUagiMBx6nnKsCGS8jPXY?= =?us-ascii?Q?L/s8sY4MxNS/mQVef8P5NW3Z1vtRpSOcIx/FThxkjXOL2CKbOrvr2ZzQoyze?= =?us-ascii?Q?F7rJMKF7EyadBKDft/C6nd6+RFYoHzWtVhBUBfhB7yO4o4Z5/rHPX3i3XYp8?= =?us-ascii?Q?4FzHz8tGR4u/AXdoru63Oobg01FuT69UdQRNz1aWLcjyyrRrVAmzQkzjmcUH?= =?us-ascii?Q?9aX2qbIW4v9v1k92bx1k8IXKNugun8v/ylCrlT15bNJ2NST/s1wJpGXUGsKW?= =?us-ascii?Q?DBERLV3B2QFeEPAbJNcLl1gN+oxrXbIIGJgmAOmyvpH1dISG0yTQ8P0DiDlj?= =?us-ascii?Q?I+J4sf6AAui3sw7VoausKEsOGUVy02mQzzeirlKAoJjPERjvcrPlvWnTLcoq?= =?us-ascii?Q?Kk+9a5lyCuLBiBnl+hwSM3b1O3jAylDuZuyNx+AmMiWwS7bz73tjo5q/yQvu?= =?us-ascii?Q?EWaLdlBdcbButWfFrB7OJS0niWQOuKCvyyVpD6tkaFeaqpdJ5eMTBW6NOCsR?= =?us-ascii?Q?MuxDvL8aQsC5q2gn4D35hCYoCfz5Ku5a7nxbwJV7QTPstqmzWTzpq9/ZGZPv?= =?us-ascii?Q?UYzvAAeQ6llRlZc6GQ1j1gzWQlysiOHNnw1XQBAYSTGfgdIG/MkiUhxT8GUs?= =?us-ascii?Q?1FLlWROEfq0Ohlo1mUWXxEu0RLQIVfdIv4FbfzXKomyQKoBFLxZ3dzNgGcWk?= =?us-ascii?Q?fWGUoEfXUTTPaRl/6HIUvtFC7Fg2Vae6PhfRFVlwsRC+JAWJhlD2qdajWq34?= =?us-ascii?Q?doP9gamCQZMyrFUFvqxUdzpuSdIJbMQqjr/9tgrXNQxPI8INV5I4iJRdKQtW?= =?us-ascii?Q?bFfK6jlUpWpnSae3+roSFAJrJnyfklmmBoA21YQNTEvGZdhr5u5kfp+OKWbj?= =?us-ascii?Q?9qdAQXYfPu6O/xiZftcsILOc3svxnfNBQMx2f5+hGgZyWPH1G9b/pRsxQH5e?= =?us-ascii?Q?MkQEyxdgbsNECW4uVHD76EkTLJ5QLVmTRyXpatTfMrJ1L4FMgGsRlX25tRL3?= =?us-ascii?Q?ewQVQCCjs2Yka1Mf1I/mQimkjmF4cJINz64/TI+e6e6YvzmfLG3+/JplEWoR?= =?us-ascii?Q?mzQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0201MB0990; 6:29cJgXOe7kZ8Y3bVI7pXixC2EdVjN1TsJUQ52Y501Jzw6tlvT2mguDp+0mDby7Eh6OmF+UCNr7OIO+W8K0H18j+nkLZWVX3tk0XdlMYcfEuyHw68q68U/wwPHY2ujfkwGD/0WFa6AzAHKAgF0+r87CBXRAaONJLrd3iJNJUJmz2g32cbdRZ8NctNZyhD9hDI/38XQfM4pkzedGm2uiTeMqauUs0fe7zE037l13rIk5JjfYb/hg3N3vHPC6YZruAgt6+BzdsFAiv/mIIVxPM+kW4UShiUKApi4eQtSl2T65Bi1zLSaJjQ4GhoDMDkHV0E8sRoDnJq4dnjO6SplQ8jmqtFRzz4egeeAw/vTJZjaIMs3/HtOrtsAWF4ObpZao2PY95YjkhxfPccX0XpWG+Ii1uoAjp2eCDrIOBankAtQlBLzw059ax8Lvw4TcDQRlGD/IveOStFIpFaw8ig8o+Ebg==; 5:eSjubhNRjglw0Xv2rEN9R2isLUEXsewq6JMFYjsfMFBNYGsnRpsXCsfwZZjGGMwjFy/BSiFjcdhnKyohaFr0ViOENw7jMzBwTXSmgRMQeaHks94XKUtlCBe2FnQcEMWdYPTHYjQJZO8jceUd2KB/tw==; 24:/X3nuelvqu7sxH+OVbRO6edfYL2NpFg1IGI07NF08X0aaRKYbhPuBJxisXjAI8HM00zPdVX8IENyU94jM7RY58Kmmw26pbEjsZkV43of0Qw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM2PR0201MB0990; 7:/02MoGc8lPWjIj1YuAc6Qcfvr7F/OJH7MkKsfU6S64OmN4JPvaZz6TpdN9FKhktM738tntpa+RNcp0DbvHG5owmJxpB/VFip17xh4sCBlUjYbNns+hTT9WKLcXUjgfkWjPN3kwVNgPgEapkbS3hRixTNsBH/qQsLBKgCHwK0sn2M0toKFRL0kEjn+m6GzYAcqyuqKPZ/fE3YY29VZFElNZVvmG1KXPD5ItlCh73M71dQZK6Ee1ha6x563d8eF/bkmwX7wuNcET9eo6ERHpVDOP7xQqErr8zqlsnzhqq8gvTIjIIo3sSt6dvH/AUym9rVaynL+3ozIdTR7Y1G0K1hSPhxhXS+Fu8GTbz7+ty1bhIumTkBaLj+tys+3m71miVjtqJR6oEJUlEzE6dlhEOsABMV5jTmlFi90inC9KsQsqq9AoNbAnbZ3IYjX8FEyYDhHL1AlUbzz6DIQfovVMH7Gg== X-OriginatorOrg: microsemi.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jan 2017 00:45:59.8298 (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: DM2PR0201MB0990 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 Reworked aac_command_thread into aac_process_events Signed-off-by: Raghava Aditya Renukunta Signed-off-by: Dave Carroll --- drivers/scsi/aacraid/commsup.c | 410 ++++++++++++++++++++++------------------- 1 file changed, 217 insertions(+), 193 deletions(-) diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 31c65ca..dd5819c 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c @@ -1729,6 +1729,222 @@ int aac_check_health(struct aac_dev * aac) return BlinkLED; } +static void aac_process_events(struct aac_dev *dev) +{ + struct hw_fib *hw_fib, *hw_newfib; + struct fib *fib, *newfib; + struct aac_fib_context *fibctx; + unsigned long flags; + spinlock_t *t_lock; + + spin_lock_irqsave(dev->queues->queue[HostNormCmdQueue].lock, flags); + while (!list_empty(&(dev->queues->queue[HostNormCmdQueue].cmdq))) { + struct list_head *entry; + struct aac_aifcmd *aifcmd; + u32 time_now, time_last; + unsigned long flagv; + unsigned int num; + struct hw_fib **hw_fib_pool, **hw_fib_p; + struct fib **fib_pool, **fib_p; + + set_current_state(TASK_RUNNING); + + entry = dev->queues->queue[HostNormCmdQueue].cmdq.next; + list_del(entry); + + + t_lock = dev->queues->queue[HostNormCmdQueue].lock; + spin_unlock_irqrestore(t_lock, flags); + + fib = list_entry(entry, struct fib, fiblink); + hw_fib = fib->hw_fib_va; + /* + * We will process the FIB here or pass it to a + * worker thread that is TBD. We Really can't + * do anything at this point since we don't have + * anything defined for this thread to do. + */ + memset(fib, 0, sizeof(struct fib)); + fib->type = FSAFS_NTC_FIB_CONTEXT; + fib->size = sizeof(struct fib); + fib->hw_fib_va = hw_fib; + fib->data = hw_fib->data; + fib->dev = dev; + /* + * We only handle AifRequest fibs from the adapter. + */ + + aifcmd = (struct aac_aifcmd *) hw_fib->data; + if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) { + /* Handle Driver Notify Events */ + aac_handle_aif(dev, fib); + *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); + aac_fib_adapter_complete(fib, (u16)sizeof(u32)); + continue; + } + /* + * The u32 here is important and intended. We are using + * 32bit wrapping time to fit the adapter field + */ + + + /* Sniff events */ + if ((aifcmd->command == cpu_to_le32(AifCmdEventNotify)) || + (aifcmd->command == + cpu_to_le32(AifCmdJobProgress))) { + aac_handle_aif(dev, fib); + } + + time_now = jiffies/HZ; + + /* + * Warning: no sleep allowed while + * holding spinlock. We take the estimate + * and pre-allocate a set of fibs outside the + * lock. + */ + num = le32_to_cpu(dev->init->r7.AdapterFibsSize) + / sizeof(struct hw_fib); /* some extra */ + spin_lock_irqsave(&dev->fib_lock, flagv); + entry = dev->fib_list.next; + while (entry != &dev->fib_list) { + entry = entry->next; + ++num; + } + spin_unlock_irqrestore(&dev->fib_lock, flagv); + hw_fib_pool = kmalloc_array(num, sizeof(struct hw_fib *), + GFP_KERNEL); + fib_pool = kmalloc_array(num, sizeof(struct fib *), + GFP_KERNEL); + if (num && fib_pool && hw_fib_pool) { + hw_fib_p = hw_fib_pool; + fib_p = fib_pool; + while (hw_fib_p < &hw_fib_pool[num]) { + *(hw_fib_p) = kmalloc(sizeof(struct hw_fib), + GFP_KERNEL); + if (!(*(hw_fib_p++))) { + --hw_fib_p; + break; + } + *(fib_p) = kmalloc(sizeof(struct fib), + GFP_KERNEL); + if (!(*(fib_p++))) { + kfree(*(--hw_fib_p)); + break; + } + } + num = hw_fib_p - hw_fib_pool; + if (!num) { + kfree(fib_pool); + fib_pool = NULL; + kfree(hw_fib_pool); + hw_fib_pool = NULL; + continue; + } + } else { + kfree(hw_fib_pool); + hw_fib_pool = NULL; + kfree(fib_pool); + fib_pool = NULL; + } + spin_lock_irqsave(&dev->fib_lock, flagv); + entry = dev->fib_list.next; + /* + * For each Context that is on the + * fibctxList, make a copy of the + * fib, and then set the event to wake up the + * thread that is waiting for it. + */ + hw_fib_p = hw_fib_pool; + fib_p = fib_pool; + while (entry != &dev->fib_list) { + /* + * Extract the fibctx + */ + fibctx = list_entry(entry, struct aac_fib_context, + next); + /* + * Check if the queue is getting + * backlogged + */ + if (fibctx->count > 20) { + /* + * It's *not* jiffies folks, + * but jiffies / HZ so do not + * panic ... + */ + time_last = fibctx->jiffies; + /* + * Has it been > 2 minutes + * since the last read off + * the queue? + */ + if ((time_now - time_last) > aif_timeout) { + entry = entry->next; + aac_close_fib_context(dev, fibctx); + continue; + } + } + /* + * Warning: no sleep allowed while + * holding spinlock + */ + if (hw_fib_p < &hw_fib_pool[num]) { + hw_newfib = *hw_fib_p; + *(hw_fib_p++) = NULL; + newfib = *fib_p; + *(fib_p++) = NULL; + /* + * Make the copy of the FIB + */ + memcpy(hw_newfib, hw_fib, + sizeof(struct hw_fib)); + memcpy(newfib, fib, sizeof(struct fib)); + newfib->hw_fib_va = hw_newfib; + /* + * Put the FIB onto the + * fibctx's fibs + */ + list_add_tail(&newfib->fiblink, + &fibctx->fib_list); + fibctx->count++; + /* + * Set the event to wake up the + * thread that is waiting. + */ + up(&fibctx->wait_sem); + } else { + pr_warn("aifd: didn't allocate NewFib.\n"); + } + entry = entry->next; + } + /* + * Set the status of this FIB + */ + *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); + aac_fib_adapter_complete(fib, sizeof(u32)); + spin_unlock_irqrestore(&dev->fib_lock, flagv); + /* Free up the remaining resources */ + hw_fib_p = hw_fib_pool; + fib_p = fib_pool; + while (hw_fib_p < &hw_fib_pool[num]) { + kfree(*hw_fib_p); + kfree(*fib_p); + ++fib_p; + ++hw_fib_p; + } + kfree(hw_fib_pool); + kfree(fib_pool); + kfree(fib); + spin_lock_irqsave(dev->queues->queue[HostNormCmdQueue].lock, + flags); + } + /* + * There are no more AIF's + */ + spin_unlock_irqrestore(dev->queues->queue[HostNormCmdQueue].lock, + flags); +} /** * aac_command_thread - command processing thread @@ -1743,10 +1959,6 @@ int aac_check_health(struct aac_dev * aac) int aac_command_thread(void *data) { struct aac_dev *dev = data; - struct hw_fib *hw_fib, *hw_newfib; - struct fib *fib, *newfib; - struct aac_fib_context *fibctx; - unsigned long flags; DECLARE_WAITQUEUE(wait, current); unsigned long next_jiffies = jiffies + HZ; unsigned long next_check_jiffies = next_jiffies; @@ -1766,196 +1978,8 @@ int aac_command_thread(void *data) set_current_state(TASK_INTERRUPTIBLE); dprintk ((KERN_INFO "aac_command_thread start\n")); while (1) { - spin_lock_irqsave(dev->queues->queue[HostNormCmdQueue].lock, flags); - while(!list_empty(&(dev->queues->queue[HostNormCmdQueue].cmdq))) { - struct list_head *entry; - struct aac_aifcmd * aifcmd; - set_current_state(TASK_RUNNING); - - entry = dev->queues->queue[HostNormCmdQueue].cmdq.next; - list_del(entry); - - spin_unlock_irqrestore(dev->queues->queue[HostNormCmdQueue].lock, flags); - fib = list_entry(entry, struct fib, fiblink); - /* - * We will process the FIB here or pass it to a - * worker thread that is TBD. We Really can't - * do anything at this point since we don't have - * anything defined for this thread to do. - */ - hw_fib = fib->hw_fib_va; - memset(fib, 0, sizeof(struct fib)); - fib->type = FSAFS_NTC_FIB_CONTEXT; - fib->size = sizeof(struct fib); - fib->hw_fib_va = hw_fib; - fib->data = hw_fib->data; - fib->dev = dev; - /* - * We only handle AifRequest fibs from the adapter. - */ - aifcmd = (struct aac_aifcmd *) hw_fib->data; - if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) { - /* Handle Driver Notify Events */ - aac_handle_aif(dev, fib); - *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); - aac_fib_adapter_complete(fib, (u16)sizeof(u32)); - } else { - /* The u32 here is important and intended. We are using - 32bit wrapping time to fit the adapter field */ - - u32 time_now, time_last; - unsigned long flagv; - unsigned num; - struct hw_fib ** hw_fib_pool, ** hw_fib_p; - struct fib ** fib_pool, ** fib_p; - - /* Sniff events */ - if ((aifcmd->command == - cpu_to_le32(AifCmdEventNotify)) || - (aifcmd->command == - cpu_to_le32(AifCmdJobProgress))) { - aac_handle_aif(dev, fib); - } - - time_now = jiffies/HZ; - - /* - * Warning: no sleep allowed while - * holding spinlock. We take the estimate - * and pre-allocate a set of fibs outside the - * lock. - */ - num = le32_to_cpu(dev->init->r7.AdapterFibsSize) - / sizeof(struct hw_fib); /* some extra */ - spin_lock_irqsave(&dev->fib_lock, flagv); - entry = dev->fib_list.next; - while (entry != &dev->fib_list) { - entry = entry->next; - ++num; - } - spin_unlock_irqrestore(&dev->fib_lock, flagv); - hw_fib_pool = NULL; - fib_pool = NULL; - if (num - && ((hw_fib_pool = kmalloc(sizeof(struct hw_fib *) * num, GFP_KERNEL))) - && ((fib_pool = kmalloc(sizeof(struct fib *) * num, GFP_KERNEL)))) { - hw_fib_p = hw_fib_pool; - fib_p = fib_pool; - while (hw_fib_p < &hw_fib_pool[num]) { - if (!(*(hw_fib_p++) = kmalloc(sizeof(struct hw_fib), GFP_KERNEL))) { - --hw_fib_p; - break; - } - if (!(*(fib_p++) = kmalloc(sizeof(struct fib), GFP_KERNEL))) { - kfree(*(--hw_fib_p)); - break; - } - } - if ((num = hw_fib_p - hw_fib_pool) == 0) { - kfree(fib_pool); - fib_pool = NULL; - kfree(hw_fib_pool); - hw_fib_pool = NULL; - } - } else { - kfree(hw_fib_pool); - hw_fib_pool = NULL; - } - spin_lock_irqsave(&dev->fib_lock, flagv); - entry = dev->fib_list.next; - /* - * For each Context that is on the - * fibctxList, make a copy of the - * fib, and then set the event to wake up the - * thread that is waiting for it. - */ - hw_fib_p = hw_fib_pool; - fib_p = fib_pool; - while (entry != &dev->fib_list) { - /* - * Extract the fibctx - */ - fibctx = list_entry(entry, struct aac_fib_context, next); - /* - * Check if the queue is getting - * backlogged - */ - if (fibctx->count > 20) - { - /* - * It's *not* jiffies folks, - * but jiffies / HZ so do not - * panic ... - */ - time_last = fibctx->jiffies; - /* - * Has it been > 2 minutes - * since the last read off - * the queue? - */ - if ((time_now - time_last) > aif_timeout) { - entry = entry->next; - aac_close_fib_context(dev, fibctx); - continue; - } - } - /* - * Warning: no sleep allowed while - * holding spinlock - */ - if (hw_fib_p < &hw_fib_pool[num]) { - hw_newfib = *hw_fib_p; - *(hw_fib_p++) = NULL; - newfib = *fib_p; - *(fib_p++) = NULL; - /* - * Make the copy of the FIB - */ - memcpy(hw_newfib, hw_fib, sizeof(struct hw_fib)); - memcpy(newfib, fib, sizeof(struct fib)); - newfib->hw_fib_va = hw_newfib; - /* - * Put the FIB onto the - * fibctx's fibs - */ - list_add_tail(&newfib->fiblink, &fibctx->fib_list); - fibctx->count++; - /* - * Set the event to wake up the - * thread that is waiting. - */ - up(&fibctx->wait_sem); - } else { - printk(KERN_WARNING "aifd: didn't allocate NewFib.\n"); - } - entry = entry->next; - } - /* - * Set the status of this FIB - */ - *(__le32 *)hw_fib->data = cpu_to_le32(ST_OK); - aac_fib_adapter_complete(fib, sizeof(u32)); - spin_unlock_irqrestore(&dev->fib_lock, flagv); - /* Free up the remaining resources */ - hw_fib_p = hw_fib_pool; - fib_p = fib_pool; - while (hw_fib_p < &hw_fib_pool[num]) { - kfree(*hw_fib_p); - kfree(*fib_p); - ++fib_p; - ++hw_fib_p; - } - kfree(hw_fib_pool); - kfree(fib_pool); - } - kfree(fib); - spin_lock_irqsave(dev->queues->queue[HostNormCmdQueue].lock, flags); - } - /* - * There are no more AIF's - */ - spin_unlock_irqrestore(dev->queues->queue[HostNormCmdQueue].lock, flags); + aac_process_events(dev); /* * Background activity