From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752172AbdF3QP7 (ORCPT ); Fri, 30 Jun 2017 12:15:59 -0400 Received: from mail-cy1gcc01on0114.outbound.protection.outlook.com ([23.103.200.114]:26353 "EHLO gcc01-CY1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751322AbdF3QP3 (ORCPT ); Fri, 30 Jun 2017 12:15:29 -0400 Authentication-Results: spf=pass (sender IP is 131.225.12.126) smtp.mailfrom=fnal.gov; cern.ch; dkim=none (message not signed) header.d=none;cern.ch; dmarc=pass action=none header.from=fnal.gov; From: Pat Riehecky To: CC: , , , , Pat Riehecky Subject: [PATCH 3/5] drivers/fmc: The only way to dump the SDB is from debugfs Date: Fri, 30 Jun 2017 11:15:04 -0500 Message-ID: X-Mailer: git-send-email 1.8.3.1 In-Reply-To: References: X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.225.12.126;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(39400400002)(39410400002)(39850400002)(39840400002)(39860400002)(2980300002)(438002)(189002)(199003)(48376002)(54906002)(104016004)(7636002)(50986999)(86362001)(2351001)(575784001)(2950100002)(189998001)(6916009)(33646002)(107886003)(2906002)(110136004)(6266002)(4326008)(478600001)(38730400002)(36756003)(5003940100001)(6666003)(50226002)(356003)(4720700003)(8936002)(305945005)(7596002)(8676002)(53416004)(118296001)(106466001)(76176999)(50466002)(5660300001)(47776003)(43043002);DIR:OUT;SFP:1102;SCL:1;SRVR:MWHPR09MB1487;H:smtp-ux-prd4.fnal.gov;FPR:;SPF:Pass;MLV:sfv;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD039;1:6dE+3PnLZX8e+mYRLrei5+Xpoc4v36HI5DaEeVSS/55PQlISshIfrMLXJ4zJ2j+tSTiwlUS5ETp1ZO7IKT9LP/rh57Mom6qZZ1cUtBXFv5mtmeQGSDNlBZ0Ta8LbpJxcgUMZ0ITHllQjl2hgij2Hlvk5NXWhT/wjbBh25z7ivSehFW5zkUZyIYOhLzTw++/LAkpN1SHRWdsOrfX14CaQBj4QP08nln8JnPdkcteUERZOIHRNowIXRzj02PT7/fR86P2gEaojUMWwtW0os7V8/oe27+1EP3mru64FETozam8q/fe7SYl7dKILZxJAh4Gm27V3cIT2jTqOaLJ1ze7ZIPk0bv07U2ga8FNaqgJ21bztMl5SYKC6eIhSoGm3AtA6e/7KbDeOhX5+6DiRhwe2QxSuV6pQvIIBuRZIAU5olcRBjQ7cOOgOHIWNomJq1m3ZJTWLWtpGP75wAkSAlyW7kXKcZhpgquzOQTvc121aBlv6aEVvqzQvXsx/LyZGJ5Ds8rxYC/479bQkj5G4Za79cmZsM2Xuo09n++0naYm93zZTqXi7ViDPaKWTxVIDse1d+/WC1tD3cLACZnQATuy6RaglBgGP6vroXM8ykrhZJ6jeRGEEbpQJwhfSLRkb5e5BQqfYRrHaVsiErm8Q/SSa4/xbxrLUQZCfRcMIYP4A4zEZmFGwZOGXXTai+SgoJSFBNTiIBXFePaKZwWqAk3FnCXZNXzw051RwJRfLjGG3U1PhxbgmIBc4tgSLyEBBu6uGzcxO7HBp28yUsSa/m8WA2LdR48wGATF3x015G796sulfJTKGRPPM1ngOYT50YMv+cizHDEAOBktehNC0mwMg7E9K/SVkiYtrZS50y7kWN/xAuaTJ4MosEVUorvir07dvrPSab53vCJFBY/MSCK+C8KZRJEA/xJ4yfdVyKSX93kI= MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f7b51f41-94ce-465d-2d7d-08d4bfd337c4 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(8251501002)(2017030254075)(300000503095)(300135400095)(2017052603031)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);SRVR:MWHPR09MB1487; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1487;3:EZxy8ELAYaxoRSGpAkzdtkJJcLKsB2HVx9bemiJ+rU?= =?us-ascii?Q?OGu0DJ07VYa1kI+rqXHiFcdVgF0+wd99OEiNlCu1syK5K3YcIL6wVmIeev7w?= =?us-ascii?Q?TE9GRQDACfZeMnnR7dihm16VTc9E95+G9r3nMVsBgaIZ2qm6KObHKihzWK30?= =?us-ascii?Q?lBrNXTSE/nPtF6b6MY/z5x0UjFvYWKNqKlgF6PYNb60a4c3HnwhzSJ2wH6Wv?= =?us-ascii?Q?x6LYzPzZW+RE9TtcqqeqqBz9/DpLOcQimocJzQRg+bpJDVC+LMCGvVyqcr/1?= =?us-ascii?Q?o/+p6jFKHqCknTvfP6OwNfuTxzSOeFG8cjrzwMUKdZgPj2yP2f2V8rhor8nx?= =?us-ascii?Q?Jk7y/Tnzj47ZTYkVrfNSMzOyYBE2rD5A0N44OdvErOLKQB4F/Xrg4nKQlgTK?= =?us-ascii?Q?kIPhbhQWnNaAoHnThhoWvvAycxO/HEZ0n11/Swe5U00ALUofjzwEcdNoKvzn?= =?us-ascii?Q?jXCf/PacWx7TwbwcLpYUmEYQ2baBbSHb2I0twCFT3InMK6P+RlzeG71HLngD?= =?us-ascii?Q?5kK6RFAfcdIla7kbGdB23r2vJwbG5XJu9Rrog3G/p5xr9/CSznKkIetO8JTS?= =?us-ascii?Q?By5yUKefMu+frss4ZREvzQhW/V03hjfN55WVKoxcQ5dCOWuzDiV1s72EnVlI?= =?us-ascii?Q?kLadQpTDWaAID/hfFVOigzrXL6f8mekUxMHBX7rboEEnM6lbNHlWbgFUA9SB?= =?us-ascii?Q?8AhL4tUhHZH6yg7NYWJMiX8b0L4lriY3bS0XTAC+Uf3+z5r2t5e1fDiXZW7i?= =?us-ascii?Q?8b61wYlDTU6h3StO376DUSTEOjq+4+WeWBV1kBpEiQ+2fszG7yMS9D2mAPZa?= =?us-ascii?Q?nc8P8vu0ek0duQIVMU73KEyvA1/sJ5Zmez918C7EjEXUHn+AlCNGBU+bybk7?= =?us-ascii?Q?+d5lmX8BQQy+8d/RhWh+WLn9JFXxF2T9kk3E32pGkJJoxgkZi5nL8C29S6iz?= =?us-ascii?Q?t2yJkVe79xNYsfZCfoE9dZ9X3GqgFff8J25X8+oA=3D=3D?= X-MS-TrafficTypeDiagnostic: MWHPR09MB1487:|MWHPR09MB1487: X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1487;25:Fn1I818wnHsmEhVGRZAJ3gTmLeK0rVtHnKYExy0+nLu1RIL0j6yTBGdePVLPx19DQXHV38NBijbeuaHLML331nbu/5XhLqC91AdKXa+zOQT+TDmZqvzEipYPpaTXonzNM3CdJDwtcdeHqfc6AJ3hoL1+av/eR0UAJ54O7yHbpnb7uEl6lGqpE2Yh6BPpOuhRbS62sPRX/MVs0cvbSDQpPo1ODiXuTrafJ8p8Wr6u9q3rcMChl7KrdVFvIdMh4pc1rIcr18zp9rAb4m3DQWjZet/bXzgWOJJRS8URG4ScelExuH3Kh+xYbiwjy50JGQI8u8iD+X5Q5iWyItHU9iWN7LaGMQCif5JjwBPYpbH1NQyVdICRxedJ0cfHxSYXHa6kCtES7fmjRX8tRw4n84AUcz3DZTDDRPVUWsVk/fUQ7gmozgsykSoBk9cvoqfWYvWcwJ6jRgS23D3XX3SdfKQxZM202t7UkHxN9G1e/CT2JVy4wQfi94w+IpvziuK3jlLJkv3Vab3hmfRoNKL4w2onfoUerVkCa2jATwV4G6spe8Res0/M7z2ZgB+iAw2jgP4X7OWgIwoZCVZqT8H6bMo+KZ9EUhdspswK4M6klNtbld+cZBLFXWaeNvzM+CNeSaHlSTszFRddln2WD7uXrXzdt8lOrHwo1eHs6797h5/F1zEbDlHstXQew/bKE2sfEGM2UcqeFjjhVOXz/rfYPvbHxwFfguFa76bfemNBngWCDTg172AX/hAm4kFSp2cxb17dWrsUrCpTsoIYT0n/hLJ0jZOjtTEw6dtZ64Xy0zD+G+LdS1UiKc76qRvMXdi0YtKHNyy9fAxhgXPRM5QQC/fP2QPT2Xt/4CMmb2O7mBcsqraCj6HkKZ3BfA0ZoLfcJ6HrddJwDOS4tohdOKm/AEN6NrAWVZVwDtHtMAe/n9xPR44= X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1487;31:1gsAwQ/VlQhEWFlD5o2q/EFvrDHmfnJ/s5WlAEBPqJ8KyY2IGoq5iu6IpkvKuLBSK0ImXoIW+gMKCWaovkBoQIeSUjHJSgTwxKuQsn0pkG263zSvwcq15h+3qO5fk3poeEY2jcmxOQuuYiOES0eZtQblZnKBtl2NUCY3/LbJyR3aWoeN9veIH6MNmw8JojenB++dqI4Im0sPXWD7Wu3fVBAebhFmDMkpF8q+PihE2v9VA2sHXZvwp4nq7JLTiKvv+nejkRpVC06QnpjRGfdw/xoZX6cXAJIyG13PVM8/GSsGYppu+OlupH+bhoSOuVHH+KyICPtEMIgfVbuWRQu3pXdOray6sTaHxaalAcAmi7hUgwmRcTWp1bQF/PctqMVOc0EH/mcEj0YpE9yBs7DVdiPOryVQcewkGYJ7Ep8GK704EI7rAtnl6qSXWL4wHzEdRihVW2yzurr20B9rtKcC9KvsScECGYalYMIZpp09TOGHoFYRYHXbZ/wtSavT4/Zh2b4/dwP0+XOxqUjqCHDfBiH6nSfcWYotSKlEi8jEQCyNQiC+tGiyNfAs9OSIqbWFEm9qYFgPPmkPYm0ddCkTm6kIxrQoEnBLLgzZxxlCPipc/5cXeI8z5dYu4pmmquHq0vKntWDtrXKuSDPxn8lv5yCAj33Tp7rmDX5LhnMhiyI= X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1487;20:NR4ppCAwTFHA1FwfCX635OFI59zNazwbWbLci5bMLocWFFzqtZadWaN8m7PYlDaVrOV0l0PscmQ00yhy5B+dI/07ZthI24bkxmX6aQabkwN5vW/bzgGJKw/HB++xNdZm3bTs9v9cpc+oVwguN998Ic+hSPXzj9W3xu7fg7+PWGkVNqUHCyIAaRnQ8ZIpQSQ524HfKbUhDRk9T9ufLQdMhxnLrbqQahdqNpgsQ7e1fjGaoGk0+xifc8K3oacmbANRo5+Wme6wC4p0LxwI7SUbyEernsMS+IF5Aki0qhJm1LW34sOw2ApkaStS71sONQBqIP9pJ4Mfgnb3wMfmnGmbrpo0ygPqWWK+iw+6MNp0PiOyLX42+CKdejo8mmfPHUwEon7Fr8B3AAEIdiZ29JhUWctyPUktJoSOJ/OMU1CZhe75xc8Q4vLnyUQ5GgY0VFg4X8pvazBAoNPQ62vLuvxSzf8jLe93oxViDLDa7JuX4loxHpJ6fb5FvqrtW8Eg9JGl X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(133145235818549)(236129657087228)(148574349560750); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(13018025)(8121501046)(13016025)(5005006)(93006095)(93004095)(100000703101)(100105400095)(10201501046)(3002001)(6055026)(6041248)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123560025)(20161123558100)(20161123564025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:MWHPR09MB1487;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:MWHPR09MB1487; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1487;4:AowX0SM8HNnzCFV+8cUWE1p1PsrJkYZn0g5Zz7ZHbm?= =?us-ascii?Q?XJ+DpAojkcrPVDsJeoEhMhiNNgjvwOE7pXZadbNy/D6BfRkLLWXwIGrXFewb?= =?us-ascii?Q?8/zBVdTJOtNFRaZlFHw0/lH1EFihjcNFxu5h0dnj5UA+KG0/5oGrIWWzKk+H?= =?us-ascii?Q?7L443yko85eWYEbdQ/fhudSSCc1hnukaxJEywj4+UCFS0ywEf19qu9V1IOy5?= =?us-ascii?Q?J1w/1xKvtjqO2knm2TXJFOPP5Xkh3OOfXRiySlIFXUksxnNIVBPKGz6coVrp?= =?us-ascii?Q?iD6LIzwynYGNH033MuvnWDAwKwV06mKubK/XbR/UJe/Orbg7NYu5/QM3j6ir?= =?us-ascii?Q?w9NVd74BY6IBc7UlNZwRDllUCf7mbH0tSDYj3OVP/t9onTBXNp+xqnt164V4?= =?us-ascii?Q?fzk/t/qJSy/fQLI8QDOFwgssWrDcASMfCbqXYNC2TmKcIUFIycTgpDYOyQeZ?= =?us-ascii?Q?DpQbAm6massSSekrJYqIExXa76TUQdfnjQ5Kc1RHXGCizHR7gW3YtYt6E+g2?= =?us-ascii?Q?WmipbYiKNTSKUyrAnygdRCfLPEjrt/w7AQpfoF7dtdavnFhAAxSUvbZJPySZ?= =?us-ascii?Q?Fuw1WXh/ojxIvskHU3FPbHJms3nSHHPjRdvokhkx0hOTCYdlmp1B2twOhZvQ?= =?us-ascii?Q?buBSYffOFu1NECZxZya1R9udPCuUNEcMD8FeuddTbn0FVFl5RQsx+reytPko?= =?us-ascii?Q?N8ln7/fwQUD+QhCYtb5hyWjdyxAwHAYc6XrtWPUn8hkwcHI/EpYyCOkgDR5i?= =?us-ascii?Q?eibch6YAOySTvw7pd6GjNmDvlloc/y2Yjqu9yRvj8MducIfybw3M5z2S/SoG?= =?us-ascii?Q?V7zRTWDMwoVkjsamvtwP0y+LwEAMSEhx+tisHdFdEyBKfDlQ9wYV16aaih/k?= =?us-ascii?Q?n4mp+xJ/ySdRMKgODVjWX5h8MVzQqqPBJi4tcNNowBBUyXxF/tTeMm7S/WOv?= =?us-ascii?Q?5r2A7W/elaMFEKTEurA4e4xwm3CEqSnPb1u4+p0dUiKvRGSxGzCOeyOBzTPD?= =?us-ascii?Q?T5NEHcEw89ORnIEmK9Xm5QwCx4FiHTPoBDAoQzEbjfXvjBrHEbPlYJDZyN/c?= =?us-ascii?Q?qvR0Jh5nFczS2hw+WvlsVYkNLfc/HmeMXocXc/ZKZfhWMq4PCYgRzO9c45Vk?= =?us-ascii?Q?POHOaLxDqxxePiAlHt9LYtmmZNXTF+G4SSUgy4G7/2oMWAO+6bttoUGCphu1?= =?us-ascii?Q?zcC1Viw314YuTvQbceEY5pOsLZh9yXI41HXzd+Eq/IvNQRDy0Be6OjLcg97C?= =?us-ascii?Q?4CG6nCJc2AjbkgmTz+M2ADMUAIKXoA1Cpw956q27mUMTcf/I4G/gls6X4NB9?= =?us-ascii?Q?M8+LN9eoL7theK92Hb2Yg=3D?= X-Forefront-PRVS: 0354B4BED2 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1487;23:T1I5ua7B0KL0NWidJf8xrRhET+bgny+Fw9QN2/SUv?= =?us-ascii?Q?6a3o6Lol6R8Ef8rNc4UmGOOZXJORwDGq4IAhMDoMnc58GvxS9r2k2W0jPqu3?= =?us-ascii?Q?7RK3mZP3ds4Ipu4Wu6E3pPGxDs/wngHqo/vEGZFxLbPMSMX8bUs6AKNMJ6NC?= =?us-ascii?Q?CryALe4zkd2RVsbIjV6H8ES+78aogv46dy6VYHMtWxLhbGH/chzDlZbF2o6x?= =?us-ascii?Q?kWYmpSOCvP2SSq12mnIBO/CwoLw7NRbWaIIo81Kl2y9bFZMNuOmj0thdxo0O?= =?us-ascii?Q?EfAwNSFJS/koGu0n+ps5ojfHhJAGzApBPHIZIFMq1olrnpxVNQsLfLEtrE16?= =?us-ascii?Q?zAnIfY9zsRCQ8XOL3+DrMb8ahPpKISO6XDkKAx0xCo5kPqLGfECUHFwW68hq?= =?us-ascii?Q?SI5P+AtXtZ6/DbeQiyYfHzP27x8CWetHjz0pyNcHyl2Qxk779L+dD4Ia444U?= =?us-ascii?Q?O2k8uPa6EeOPSAkm6aj9hCjjBmVuWv3TFyjiWCVwqKYNIwkXjeiNxWNcuKvx?= =?us-ascii?Q?z/7v9Y1r/Dyi0jCR8M9ggnVTPijRD6SCEBj+QJ3lpvL4w2mZQx8Qijg6c3xL?= =?us-ascii?Q?NQOgIZSJGvmlp5Sy303gAZRLo6d3NsmVGHeRXjoEcaweOgbd9KjpUezudZEC?= =?us-ascii?Q?vLAm7fB/GzPFcsMOWoGvt6CiHmT060/CNF++dH+BwKJY445wMGQ5wLTA5Zp9?= =?us-ascii?Q?M3vsi/Ujo/UBcZ+ETuZuDKUR4L81C/qKulaIyl31JvJ4KEpXKz+FmEMRVkTB?= =?us-ascii?Q?rzDwdvtGHrazCHGwWseGdDVxg0y8mm2gxOHQRyGXlibeF6FyqErWAsQ/0/4v?= =?us-ascii?Q?T7NiQOJaR9FchxSxBij/hpkhXF6HPo8LsMlhg1+C3J6WtTr25VMOxUgqMo8y?= =?us-ascii?Q?SGXl6veo4EMME77VIcEn6fgaayN9LEzPFs6ftkvciogLYGZIFgUZk5EaaGNY?= =?us-ascii?Q?mmnR3cQ3nmX+GcE1lCy+cPjZm+iGeOfOnnPxxW6eyEju086JGiBDdG8n4nLe?= =?us-ascii?Q?cYy6zVj+P67qUSUgfKKV8BmKkI4rlZqDmy7+zanky+RuDCm6nmYxVSlMPDcP?= =?us-ascii?Q?qst1SIKlZBVnAdIBu6Z66beAE+MCL6ZwW2quQLtpoA6sESznfDtvWBrmUJQX?= =?us-ascii?Q?wj8noxFB8c6hOZ3mrI7TXjUwN7aO/H37JfhQHC0fXOdkvCRS6wvQw=3D=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR09MB1487;6:lFjcQ0Fu6tqR/1ZBJ5aloE8RO9p3kwcSXePOsqniJ/?= =?us-ascii?Q?2oj2ZH0MdjdvrBIWehzYPISLr8+HggeQkFcoLe++UH3q4TGIy/vMKgMSjqO7?= =?us-ascii?Q?Q6QJnWosmJNwT5FlotRSWRvT0VFZVCcc4UKJ8deVeRfcgeAJEMZpd7nk9bdV?= =?us-ascii?Q?xy3cOxyMWmVHUxK1I09ehvIipIkXKt8JfSqAKdadkl10QkMcevXWQrUnHUTI?= =?us-ascii?Q?qp0WBkN1NsPYHigsiYeK7RGbj280arzFdCy2UeME8cKYQS/bXFi9MRupKxAi?= =?us-ascii?Q?61Sy7Jub15MqX4r9R0OFg56uXKrFDpkNbgZZDaZ1cM3H0sglNh9pPRBVAg4s?= =?us-ascii?Q?1p+TDMewwvByyiXbtXj/qgnARIgd2KR04ae6+Cr7ESsIGsb70M4pMJ/JRj0L?= =?us-ascii?Q?tx0hAfpM5zl5u41zeoPw/Cv+UmrOXZ7hbPE8bhPLrcXkrHQQUDXGt8o40K9I?= =?us-ascii?Q?e4StNb5GzHBlcGIA6J5J29vyh5njcr18J6pp1zAfpgsJnuHRuO5YNxuNP8dM?= =?us-ascii?Q?y91nVfTBaN2MMnGtAGT4jC7JYumxa26WZlGIi1YNAm/opuhbAn9wLemSnpTS?= =?us-ascii?Q?zsXdxe40pglKIFpJNo13DKG54jt5z4+oJVIn7SFO+20uN8+FS+80S1dnmaaa?= =?us-ascii?Q?se1gRsuTDUf1UcjigSQ9twtc35CK3b/rKiwef0COwZwX68VagFQnFJ10E1wB?= =?us-ascii?Q?s6d6lWtNv1xeirnxJBqoMgyVtKfGMfOcoB5sDkHhhzsABBbcgNWz35zFXSqB?= =?us-ascii?Q?LQ57XFOCMaemE40BtMFSJflv8eavKpbuJEAO+MRnWn2/Nllqw4XzYPIMK+5P?= =?us-ascii?Q?RpY+1+XRSJq6hUPpK4O84jmem9H4V4OJyiuS7NmrwXBiE24Phzv+SfpXdv1f?= =?us-ascii?Q?tdveEzjRWN0LDuGFI1vrFp6m2mNM4U/k1kUT7Lx26yEAIEoNh+dI7EIhOANz?= =?us-ascii?Q?qrx/u5LTBkvezLaUrGW4fu9wtuOXgCrJOVbTKOCV1Ewb4WerHRb3DE2Mvvqb?= =?us-ascii?Q?65a3MpblOd5UlofGMC/C3j?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1487;5:ggv2tDd0PGCGJBWH1/OO9r1q4/jFJAZyxDl/Qe0ZxzguCNFOPIfwwshUEcuztsHdYnR29FbxwCx26VolAtRNijX72DpadPIJgOtVJl50FPdA+8qwMkRFKr1Jq2rt/nH0HdK9Fc/qsbbRYilZpcFxQxKKe7iqJGA+GxlUON3zeRhZ71c1Z+QdNSa2BHUnLIRxuUGgR2UausfbsIoIzKbAijj/CH4EPSYJYkTT49MbPGPul+lKy8FV4cRycWr5Q5H+seRMHvh/kv4RCoVA+JD9hFTEeFFF0MYJTCdrjPItikHUCbs7LbwiUFX/JUI9ny/GB7Hym1zaHqG4A1DhHre1LHEMMomIWXNfllSWoV09/jJDQWmwjLIEIOHe1MnR0qQRG029cqdkHr7U8vJG3qnpmVdjjtcPk+dFEhxTo6+PsYGHH/bhQkW0uUhjz54H76i4AH02HVJuhYM7c+/7ckwamT9SiRrFcgOHqLYSx+5FVRkQo53Snw0erXWbin9MO5/E;24:3WZxZwe1rdNelG19q0IMoZrwuh78dRFU5B4leMJu+5tSEbDew6dv5R95+4dPKhLdnNjCcqjNCtJp6UJXE4LhGgM77WVmQeromT+dxoc88lY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR09MB1487;7:xQT+hlPs48jD7xLMr3k+AxgN7+Kp9eBYyfC8tPr2OsCtU/kwrDLjcHohTWL/S0/9KvHInAsYrYWjUicK/aRr0lbsFhGK3n7QHuxKX8rXXB++yU99PwR9yAWPIYvufMU3zUg2xTT6TI4JFPW4ogzxGRKXG6AgVzq8spRV9nSDdktZPOSzG0JK4i6DEIZhkRLjmmgUjPtiMas87moaOOO5QGGITQ0XixKT3CaS6Y1zRk28kehnbkwaoYZikdHqP6ePuJz2eKb0VCRmPa4ts0KcDio3sgfRbP0aYcB5hDhXDDgM7YxuZh0kuQ05Q4hOGJtOwQ3l60f1eudmT6C1EFJ5ob5xQ+gRDzvpeyC5lu9F9jNDOtCEIr/T8nopsngi+EzMKtOJAyWNru4f0oJP4GTfOnoB04u24dZok/lPScTQcEhlPcAu4aE92q/FiSnSXScs+imH0bRQJXqYEHPybLUem9hHrD3aJH4wVMJXFG6l62U3DztCwJbm7CHQNAzyjW6W7DaxrwvpUhnVbOye7Wx6x5iQ8cbPaFqoEG9bChd5R2KF05iQKAHfOErG8J5b0eLKNTseSsA6Bbd8CKfOyw0jp3V5OpPvT027dw0T/U1P9+EiAHxUjitbkhmGsi+wmrG3IPNtPpt+jq0lhVaRm3AwWGowAUMi9eJLfBTs49c2cgDVOl+EJvyfrt4skDANzcE7nhrNBDNToU4SzrsTQeDL7HQZTgXGQuZLgyHKDoDJU7uNan2wPFAXltvtysx64REpz8OymwtcIcxYDpR6II0tjSSSp8EWq3PseVV7PnDtkao= X-OriginatorOrg: fnal.gov X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2017 16:15:23.8694 (UTC) X-MS-Exchange-CrossTenant-Id: 9d5f83d3-d338-4fd3-b1c9-b7d94d70255a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=9d5f83d3-d338-4fd3-b1c9-b7d94d70255a;Ip=[131.225.12.126];Helo=[smtp-ux-prd4.fnal.gov] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR09MB1487 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Driver should not call fmc_sdb_dump() anymore. (actually they can but the operation is not supported, so it will print an error message) Signed-off-by: Federico Vaga --- drivers/fmc/Makefile | 1 + drivers/fmc/fmc-core.c | 7 +- drivers/fmc/fmc-debug.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++ drivers/fmc/fmc-dump.c | 41 ----------- drivers/fmc/fmc-private.h | 9 +++ drivers/fmc/fmc-sdb.c | 99 +------------------------- include/linux/fmc.h | 4 +- 7 files changed, 195 insertions(+), 139 deletions(-) create mode 100644 drivers/fmc/fmc-debug.c create mode 100644 drivers/fmc/fmc-private.h diff --git a/drivers/fmc/Makefile b/drivers/fmc/Makefile index b945291..e809322 100644 --- a/drivers/fmc/Makefile +++ b/drivers/fmc/Makefile @@ -6,6 +6,7 @@ fmc-y += fmc-match.o fmc-y += fmc-sdb.o fmc-y += fru-parse.o fmc-y += fmc-dump.o +fmc-y += fmc-debug.o obj-$(CONFIG_FMC_FAKEDEV) += fmc-fakedev.o obj-$(CONFIG_FMC_TRIVIAL) += fmc-trivial.o diff --git a/drivers/fmc/fmc-core.c b/drivers/fmc/fmc-core.c index 5263d06..ef6d8ac 100644 --- a/drivers/fmc/fmc-core.c +++ b/drivers/fmc/fmc-core.c @@ -13,6 +13,9 @@ #include #include #include +#include + +#include "fmc-private.h" static int fmc_check_version(unsigned long version, const char *name) { @@ -289,7 +292,7 @@ int fmc_device_register_n(struct fmc_device **devs, int n) } /* This device went well, give information to the user */ fmc_dump_eeprom(fmc); - fmc_dump_sdb(fmc); + fmc_debug_init(fmc); } return 0; @@ -301,6 +304,7 @@ int fmc_device_register_n(struct fmc_device **devs, int n) kfree(devarray); for (i--; i >= 0; i--) { + fmc_debug_exit(devs[i]); sysfs_remove_bin_file(&devs[i]->dev.kobj, &fmc_eeprom_attr); device_del(&devs[i]->dev); fmc_free_id_info(devs[i]); @@ -328,6 +332,7 @@ void fmc_device_unregister_n(struct fmc_device **devs, int n) kfree(devs[0]->devarray); for (i = 0; i < n; i++) { + fmc_debug_exit(devs[i]); sysfs_remove_bin_file(&devs[i]->dev.kobj, &fmc_eeprom_attr); device_del(&devs[i]->dev); fmc_free_id_info(devs[i]); diff --git a/drivers/fmc/fmc-debug.c b/drivers/fmc/fmc-debug.c new file mode 100644 index 0000000..3293072 --- /dev/null +++ b/drivers/fmc/fmc-debug.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2015 CERN (www.cern.ch) + * Author: Federico Vaga + * + * Released according to the GNU GPL, version 2 or any later version. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FMC_DBG_SDB_DUMP "dump_sdb" + +static char *__strip_trailing_space(char *buf, char *str, int len) +{ + int i = len - 1; + + memcpy(buf, str, len); + buf[len] = '\0'; + while (i >= 0 && buf[i] == ' ') + buf[i--] = '\0'; + return buf; +} + +#define __sdb_string(buf, field) ({ \ + BUILD_BUG_ON(sizeof(buf) < sizeof(field)); \ + __strip_trailing_space(buf, (void *)(field), sizeof(field)); \ + }) + +/** + * We do not check seq_printf() errors because we want to see things in any case + */ +static void fmc_sdb_dump_recursive(struct fmc_device *fmc, struct seq_file *s, + const struct sdb_array *arr) +{ + unsigned long base = arr->baseaddr; + int i, j, n = arr->len, level = arr->level; + char tmp[64]; + + for (i = 0; i < n; i++) { + union sdb_record *r; + struct sdb_product *p; + struct sdb_component *c; + + r = &arr->record[i]; + c = &r->dev.sdb_component; + p = &c->product; + + for (j = 0; j < level; j++) + seq_printf(s, " "); + switch (r->empty.record_type) { + case sdb_type_interconnect: + seq_printf(s, "%08llx:%08x %.19s\n", + __be64_to_cpu(p->vendor_id), + __be32_to_cpu(p->device_id), + p->name); + break; + case sdb_type_device: + seq_printf(s, "%08llx:%08x %.19s (%08llx-%08llx)\n", + __be64_to_cpu(p->vendor_id), + __be32_to_cpu(p->device_id), + p->name, + __be64_to_cpu(c->addr_first) + base, + __be64_to_cpu(c->addr_last) + base); + break; + case sdb_type_bridge: + seq_printf(s, "%08llx:%08x %.19s (bridge: %08llx)\n", + __be64_to_cpu(p->vendor_id), + __be32_to_cpu(p->device_id), + p->name, + __be64_to_cpu(c->addr_first) + base); + if (IS_ERR(arr->subtree[i])) { + seq_printf(s, "SDB: (bridge error %li)\n", + PTR_ERR(arr->subtree[i])); + break; + } + fmc_sdb_dump_recursive(fmc, s, arr->subtree[i]); + break; + case sdb_type_integration: + seq_printf(s, "integration\n"); + break; + case sdb_type_repo_url: + seq_printf(s, "Synthesis repository: %s\n", + __sdb_string(tmp, r->repo_url.repo_url)); + break; + case sdb_type_synthesis: + seq_printf(s, "Bitstream '%s' ", + __sdb_string(tmp, r->synthesis.syn_name)); + seq_printf(s, "synthesized %08x by %s ", + __be32_to_cpu(r->synthesis.date), + __sdb_string(tmp, r->synthesis.user_name)); + seq_printf(s, "(%s version %x), ", + __sdb_string(tmp, r->synthesis.tool_name), + __be32_to_cpu(r->synthesis.tool_version)); + seq_printf(s, "commit %pm\n", + r->synthesis.commit_id); + break; + case sdb_type_empty: + seq_printf(s, "empty\n"); + break; + default: + seq_printf(s, "UNKNOWN TYPE 0x%02x\n", + r->empty.record_type); + break; + } + } +} + +static int fmc_sdb_dump(struct seq_file *s, void *offset) +{ + struct fmc_device *fmc = s->private; + + if (!fmc->sdb) { + seq_printf(s, "no SDB information\n"); + return 0; + } + + seq_printf(s, "FMC: %s (%s), slot %i, device %s\n", dev_name(fmc->hwdev), + fmc->carrier_name, fmc->slot_id, dev_name(&fmc->dev)); + /* Dump SDB information */ + fmc_sdb_dump_recursive(fmc, s, fmc->sdb); + + return 0; +} + + +static int fmc_sdb_dump_open(struct inode *inode, struct file *file) +{ + struct fmc_device *fmc = inode->i_private; + + return single_open(file, fmc_sdb_dump, fmc); +} + + +const struct file_operations fmc_dbgfs_sdb_dump = { + .owner = THIS_MODULE, + .open = fmc_sdb_dump_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +int fmc_debug_init(struct fmc_device *fmc) +{ + fmc->dbg_dir = debugfs_create_dir(dev_name(&fmc->dev), NULL); + if (IS_ERR_OR_NULL(fmc->dbg_dir)) { + pr_err("FMC: Cannot create debugfs\n"); + return PTR_ERR(fmc->dbg_dir); + } + + fmc->dbg_sdb_dump = debugfs_create_file(FMC_DBG_SDB_DUMP, 0444, + fmc->dbg_dir, fmc, + &fmc_dbgfs_sdb_dump); + if (IS_ERR_OR_NULL(fmc->dbg_sdb_dump)) + pr_err("FMC: Cannot create debugfs file %s\n", + FMC_DBG_SDB_DUMP); + + return 0; +} + +void fmc_debug_exit(struct fmc_device *fmc) +{ + if (fmc->dbg_dir) + debugfs_remove_recursive(fmc->dbg_dir); +} diff --git a/drivers/fmc/fmc-dump.c b/drivers/fmc/fmc-dump.c index c91afd6..cd1df47 100644 --- a/drivers/fmc/fmc-dump.c +++ b/drivers/fmc/fmc-dump.c @@ -15,8 +15,6 @@ static int fmc_must_dump_eeprom; module_param_named(dump_eeprom, fmc_must_dump_eeprom, int, 0644); -static int fmc_must_dump_sdb; -module_param_named(dump_sdb, fmc_must_dump_sdb, int, 0644); #define LINELEN 16 @@ -59,42 +57,3 @@ void fmc_dump_eeprom(const struct fmc_device *fmc) for (i = 0; i < fmc->eeprom_len; i += LINELEN, line += LINELEN) prev = dump_line(i, line, prev); } - -void fmc_dump_sdb(const struct fmc_device *fmc) -{ - const uint8_t *line, *prev; - int i, len; - - if (!fmc->sdb) - return; - if (!fmc_must_dump_sdb) - return; - - /* If the argument is not-zero, do simple dump (== show) */ - if (fmc_must_dump_sdb > 0) - fmc_show_sdb_tree(fmc); - - if (fmc_must_dump_sdb == 1) - return; - - /* If bigger than 1, dump it seriously, to help debugging */ - - /* - * Here we should really use libsdbfs (which is designed to - * work in kernel space as well) , but it doesn't support - * directories yet, and it requires better intergration (it - * should be used instead of fmc-specific code). - * - * So, lazily, just dump the top-level array - */ - pr_info("FMC: %s (%s), slot %i, device %s\n", dev_name(fmc->hwdev), - fmc->carrier_name, fmc->slot_id, dev_name(&fmc->dev)); - pr_info("FMC: poor dump of sdb first level:\n"); - - len = fmc->sdb->len * sizeof(union sdb_record); - line = (void *)fmc->sdb->record; - prev = NULL; - for (i = 0; i < len; i += LINELEN, line += LINELEN) - prev = dump_line(i, line, prev); - return; -} diff --git a/drivers/fmc/fmc-private.h b/drivers/fmc/fmc-private.h new file mode 100644 index 0000000..1e51366 --- /dev/null +++ b/drivers/fmc/fmc-private.h @@ -0,0 +1,9 @@ +/* + * Copyright (C) 2015 CERN (www.cern.ch) + * Author: Federico Vaga + * + * Released according to the GNU GPL, version 2 or any later version. + */ + +extern int fmc_debug_init(struct fmc_device *fmc); +extern void fmc_debug_exit(struct fmc_device *fmc); diff --git a/drivers/fmc/fmc-sdb.c b/drivers/fmc/fmc-sdb.c index 4603fdb..89e37a6 100644 --- a/drivers/fmc/fmc-sdb.c +++ b/drivers/fmc/fmc-sdb.c @@ -145,108 +145,15 @@ int fmc_reprogram(struct fmc_device *fmc, struct fmc_driver *d, char *gw, sdb_entry); return -ENODEV; } - fmc_dump_sdb(fmc); + return 0; } EXPORT_SYMBOL(fmc_reprogram); -static char *__strip_trailing_space(char *buf, char *str, int len) -{ - int i = len - 1; - - memcpy(buf, str, len); - while(i >= 0 && buf[i] == ' ') - buf[i--] = '\0'; - return buf; -} - -#define __sdb_string(buf, field) ({ \ - BUILD_BUG_ON(sizeof(buf) < sizeof(field)); \ - __strip_trailing_space(buf, (void *)(field), sizeof(field)); \ - }) - -static void __fmc_show_sdb_tree(const struct fmc_device *fmc, - const struct sdb_array *arr) -{ - unsigned long base = arr->baseaddr; - int i, j, n = arr->len, level = arr->level; - char buf[64]; - - for (i = 0; i < n; i++) { - union sdb_record *r; - struct sdb_product *p; - struct sdb_component *c; - r = &arr->record[i]; - c = &r->dev.sdb_component; - p = &c->product; - - dev_info(&fmc->dev, "SDB: "); - - for (j = 0; j < level; j++) - printk(KERN_CONT " "); - switch (r->empty.record_type) { - case sdb_type_interconnect: - printk(KERN_CONT "%08llx:%08x %.19s\n", - __be64_to_cpu(p->vendor_id), - __be32_to_cpu(p->device_id), - p->name); - break; - case sdb_type_device: - printk(KERN_CONT "%08llx:%08x %.19s (%08llx-%08llx)\n", - __be64_to_cpu(p->vendor_id), - __be32_to_cpu(p->device_id), - p->name, - __be64_to_cpu(c->addr_first) + base, - __be64_to_cpu(c->addr_last) + base); - break; - case sdb_type_bridge: - printk(KERN_CONT "%08llx:%08x %.19s (bridge: %08llx)\n", - __be64_to_cpu(p->vendor_id), - __be32_to_cpu(p->device_id), - p->name, - __be64_to_cpu(c->addr_first) + base); - if (IS_ERR(arr->subtree[i])) { - dev_info(&fmc->dev, "SDB: (bridge error %li)\n", - PTR_ERR(arr->subtree[i])); - break; - } - __fmc_show_sdb_tree(fmc, arr->subtree[i]); - break; - case sdb_type_integration: - printk(KERN_CONT "integration\n"); - break; - case sdb_type_repo_url: - printk(KERN_CONT "Synthesis repository: %s\n", - __sdb_string(buf, r->repo_url.repo_url)); - break; - case sdb_type_synthesis: - printk(KERN_CONT "Bitstream '%s' ", - __sdb_string(buf, r->synthesis.syn_name)); - printk(KERN_CONT "synthesized %08x by %s ", - __be32_to_cpu(r->synthesis.date), - __sdb_string(buf, r->synthesis.user_name)); - printk(KERN_CONT "(%s version %x), ", - __sdb_string(buf, r->synthesis.tool_name), - __be32_to_cpu(r->synthesis.tool_version)); - printk(KERN_CONT "commit %pm\n", - r->synthesis.commit_id); - break; - case sdb_type_empty: - printk(KERN_CONT "empty\n"); - break; - default: - printk(KERN_CONT "UNKNOWN TYPE 0x%02x\n", - r->empty.record_type); - break; - } - } -} - void fmc_show_sdb_tree(const struct fmc_device *fmc) { - if (!fmc->sdb) - return; - __fmc_show_sdb_tree(fmc, fmc->sdb); + pr_err("%s: not supported anymore, use debugfs to dump SDB\n", + __func__); } EXPORT_SYMBOL(fmc_show_sdb_tree); diff --git a/include/linux/fmc.h b/include/linux/fmc.h index 8bb4a15..5c8df0c 100644 --- a/include/linux/fmc.h +++ b/include/linux/fmc.h @@ -180,6 +180,9 @@ struct fmc_device { uint32_t device_id; /* Filled by the device */ char *mezzanine_name; /* Defaults to ``fmc'' */ void *mezzanine_data; + + struct dentry *dbg_dir; + struct dentry *dbg_sdb_dump; }; #define to_fmc_device(x) container_of((x), struct fmc_device, dev) @@ -232,7 +235,6 @@ static inline void fmc_set_drvdata(struct fmc_device *fmc, void *data) extern int fmc_fill_id_info(struct fmc_device *fmc); extern void fmc_free_id_info(struct fmc_device *fmc); extern void fmc_dump_eeprom(const struct fmc_device *fmc); -extern void fmc_dump_sdb(const struct fmc_device *fmc); /* helpers for FMC operations */ extern int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h, -- 1.8.3.1