From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751591AbdE3L7F (ORCPT ); Tue, 30 May 2017 07:59:05 -0400 Received: from mail-bn3nam01on0063.outbound.protection.outlook.com ([104.47.33.63]:11904 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750905AbdE3L6w (ORCPT ); Tue, 30 May 2017 07:58:52 -0400 Authentication-Results: gondor.apana.org.au; dkim=none (message not signed) header.d=none;gondor.apana.org.au; dmarc=none action=none header.from=cavium.com; From: Srikanth Jampala To: herbert@gondor.apana.org.au Cc: davem@davemloft.net, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, Sreerama.Gadam@cavium.com, Ram.Kumar@cavium.com, Nidadavolu.Murthy@cavium.com, George.Cherian@cavium.com, Srikanth Jampala Subject: [PATCH v2 2/3] crypto: cavium - Add debugfs support in CNN55XX driver. Date: Tue, 30 May 2017 17:28:02 +0530 Message-Id: <20170530115803.8965-3-Jampala.Srikanth@cavium.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170530115803.8965-1-Jampala.Srikanth@cavium.com> References: <3575749.J6klBtBYWh@tauon.chronox.de> <20170530115803.8965-1-Jampala.Srikanth@cavium.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: MA1PR01CA0106.INDPRD01.PROD.OUTLOOK.COM (10.174.56.150) To MWHPR07MB3598.namprd07.prod.outlook.com (10.164.192.151) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MWHPR07MB3598: X-MS-Office365-Filtering-Correlation-Id: 8a897ccd-ec1e-4677-fed8-08d4a7533982 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(201703131423075)(201703031133081);SRVR:MWHPR07MB3598; X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB3598;3:gPp7qgqFvUq2s5zoeCD8G/WOOQfGhb9lFzC5lGamyrQEZuGCczvm6ui1x1DZS8PBe7jYDdrUZKB+zarGjSeZGMrV5Pe9u4SxS6JeT7yAgpXBLAupd6x53lL7Qe+1yuCJIwjFU/4bnjbAyUXZ/FGrjF3vVi+GslYtXa33rmg73RY7pKxcgAz1WUMd3wO85pllETfFH2AXiyE+4wB0FG0IqY3Clw2XbuB5QU9DCJ6WOgAOByOdJmr1lMQ/FwYNrlNp9xr3jhKSnADlJsok6Q2GuUD2z5FnRRNvI7kD1IgVS19Zf1OD/G5p8Wj7+0+SJc7cvPOPBhBr5ssNL318VPJNKg==;25:KiOr8IgWtIWgV9pUHTWujKjCHUGqJgsVmafoVtpzY4fykAcdMdrZYnY/NvE1q7FZ0U5xKc7jb8JF15dd5IfZGS9klg9WMqwQQTAYwPF/Vd0sjQtV649avEvuzizA1qb1TIrzlDJWGCTExB/hG19EKLPU3bAOZNtvrvTbiNwV16CmlNgW6np+tHvQVXHWMEGJB2TYhzuCpZitES9rSoUrNttMVyOK/wsXUqxzfpVBIGNfnJci0oKUKs+MiCNaG4363Fk54VxDb/vhMku6yTRuqbdDMKd1zDiOw7YRj+N1Oe0q2f9GxWtDLSqyWXO7+5lsDaoOxZVSUellBPqgP5w9wEA57pGHgXs2xk1sX/H5qKzN3J+6ZnkhSgsaOtN9IWliB2tZuMcggOekfsrRPfNHCAxuaXEIvX+w4y18P0YHju7At4+IVtTIe3UAIkXQ42IFaRUldgbyLZ3gY0raFKKFPsDTg2k1KsyplsZAe9wiDTU= X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB3598;31:IS3ZaVsRWxEcmqdjZPHfitc3uRMryBSI8OlfKVvn/6s6+tyKWjSWFzIfhJ57JVCKxUR8pzAWJ5niDyn+rv3zWtHz8D7PVheRQCvLjKFmopj69d3BGdBiDz+BdIRzFi83ryDu4GvWSzpmPROdNx11O9rHHtXUzaZhUYclu/sBQgKJ9n2qeqcCjyF/HrLbGJxpKVwY6UNRE9E85k0skdRyrE1i0mIxZPnpuiSbmCfoBg3P8WlG4SpXSCJyyv9megakMxmUqVUEWWChO35N7TxfHw==;20:toypiFMWrwBvvnpumSR4t5gR8MOjrtMIhULe2lwu+E0jTT1PjMz/gERv/6G6Fl5tzJEvgVVLqyyAbGFlfVV1FVnibcSdfUN+Kx5g8H6O84GGYrLKmCU1BP9KquXfx73nbbh9QmOD4Z91DD2Hqrp6kWAnJeUdJdgvxrIWU8GYsByDRNNKWAENqoaXcLR5tivMNNF4tkv+u3E2EqelVN28ziNQibYhrTF6IfUN268k5udJz1xAbWRkcMLf9Asl+tR40DTYvbA6YGp1O0+5lQDDBrOG/u5Ucsk/YGSTlfee+WnQp27Edo+ini5Phy1wJ08+AmqfHsXF1Hav8o0SWIyEPDoskbpqx9kLiQL8EVDa1CCwshN+MJl4iWV7ZYH0FhA2+p4flWxwA4bxKCHGhwCLK+dwNoUfOFiW7XJyLPU5XAuRwPE7EHTk/o57eKG88p6aokaenMwObuEN+OKPpJzdAuLhIJR8sqTDv4bzE+Rh+/noG9fs8jqP2rKWtlb6ajd0 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700073)(100105000095)(100000701073)(100105300095)(100000702073)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(100000703073)(100105400095)(10201501046)(3002001)(93006095)(93001095)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123564025)(20161123562025)(20161123555025)(6072148)(100000704073)(100105200095)(100000705073)(100105500095);SRVR:MWHPR07MB3598;BCL:0;PCL:0;RULEID:(100000800073)(100110000095)(100000801073)(100110300095)(100000802073)(100110100095)(100000803073)(100110400095)(100000804073)(100110200095)(100000805073)(100110500095);SRVR:MWHPR07MB3598; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR07MB3598;4:QBaQEl8cZrSaT7MR292a7ubUQSLpZGYcDAztPe3L9t?= =?us-ascii?Q?7ISIYFup/Ch+xKoMS++7szv70FTENqnmQSs8RIr7HrCoFvTdKZATLEZSPlj2?= =?us-ascii?Q?83883mSZtQZXDBWNC7pE/XSHkFooHVl9SksApa40ofEDq9BO/q9xM7tvtzDe?= =?us-ascii?Q?vKMuLb2rBrW7QSpybFo23CwRMvXYvAoD9xt+dbNdxhl7BRQUk80p4WtKAXOe?= =?us-ascii?Q?K+ZGkWTJKIs8H7pLfrQENZ+Pv4m2CJJF3w9ffoaYcFqnCp72wzup94BfQPnD?= =?us-ascii?Q?7cxkKXGM7lfmt/5jBEM7/Kw+7vl5h2e0YGut725HwL6QZr6PAd6MkI1vp9G/?= =?us-ascii?Q?uIy8NEjNMtnF7g06VM/hv2PjCvSEbXWbyT5PX6oZigNbzFJCowh5YHY33pF4?= =?us-ascii?Q?IM7KyHwPRnO8m3ZFADRLLqRnGePvaZeM1kA5tUbYt7yCbobvd8pLSfXgJz4u?= =?us-ascii?Q?5clWmd4/MkXaptexbZq0N93AOto5MSP8qAgbIenKaZyNsowLUOoaKu/8vme5?= =?us-ascii?Q?5GoJ3GzQDoKlXQJqklM7IB4xEJ8lFYA+R85TTCKBfMiwbCK8VJxezTmRA7K0?= =?us-ascii?Q?jOtKfz4I03q1SbunR1eim4nw9pux0XX0+u8iXMAPs7XEMz5A49HnEwgdbo2Y?= =?us-ascii?Q?Zkbo1mf+yETU8NyVONyCNwuKumIF1jZIVs/9GEHTFKGYwUbjuty3D9qEF4XD?= =?us-ascii?Q?Sk8G5SCAkOk5ZbptTYsy6sTZVKjAP2zKIVRZISokF7iL+071F4pv4CiTyxdS?= =?us-ascii?Q?msB8BAitb5Z2fcav1CTMWSXYHan3xgFUmvaCYGnS8Z9KFb3hgEhIOZsMY9eN?= =?us-ascii?Q?c2pnOEl6WjlseJsLUEX21vjEggmSfa/0vRx047u8Sd7J+BTpFuZkwsZc11eM?= =?us-ascii?Q?w9NJbv8DFptFJMI0N1tn0ga0JB2kHHEzbnr0wg9jW8JdCa+FlOOtNkO2BS1p?= =?us-ascii?Q?8UTjUQOM49PGkfWuBYtYG8O+WncgGZkNyy2RjIxA8sicy6tWA1R6uKrroyzw?= =?us-ascii?Q?ekUmkO+j0KLkwfUP2p+8rgYVSXU1e6fSdEVFlws3S8u6v/ldEsJHyEfGj9X7?= =?us-ascii?Q?xQDqi1nEe+EWYt/PTf2GnP9PvF3uOaNE6mVJnvtBh96bNL7ybDEB74Wfie6M?= =?us-ascii?Q?o2jspvr930Bymt9OHRYy8y52oaxhwW?= X-Forefront-PRVS: 032334F434 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6069001)(6009001)(39450400003)(39410400002)(39840400002)(39850400002)(39400400002)(66066001)(25786009)(47776003)(478600001)(53936002)(6512007)(107886003)(38730400002)(110136004)(48376002)(50466002)(6916009)(6666003)(72206003)(2950100002)(6506006)(6486002)(2351001)(2906002)(4326008)(76176999)(50986999)(2361001)(42186005)(36756003)(5660300001)(5003940100001)(86362001)(305945005)(50226002)(7736002)(81166006)(5009440100003)(189998001)(3846002)(6116002)(1076002)(8676002)(110426004);DIR:OUT;SFP:1101;SCL:1;SRVR:MWHPR07MB3598;H:localhost.localdomain.in.caveonetworks.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR07MB3598;23:SMxJLOkynq2PAZB3xNxiXfCkY1LjC38AatRc1CFEW?= =?us-ascii?Q?7iR5wvW+rMw9Uq39r/BduI/LLcLC9XoX1pyadFLeKY/zOjfJQKsWjpAlmdai?= =?us-ascii?Q?JBId8xcM9bTFoLg+FaF1xTcD20A348YOcYjDy/KS36mZ0Dzuc1L32W188Lst?= =?us-ascii?Q?9BwEmz9VRqdtaj2ZgWsME68b9xlWHdGz+vMszkN9h46S1GaoG3wzquMWX29r?= =?us-ascii?Q?6e0btk81xrhspnuHhCuy4bXTw+z51JmLvdNxsqgDdzdLo3uTyenCO8UDzSK9?= =?us-ascii?Q?FU4foaeb3I+/jOJul6yhtOJL+RYZBip0liGnbBKx57hyIcnvR3jiGx+sKsNK?= =?us-ascii?Q?HCGLquLM+Io2sEltDpRMHDi733tyGyH+KncVNCSSEPGBZPOemAdd9lOTsbfF?= =?us-ascii?Q?03zl8geArPkTu0gn1/wkmRaqVyjmB6wSE17RE/jlNDbWNIa0SLreTH+NPRE6?= =?us-ascii?Q?Opz4bRuIDGWtsPW0jfQOvv+eStW6FXZsHcuVK+0ZAc8yXXTKJ7gNhzE6Ng01?= =?us-ascii?Q?T8JxUU5VJyxMn8sgviGIr2M30vWUlK3t+g1curV3TDzbeT0xsC0E6nbygN8h?= =?us-ascii?Q?3035PtkQC4CsNm2xHNX/eMoBgOHjUSWvEFByDRGxPJzMaoHFi7gi3h4oF+Qf?= =?us-ascii?Q?qjfYYLVxq2IcxwnR65+SzuKXH3MIlC0VwepnbyCDRrqB4xlFtxSg7M7mAyek?= =?us-ascii?Q?M5IVXzym/MrUeR9fC4wfqqvYYOi7pflzYLgtSx6II7Uml7CMSwfO0BdtCsPh?= =?us-ascii?Q?EhI+vUEaW+Z67r21krRx/VnFelZ8qqHoQ+my16GuZ9mlrhooDsjRwMYXNQi6?= =?us-ascii?Q?vxJ4izkDm5b4tIEGeo5h7an4cDTM8SslrCyWo6HPtbDnBaHEe1wKjss9+5+D?= =?us-ascii?Q?xn7NkkNMzy+bl7sWqX4tulUZ1UQ9yZHsAdw8WNvzTrIGt7zlYFZnqou5BFK6?= =?us-ascii?Q?8+qN7mKGAeM+Y8JmqUWf4/pafiDjZhjl/lL4IuePsIB/iKCcOcZUdFbSvRQp?= =?us-ascii?Q?tAv04cWdJNnVr/0Q59lcKfHdhsjLZqvFhDqUtzHyscc0CIclgVG3zPalNZTx?= =?us-ascii?Q?evmcGD1hBOuN7pgfl/eNMS7kj1r++voPdAwiLFxRXjBCaDlswassCOWgeXhF?= =?us-ascii?Q?4NfYjkzWr5jfl5C+QUr2gouObDyuOXYrNQHydCs9C8T9obWaTs/HKA11a+P2?= =?us-ascii?Q?7LTZN2oN2VKTow=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB3598;6:5AoaD/YEmi+UvE/NAUYAJHiyANkp7dBM7x1TZeTTd62chn2PxlVj5Kn+Wvnk2KITgvuYOO2E4nzdcwo2p6ptJccoF61RCF811JzdUNvxBtbbJRk3BZ6Bfx2PHMluoLWk+2ZPX1bG9serOMLSjDHdzjLBqf+7hb/JeBIkSGrw+Dvv5gyv4sTFDlpux1HPuunZpRWB1E9+LU+gCz6uty4UWGzz0SI4gjJ2lTBx3eba4jRAJPLmAVhiNH0rzCNT8aECl6Z9TBns/kazDcCzWXFa7XFyAZsISqwNckS0y1eBndpaBX95q9QGcHZxWPdD8s1EbnI9OUgzAo7uhnc613lHcmYvlkzyHRnBdJ5N4tCfZMLuDoIYFiCbsidrM7EPy7Ib9RU0tWg1C2UXGFl+JLQwSA/iYQFfOI9tdIXcRYB9YHPkJT17leflDPKjdKz0eTaIrLFmpfESXuda28uNqnVFfRjxgUYBKqo0Tdb9vFF0n7Np448UFDzevFiewKpm9Mu0urAnxbEtRptqLZjpx6KPIg== X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB3598;5:nnD0M+5cPxfppBrc7Fnmrv4QsMj5SBKvoVv7k3qfLx9n7ppOijO2e8KheweNZFTTCphFVih0NDonzaGRnHTGq2814rNp73ACPKd/GaIfG6Mip3QsCXgAP62DUKxJUiSS5cuK3M7FS6CGlvvUL8OI/mvzONAYh4x1UC3cVrDh6EbVf0Ice98oW4BZJDGLgRBTQ9beaKQb7LCPH4MW6+i3IwpyG0E8qDc39RLoSM9EndWwvaUNGPJNwc3X94+oN1sF70Z867lOITGOB1fVDj2Vy556AYPs0sNCq69s0KgISU9K086f1pGsuyEN8mVRTR1U52SHOM3x1WUMnrtwi8oRgZaXlrhiVtGLPrWafZlARuQeqkEsIB2/TXLP2RJqF1cQN9a56GcSS8YrMFIB2EJzmmPzpZ+XaVkqu9dKEY9oosECrqUx9qyN/R/u/NEvV+pntAXDOTNsTgqrE4SAMQRSTxRulBIIsLs0AV3eKdXLJQ67x+F6ixNn3jLk6zr6oCbJ;24:nJVhymiwkTkDInFK0JzCzjmLSJEmduwSSgBBcWQWGfleJGc75HfUOeuxu5SX1JsKbYcBB++xsb7JxP6J0nyLWqxQwYT+BXsbHwoGHlT497o= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR07MB3598;7:I3/feW7x+Qa6O6mz3hWQmlJR5pJAARI1m8ZKboGcl51HMXnqfTItGHrF4N8ueoXn3javV/yO/RdBeAnS5jkZRWQMYgxBN3hXreseVdfrnuEq5AKrAJTErnxqO3G0kNBmiro9wacoN7JHm04wl43cwkddJiPTqZENqGi/0L14Xk/vIFimHJNaB8j+5ifDxgdH/D4LeIrqrk4AG0j4tgsAKryWqBl4kYBWk/IkChx+euwIUao1NlJgEKsQ06vE2pvquBUy9VJxD9f+d5bj9o4tWjHaIX1rdb1r3xnX3Vf41sggiQwhZF7JFTZ4x+L5kV71huP92UbXCKRauISSlBhX/A== X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2017 11:58:42.9311 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR07MB3598 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add debugfs support in CNN55XX Physical Function driver. Provides hardware counters and firmware information. Signed-off-by: Srikanth Jampala --- drivers/crypto/cavium/nitrox/nitrox_csr.h | 4 + drivers/crypto/cavium/nitrox/nitrox_dev.h | 4 + drivers/crypto/cavium/nitrox/nitrox_main.c | 135 +++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+) diff --git a/drivers/crypto/cavium/nitrox/nitrox_csr.h b/drivers/crypto/cavium/nitrox/nitrox_csr.h index 5834651..30b04c4 100644 --- a/drivers/crypto/cavium/nitrox/nitrox_csr.h +++ b/drivers/crypto/cavium/nitrox/nitrox_csr.h @@ -42,6 +42,8 @@ #define NPS_CORE_INT_ACTIVE 0x1000080 #define NPS_CORE_INT 0x10000A0 #define NPS_CORE_INT_ENA_W1S 0x10000B8 +#define NPS_STATS_PKT_DMA_RD_CNT 0x1000180 +#define NPS_STATS_PKT_DMA_WR_CNT 0x1000190 /* NPS packet registers */ #define NPS_PKT_INT 0x1040018 @@ -78,6 +80,7 @@ #define BMI_INT 0x1140000 #define BMI_CTL 0x1140020 #define BMI_INT_ENA_W1S 0x1140018 +#define BMI_NPS_PKT_CNT 0x1140070 /* EFL registers */ #define EFL_CORE_INT_ENA_W1SX(_i) (0x1240018 + ((_i) * 0x400)) @@ -91,6 +94,7 @@ /* BMO registers */ #define BMO_CTL2 0x1180028 +#define BMO_NPS_SLC_PKT_CNT 0x1180078 /* LBC registers */ #define LBC_INT 0x1200000 diff --git a/drivers/crypto/cavium/nitrox/nitrox_dev.h b/drivers/crypto/cavium/nitrox/nitrox_dev.h index 2793a10..57858b0 100644 --- a/drivers/crypto/cavium/nitrox/nitrox_dev.h +++ b/drivers/crypto/cavium/nitrox/nitrox_dev.h @@ -118,6 +118,7 @@ struct nitrox_bh { * @msix: MSI-X information * @bh: post processing work * @hw: hardware information + * @debugfs_dir: debugfs directory */ struct nitrox_device { struct list_head list; @@ -141,6 +142,9 @@ struct nitrox_device { struct nitrox_bh bh; struct nitrox_hw hw; +#if IS_ENABLED(CONFIG_DEBUG_FS) + struct dentry *debugfs_dir; +#endif }; /** diff --git a/drivers/crypto/cavium/nitrox/nitrox_main.c b/drivers/crypto/cavium/nitrox/nitrox_main.c index aa33120..9b07003 100644 --- a/drivers/crypto/cavium/nitrox/nitrox_main.c +++ b/drivers/crypto/cavium/nitrox/nitrox_main.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -305,6 +306,135 @@ static int nitrox_pf_hw_init(struct nitrox_device *ndev) return 0; } +#if IS_ENABLED(CONFIG_DEBUG_FS) +static int registers_show(struct seq_file *s, void *v) +{ + struct nitrox_device *ndev = s->private; + u64 offset; + + /* NPS DMA stats */ + offset = NPS_STATS_PKT_DMA_RD_CNT; + seq_printf(s, "NPS_STATS_PKT_DMA_RD_CNT 0x%016llx\n", + nitrox_read_csr(ndev, offset)); + offset = NPS_STATS_PKT_DMA_WR_CNT; + seq_printf(s, "NPS_STATS_PKT_DMA_WR_CNT 0x%016llx\n", + nitrox_read_csr(ndev, offset)); + + /* BMI/BMO stats */ + offset = BMI_NPS_PKT_CNT; + seq_printf(s, "BMI_NPS_PKT_CNT 0x%016llx\n", + nitrox_read_csr(ndev, offset)); + offset = BMO_NPS_SLC_PKT_CNT; + seq_printf(s, "BMO_NPS_PKT_CNT 0x%016llx\n", + nitrox_read_csr(ndev, offset)); + + return 0; +} + +static int registers_open(struct inode *inode, struct file *file) +{ + return single_open(file, registers_show, inode->i_private); +} + +static const struct file_operations register_fops = { + .owner = THIS_MODULE, + .open = registers_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int firmware_show(struct seq_file *s, void *v) +{ + struct nitrox_device *ndev = s->private; + + seq_printf(s, "Version: %s\n", ndev->hw.fw_name); + return 0; +} + +static int firmware_open(struct inode *inode, struct file *file) +{ + return single_open(file, firmware_show, inode->i_private); +} + +static const struct file_operations firmware_fops = { + .owner = THIS_MODULE, + .open = firmware_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int nitrox_show(struct seq_file *s, void *v) +{ + struct nitrox_device *ndev = s->private; + + seq_printf(s, "NITROX-5 [idx: %d]\n", ndev->idx); + seq_printf(s, " Revsion ID: 0x%0x\n", ndev->hw.revision_id); + seq_printf(s, " Cores [AE: %u SE: %u]\n", + ndev->hw.ae_cores, ndev->hw.se_cores); + seq_printf(s, " Number of Queues: %u\n", ndev->nr_queues); + seq_printf(s, " Queue length: %u\n", ndev->qlen); + seq_printf(s, " Node: %u\n", ndev->node); + + return 0; +} + +static int nitrox_open(struct inode *inode, struct file *file) +{ + return single_open(file, nitrox_show, inode->i_private); +} + +static const struct file_operations nitrox_fops = { + .owner = THIS_MODULE, + .open = nitrox_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void nitrox_debugfs_exit(struct nitrox_device *ndev) +{ + debugfs_remove_recursive(ndev->debugfs_dir); + ndev->debugfs_dir = NULL; +} + +static int nitrox_debugfs_init(struct nitrox_device *ndev) +{ + struct dentry *dir, *f; + + dir = debugfs_create_dir(KBUILD_MODNAME, NULL); + if (!dir) + return -ENOMEM; + + ndev->debugfs_dir = dir; + f = debugfs_create_file("counters", 0400, dir, ndev, ®ister_fops); + if (!f) + goto err; + f = debugfs_create_file("firmware", 0400, dir, ndev, &firmware_fops); + if (!f) + goto err; + f = debugfs_create_file("nitrox", 0400, dir, ndev, &nitrox_fops); + if (!f) + goto err; + + return 0; + +err: + nitrox_debugfs_exit(ndev); + return -ENODEV; +} +#else +static int nitrox_debugfs_init(struct nitrox_device *ndev) +{ + return 0; +} + +static void nitrox_debugfs_exit(struct nitrox_device *ndev) +{ +} +#endif + /** * nitrox_probe - NITROX Initialization function. * @pdev: PCI device information struct @@ -389,6 +519,10 @@ static int nitrox_probe(struct pci_dev *pdev, if (err) goto pf_hw_fail; + err = nitrox_debugfs_init(ndev); + if (err) + goto pf_hw_fail; + set_bit(NITROX_READY, &ndev->status); /* barrier to sync with other cpus */ smp_mb__after_atomic(); @@ -431,6 +565,7 @@ static void nitrox_remove(struct pci_dev *pdev) smp_mb__after_atomic(); nitrox_remove_from_devlist(ndev); + nitrox_debugfs_exit(ndev); nitrox_pf_sw_cleanup(ndev); iounmap(ndev->bar_addr); -- 2.9.3