From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2BAA2C43381 for ; Thu, 14 Feb 2019 19:46:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C4D0D21916 for ; Thu, 14 Feb 2019 19:46:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=cadence.com header.i=@cadence.com header.b="ICQus0Vz"; dkim=pass (1024-bit key) header.d=cadence.com header.i=@cadence.com header.b="ObXdlOay" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2437278AbfBNTqh (ORCPT ); Thu, 14 Feb 2019 14:46:37 -0500 Received: from mx0a-0014ca01.pphosted.com ([208.84.65.235]:57404 "EHLO mx0a-0014ca01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2394511AbfBNTq1 (ORCPT ); Thu, 14 Feb 2019 14:46:27 -0500 Received: from pps.filterd (m0042385.ppops.net [127.0.0.1]) by mx0a-0014ca01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id x1EJh4la020778; Thu, 14 Feb 2019 11:46:11 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=proofpoint; bh=/I0nEkIIaoVKxvqbl4yh9nI9h88/QTHUgmihMIewjWQ=; b=ICQus0Vz1aMxekxKZydrl7Ejkm/cMoWXz8g/nk5BIcBsYXJNdvUwiU4wYRao8iq2polW s8ptG8OoYAS1+2bwQr9No1nAF3hATsAPK2bvmQKkwrgrsa+iLQGZcVz6vCLiVant+RTm HE9cr6YIxQCgIm0KNW5aF2GRuLYBNQ7pZvVnK5gT+weO16yrEtjTAG5M4YvvihWLwS9B V6sDKFg2Zj4SaPvoK57ll1GsFm4WPasq+YfdtuE3LBm1MHU/PYzxWPUWSEu53nEEPlGT RaiZAJYwJgwHMf0W8R0SI4VVTt/4gIdJ/SFIb1VExAYHghBtu5MHqe+Gww6bPZ9Wossr hA== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=pawell@cadence.com Received: from nam02-sn1-obe.outbound.protection.outlook.com (mail-sn1nam02lp2052.outbound.protection.outlook.com [104.47.36.52]) by mx0a-0014ca01.pphosted.com with ESMTP id 2qmt3v4vpn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Thu, 14 Feb 2019 11:46:10 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/I0nEkIIaoVKxvqbl4yh9nI9h88/QTHUgmihMIewjWQ=; b=ObXdlOayIzXzA9o+GrO7xdhor+N2UcSHiR6JEXaGuvElEWV4ySDZi5oNIL8jL6fpD2+rvYA6myQfZCGNMEYs+EYI64k3bcPs+cZ2Wmq/W5i9RCJ/dBcLQ4X7ykGvg733EbbQIX8vSsi3BOwDaaBBZ5Pvo1FAfYfM0yrXNvkhr1I= Received: from SN4PR0701CA0003.namprd07.prod.outlook.com (2603:10b6:803:28::13) by BN6PR07MB3089.namprd07.prod.outlook.com (2603:10b6:404:a8::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1601.21; Thu, 14 Feb 2019 19:46:07 +0000 Received: from DM3NAM05FT057.eop-nam05.prod.protection.outlook.com (2a01:111:f400:7e51::207) by SN4PR0701CA0003.outlook.office365.com (2603:10b6:803:28::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1622.16 via Frontend Transport; Thu, 14 Feb 2019 19:46:07 +0000 Received-SPF: SoftFail (protection.outlook.com: domain of transitioning cadence.com discourages use of 158.140.1.28 as permitted sender) Received: from sjmaillnx1.cadence.com (158.140.1.28) by DM3NAM05FT057.mail.protection.outlook.com (10.152.98.116) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1580.2 via Frontend Transport; Thu, 14 Feb 2019 19:46:06 +0000 Received: from maileu3.global.cadence.com (maileu3.cadence.com [10.160.88.99]) by sjmaillnx1.cadence.com (8.14.4/8.14.4) with ESMTP id x1EJk2cS012765 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=OK); Thu, 14 Feb 2019 11:46:05 -0800 X-CrossPremisesHeadersFilteredBySendConnector: maileu3.global.cadence.com Received: from maileu3.global.cadence.com (10.160.88.99) by maileu3.global.cadence.com (10.160.88.99) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Thu, 14 Feb 2019 20:46:01 +0100 Received: from lvlogina.cadence.com (10.165.176.102) by maileu3.global.cadence.com (10.160.88.99) with Microsoft SMTP Server (TLS) id 15.0.1367.3 via Frontend Transport; Thu, 14 Feb 2019 20:46:00 +0100 Received: from lvlogina.cadence.com (localhost.localdomain [127.0.0.1]) by lvlogina.cadence.com (8.14.4/8.14.4) with ESMTP id x1EJk1Ds031420; Thu, 14 Feb 2019 19:46:01 GMT Received: (from pawell@localhost) by lvlogina.cadence.com (8.14.4/8.14.4/Submit) id x1EJk15f031419; Thu, 14 Feb 2019 19:46:01 GMT From: Pawel Laszczak To: CC: , , , , , , , , , , , , , , , , Pawel Laszczak Subject: [PATCH v4 2/6] usb:common Separated decoding functions from dwc3 driver. Date: Thu, 14 Feb 2019 19:45:10 +0000 Message-ID: <1550173514-23573-3-git-send-email-pawell@cadence.com> X-Mailer: git-send-email 1.7.11.2 In-Reply-To: <1550173514-23573-1-git-send-email-pawell@cadence.com> References: <1550173514-23573-1-git-send-email-pawell@cadence.com> MIME-Version: 1.0 Content-Type: text/plain X-OrganizationHeadersPreserved: maileu3.global.cadence.com X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:158.140.1.28;IPV:CAL;SCL:-1;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(376002)(39860400002)(396003)(346002)(136003)(2980300002)(199004)(189003)(36092001)(2616005)(476003)(14444005)(30864003)(6666004)(54906003)(356004)(316002)(426003)(486006)(51416003)(42186006)(76176011)(8936002)(87636003)(36756003)(186003)(8676002)(26005)(50226002)(126002)(16586007)(446003)(11346002)(7636002)(246002)(336012)(305945005)(6306002)(107886003)(478600001)(2906002)(966005)(48376002)(50466002)(7416002)(105596002)(2351001)(86362001)(106466001)(4720700003)(47776003)(26826003)(53386004)(6916009)(4326008);DIR:OUT;SFP:1101;SCL:1;SRVR:BN6PR07MB3089;H:sjmaillnx1.cadence.com;FPR:;SPF:SoftFail;LANG:en;PTR:corp.cadence.com;A:1;MX:1; X-Microsoft-Exchange-Diagnostics: 1;DM3NAM05FT057;1:IyFZfiFrvWiqvSfl6JYXuO1b6iLdYmaIIHTntLWXhAsLDj5iNOPML0neybtb43I4UqdBl13Xb4wcqXKUam/IoNpPWmc26IMWCQDUNSavTTAgSiov7CytAZdQqds6kFqRmQ6z1B3+8WZuq9G9cTm38RVePt5She/Wj60N2BfQQCc= X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8f2871c9-64bc-4688-f369-08d692b50fd3 X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600110)(711020)(4605077)(2017052603328)(7153060);SRVR:BN6PR07MB3089; X-MS-TrafficTypeDiagnostic: BN6PR07MB3089: X-MS-Exchange-PUrlCount: 1 X-Microsoft-Exchange-Diagnostics: 1;BN6PR07MB3089;20:iPf1eZ25hmCbY9khhFcML4owpenP7GY1zSVG19k7dMcrv/Ph3BHP21mzChX1S12w9krFGoGXCZuGZ8fv+3FNGXprCVWOCkQPYy5l9qlW0CP9n57xQ3149qQ75t9MbizJuMD/F/MPvJN8qAflQmNQik90BU+aEWZUYufETxqvAMxOdAE+JyQ98ZSzYYf/agCEX/AkUciqMnlTiR1pedfkXXdECigzCm+E/q2F4ODWMP+++JAv3SOhIyPhvuSSQI3sMXCeCzdYLGSMQdWkxFv8CHCPgXAM6TrP6fQ057N8HV71nFnzjVcTLibdF7ZMlkvFK0ZUqipmtAyeRHizuL8EiS8WM3p3Db4TI1HIPpg8qGf8YzaO0kOf6RxqFZPsQ4jVtK39ZlVsvTBuZv2yNLuBadIm/mIDtObgzqQOxj6MlqE4Zd1R8mXe0L6FJBI9kua7eeRVUX88twYjBGMyXHgN8JWafjuJhzDVwUscLxWYp9SvAEw2UX/IqSHARXTAX0sK X-Microsoft-Antispam-PRVS: X-Forefront-PRVS: 09480768F8 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN6PR07MB3089;23:szVgXsZ+HF6YMT4Hi+NLnf2lkDh+L95ElMzIrARfS?= =?us-ascii?Q?pTC4Kb5yXE4tlPUNcAAeuYQhWz4L4iNCirMNjeYh1qvwuR+z9WCAWizoAa5a?= =?us-ascii?Q?DV/3viG5fbtnhikTbpN0MRGaFy1KQPKGdGJKU1pk8y+bILIzDwyrh9Qi+yE4?= =?us-ascii?Q?H2S8kXOpmWONdDssKaclSg7ZqTpEwAkSaKzrTC5YdYZVMJUiPoOU087ps1KV?= =?us-ascii?Q?Nb7bbTTUHYh+lnlW7Dj3YxALwY3C/QmHbYnnaXuLhcCLGLY7Qy2CFv4Nqt6t?= =?us-ascii?Q?QwmohSUCTOZsR49gDqRQa/YHZnKRixqvGgAbgghWAdzTk8/FGVrKsx5HRqLa?= =?us-ascii?Q?cxph6JsygVNJNm9bPc0lZeNhULUVbjHMSOK4UJauSR+SqU/Njr8+VjFeOJyf?= =?us-ascii?Q?FU3yMlUTb69RJ+nFjQUfilGdABjTmRJOCNB2CJkFxv7WPj+44ewaFw5GOAi5?= =?us-ascii?Q?VPKI/bvICjVJ3weSTXrTof87s0j7l6XCL+CDNYYdnjdEFxlcXk7aCYRkab6T?= =?us-ascii?Q?fl2fd+5AV+1z8302QbfLRX5syf6DoyX/jumJvNRWD3MD/iq+uUphR6gUS89D?= =?us-ascii?Q?RAWxZN9UT3GBwlnOyi3745VBJCqnC9akjDPZEO0pGuJC8W3ZOJ0hrCyopagy?= =?us-ascii?Q?AIYj8LVdo87m/1V53XAeKZVOk8sZB3Rpb+iBny37YX/03x/Kriy1vp+evb1h?= =?us-ascii?Q?3fhjIGjMF8WPG4NkOUI99rjtO0dEBlaw9CuBeSH8O+4CHBIjd9ZoswrflDKq?= =?us-ascii?Q?YZDeOI/FDYsPfS1yzq+sBbuBJfib7xvsZQaRU/A/fcU/QpoAyC2DAjRr4uNq?= =?us-ascii?Q?hUh2giXpdNibWTucsq+uDxNEuhjTKdmAjs4TpUrkdd/jJBfzmMak07hwHE6n?= =?us-ascii?Q?WOpJMVgqGQiPR2huu9L1l6I1vbUlFzgVrKI+Y3rv077o7VA3k98dAoOur/E3?= =?us-ascii?Q?D0agHm1bNQYtMAvTZ4BOCGSeMIpOQeYP9H6vGM583vnGI+6DGTtWTM6Q5kPc?= =?us-ascii?Q?QCTJdm/AzsoyDfHrpGcDZbsBjS6XMJaFr1ykWs7jUG0h8vZcUV8wi018E6fw?= =?us-ascii?Q?n3rSQ2csCY/Dgy50Cr2f90XBO2sAoSeg3S5fn8D1sOLZtcSmAis+Rw3RaEmb?= =?us-ascii?Q?Wle+WrVnCIWVJL8+T4PBeWjXl8gZMDuMpOCRxOG9mBorY3V4pIDee8vitm3v?= =?us-ascii?Q?WGRV9tZ0WApdrapzhsroLrUW6ALOrJoPVOw?= X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: tbv1WF294/v2OOE3m37ou0FuFQYCgs1tfflGFrCfL6N0It+1r4VBoEFci3X+8C7obkCTYNInw5V1Gk5c09hMAppO+/GAzApi8OhvTRBSFvjipBHXJRD4ikKcQ9pwqNOcW0N9nY2SJNWyZA3vPY2E6H/4DU7NmeXWq9YL1Ja7jFU6DuiFNP/itFrQ4vrvQp8MI9kwOpQ0OsNHzoAF9usFRnmveyX3qdyJU69SEmlZmZpn5jHc3Jx9TBkSiMG/fjaLbOKMFZgg4iuXQnBKhqMClFJRgD2nDMxD/zWOvrEHWryAGn7uw8tx/26OnvFiTeBScSQxXLB9a/0SHWBBiEdi1414R3vK69bnFxn4ztxrA2SCDzGagL0WA5l4jsfq9/2vZlbQeVgg2mLU/fG7t8KJgKTlJIJBpdaskjzU1fpKRk0= X-Microsoft-Exchange-Diagnostics: 1;BN6PR07MB3089;20:CqouZH9bS1c4cVq9zw5lK+BgPH4KGSLs/GzqDLrdBqcmYf3FNNxJzs5gUurjL18AJm1ObcrxoGOlxxTdRSM7YNWqmvXoCAFgVaj/XeLhX/NQavcVh53h26Zl6A0HvwvBZYDNF3bjr06SdCFFUR0iVg6GB2Vg+/0MG/uHbQka87VFnPeX/f9TTmtuTihs/nHit4jAxuADRMwhkU/dPqhwjgPZVDjwxHYa5ZOPV/k0VcRVxrkjjq1kAW0xkcM65opW X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2019 19:46:06.3081 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8f2871c9-64bc-4688-f369-08d692b50fd3 X-MS-Exchange-CrossTenant-Id: d36035c5-6ce6-4662-a3dc-e762e61ae4c9 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d36035c5-6ce6-4662-a3dc-e762e61ae4c9;Ip=[158.140.1.28];Helo=[sjmaillnx1.cadence.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR07MB3089 X-Proofpoint-SPF-Result: pass X-Proofpoint-SPF-Record: v=spf1 include:_spf.salesforce.com include:mktomail.com include:spf-0014ca01.pphosted.com include:spf.protection.outlook.com include:auth.msgapp.com include:spf.mandrillapp.com ~all X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2019-02-14_10:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1902140131 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Patch moves some decoding functions from driver/usb/dwc3/debug.h driver to driver/usb/common/debug.c file. These moved functions include: dwc3_decode_get_status dwc3_decode_set_clear_feature dwc3_decode_set_address dwc3_decode_get_set_descriptor dwc3_decode_get_configuration dwc3_decode_set_configuration dwc3_decode_get_intf dwc3_decode_set_intf dwc3_decode_synch_frame dwc3_decode_set_sel dwc3_decode_set_isoch_delay dwc3_decode_ctrl These functions are used also in inroduced cdns3 driver. All functions prefixes were changed from dwc3 to usb. Also, function's parameters has been extended according to the name of fields in standard SETUP packet. Additionally, patch adds usb_decode_ctrl function to include/linux/usb/ch9.h file. Signed-off-by: Pawel Laszczak --- drivers/usb/common/Makefile | 2 +- drivers/usb/common/debug.c | 270 ++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/debug.h | 249 --------------------------------- drivers/usb/dwc3/trace.h | 2 +- include/linux/usb/ch9.h | 25 ++++ 5 files changed, 297 insertions(+), 251 deletions(-) create mode 100644 drivers/usb/common/debug.c diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile index fb4d5ef4165c..3d3d2962ea4b 100644 --- a/drivers/usb/common/Makefile +++ b/drivers/usb/common/Makefile @@ -4,7 +4,7 @@ # obj-$(CONFIG_USB_COMMON) += usb-common.o -usb-common-y += common.o +usb-common-y += common.o debug.o usb-common-$(CONFIG_USB_LED_TRIG) += led.o obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o diff --git a/drivers/usb/common/debug.c b/drivers/usb/common/debug.c new file mode 100644 index 000000000000..3fdf116da909 --- /dev/null +++ b/drivers/usb/common/debug.c @@ -0,0 +1,270 @@ +// SPDX-License-Identifier: GPL-2.0 +/** + * Common USB debugging functions + * + * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com + * + * Authors: Felipe Balbi , + * Sebastian Andrzej Siewior + */ + +#ifndef __LINUX_USB_COMMON_DEBUG +#define __LINUX_USB_COMMON_DEBUG + +#include + +static void usb_decode_get_status(__u8 bRequestType, __u16 wIndex, + __u16 wLength, char *str, size_t size) +{ + switch (bRequestType & USB_RECIP_MASK) { + case USB_RECIP_INTERFACE: + snprintf(str, size, + "Get Interface Status(Intf = %d, Length = %d)", + wIndex, wLength); + break; + case USB_RECIP_ENDPOINT: + snprintf(str, size, "Get Endpoint Status(ep%d%s)", + wIndex & ~USB_DIR_IN, + wIndex & USB_DIR_IN ? "in" : "out"); + break; + } +} + +static void usb_decode_set_clear_feature(__u8 bRequestType, __u8 bRequest, + __u16 wValue, __u16 wIndex, + char *str, size_t size) +{ + switch (bRequestType & USB_RECIP_MASK) { + case USB_RECIP_DEVICE: + snprintf(str, size, "%s Device Feature(%s%s)", + bRequest == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", + ({char *s; + switch (wValue) { + case USB_DEVICE_SELF_POWERED: + s = "Self Powered"; + break; + case USB_DEVICE_REMOTE_WAKEUP: + s = "Remote Wakeup"; + break; + case USB_DEVICE_TEST_MODE: + s = "Test Mode"; + break; + case USB_DEVICE_U1_ENABLE: + s = "U1 Enable"; + break; + case USB_DEVICE_U2_ENABLE: + s = "U2 Enable"; + break; + case USB_DEVICE_LTM_ENABLE: + s = "LTM Enable"; + break; + default: + s = "UNKNOWN"; + } s; }), + wValue == USB_DEVICE_TEST_MODE ? + ({ char *s; + switch (wIndex) { + case TEST_J: + s = ": TEST_J"; + break; + case TEST_K: + s = ": TEST_K"; + break; + case TEST_SE0_NAK: + s = ": TEST_SE0_NAK"; + break; + case TEST_PACKET: + s = ": TEST_PACKET"; + break; + case TEST_FORCE_EN: + s = ": TEST_FORCE_EN"; + break; + default: + s = ": UNKNOWN"; + } s; }) : ""); + break; + case USB_RECIP_INTERFACE: + snprintf(str, size, "%s Interface Feature(%s)", + bRequest == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", + wValue == USB_INTRF_FUNC_SUSPEND ? + "Function Suspend" : "UNKNOWN"); + break; + case USB_RECIP_ENDPOINT: + snprintf(str, size, "%s Endpoint Feature(%s ep%d%s)", + bRequest == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", + wValue == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN", + wIndex & ~USB_DIR_IN, + wIndex & USB_DIR_IN ? "in" : "out"); + break; + } +} + +static void usb_decode_set_address(__u16 wValue, char *str, size_t size) +{ + snprintf(str, size, "Set Address(Addr = %02x)", wValue); +} + +static void usb_decode_get_set_descriptor(__u8 bRequestType, __u8 bRequest, + __u16 wValue, __u16 wIndex, + __u16 wLength, char *str, size_t size) +{ + snprintf(str, size, "%s %s Descriptor(Index = %d, Length = %d)", + bRequest == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set", + ({ char *s; + switch (wValue >> 8) { + case USB_DT_DEVICE: + s = "Device"; + break; + case USB_DT_CONFIG: + s = "Configuration"; + break; + case USB_DT_STRING: + s = "String"; + break; + case USB_DT_INTERFACE: + s = "Interface"; + break; + case USB_DT_ENDPOINT: + s = "Endpoint"; + break; + case USB_DT_DEVICE_QUALIFIER: + s = "Device Qualifier"; + break; + case USB_DT_OTHER_SPEED_CONFIG: + s = "Other Speed Config"; + break; + case USB_DT_INTERFACE_POWER: + s = "Interface Power"; + break; + case USB_DT_OTG: + s = "OTG"; + break; + case USB_DT_DEBUG: + s = "Debug"; + break; + case USB_DT_INTERFACE_ASSOCIATION: + s = "Interface Association"; + break; + case USB_DT_BOS: + s = "BOS"; + break; + case USB_DT_DEVICE_CAPABILITY: + s = "Device Capability"; + break; + case USB_DT_PIPE_USAGE: + s = "Pipe Usage"; + break; + case USB_DT_SS_ENDPOINT_COMP: + s = "SS Endpoint Companion"; + break; + case USB_DT_SSP_ISOC_ENDPOINT_COMP: + s = "SSP Isochronous Endpoint Companion"; + break; + default: + s = "UNKNOWN"; + break; + } s; }), wValue & 0xff, wLength); +} + +static void usb_decode_get_configuration(__u16 wLength, char *str, size_t size) +{ + snprintf(str, size, "Get Configuration(Length = %d)", wLength); +} + +static void usb_decode_set_configuration(__u8 wValue, char *str, size_t size) +{ + snprintf(str, size, "Set Configuration(Config = %d)", wValue); +} + +static void usb_decode_get_intf(__u16 wIndex, __u16 wLength, char *str, + size_t size) +{ + snprintf(str, size, "Get Interface(Intf = %d, Length = %d)", + wIndex, wLength); +} + +static void usb_decode_set_intf(__u8 wValue, __u16 wIndex, char *str, + size_t size) +{ + snprintf(str, size, "Set Interface(Intf = %d, Alt.Setting = %d)", + wIndex, wValue); +} + +static void usb_decode_synch_frame(__u16 wIndex, __u16 wLength, + char *str, size_t size) +{ + snprintf(str, size, "Synch Frame(Endpoint = %d, Length = %d)", + wIndex, wLength); +} + +static void usb_decode_set_sel(__u16 wLength, char *str, size_t size) +{ + snprintf(str, size, "Set SEL(Length = %d)", wLength); +} + +static void usb_decode_set_isoch_delay(__u8 wValue, char *str, size_t size) +{ + snprintf(str, size, "Set Isochronous Delay(Delay = %d ns)", wValue); +} + +/** + * usb_decode_ctrl - returns a string representation of ctrl request + */ +const char *usb_decode_ctrl(char *str, size_t size, __u8 bRequestType, + __u8 bRequest, __u16 wValue, __u16 wIndex, + __u16 wLength) +{ + switch (bRequest) { + case USB_REQ_GET_STATUS: + usb_decode_get_status(bRequestType, wIndex, wLength, str, size); + break; + case USB_REQ_CLEAR_FEATURE: + case USB_REQ_SET_FEATURE: + usb_decode_set_clear_feature(bRequestType, bRequest, wValue, + wIndex, str, size); + break; + case USB_REQ_SET_ADDRESS: + usb_decode_set_address(wValue, str, size); + break; + case USB_REQ_GET_DESCRIPTOR: + case USB_REQ_SET_DESCRIPTOR: + usb_decode_get_set_descriptor(bRequestType, bRequest, wValue, + wIndex, wLength, str, size); + break; + case USB_REQ_GET_CONFIGURATION: + usb_decode_get_configuration(wLength, str, size); + break; + case USB_REQ_SET_CONFIGURATION: + usb_decode_set_configuration(wValue, str, size); + break; + case USB_REQ_GET_INTERFACE: + usb_decode_get_intf(wIndex, wLength, str, size); + break; + case USB_REQ_SET_INTERFACE: + usb_decode_set_intf(wValue, wIndex, str, size); + break; + case USB_REQ_SYNCH_FRAME: + usb_decode_synch_frame(wIndex, wLength, str, size); + break; + case USB_REQ_SET_SEL: + usb_decode_set_sel(wLength, str, size); + break; + case USB_REQ_SET_ISOCH_DELAY: + usb_decode_set_isoch_delay(wValue, str, size); + break; + default: + snprintf(str, size, "%02x %02x %02x %02x %02x %02x %02x %02x", + bRequestType, bRequest, + (u8)(cpu_to_le16(wValue) & 0xff), + (u8)(cpu_to_le16(wValue) >> 8), + (u8)(cpu_to_le16(wIndex) & 0xff), + (u8)(cpu_to_le16(wIndex) >> 8), + (u8)(cpu_to_le16(wLength) & 0xff), + (u8)(cpu_to_le16(wLength) >> 8)); + } + + return str; +} +EXPORT_SYMBOL_GPL(usb_decode_ctrl); + +#endif /* __LINUX_USB_COMMON_DEBUG */ diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h index 6ec4280fa40c..3cf84c0ba486 100644 --- a/drivers/usb/dwc3/debug.h +++ b/drivers/usb/dwc3/debug.h @@ -217,255 +217,6 @@ static inline const char *dwc3_gadget_event_string(char *str, size_t size, return str; } -static inline void dwc3_decode_get_status(__u8 t, __u16 i, __u16 l, char *str, - size_t size) -{ - switch (t & USB_RECIP_MASK) { - case USB_RECIP_INTERFACE: - snprintf(str, size, "Get Interface Status(Intf = %d, Length = %d)", - i, l); - break; - case USB_RECIP_ENDPOINT: - snprintf(str, size, "Get Endpoint Status(ep%d%s)", - i & ~USB_DIR_IN, - i & USB_DIR_IN ? "in" : "out"); - break; - } -} - -static inline void dwc3_decode_set_clear_feature(__u8 t, __u8 b, __u16 v, - __u16 i, char *str, size_t size) -{ - switch (t & USB_RECIP_MASK) { - case USB_RECIP_DEVICE: - snprintf(str, size, "%s Device Feature(%s%s)", - b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", - ({char *s; - switch (v) { - case USB_DEVICE_SELF_POWERED: - s = "Self Powered"; - break; - case USB_DEVICE_REMOTE_WAKEUP: - s = "Remote Wakeup"; - break; - case USB_DEVICE_TEST_MODE: - s = "Test Mode"; - break; - case USB_DEVICE_U1_ENABLE: - s = "U1 Enable"; - break; - case USB_DEVICE_U2_ENABLE: - s = "U2 Enable"; - break; - case USB_DEVICE_LTM_ENABLE: - s = "LTM Enable"; - break; - default: - s = "UNKNOWN"; - } s; }), - v == USB_DEVICE_TEST_MODE ? - ({ char *s; - switch (i) { - case TEST_J: - s = ": TEST_J"; - break; - case TEST_K: - s = ": TEST_K"; - break; - case TEST_SE0_NAK: - s = ": TEST_SE0_NAK"; - break; - case TEST_PACKET: - s = ": TEST_PACKET"; - break; - case TEST_FORCE_EN: - s = ": TEST_FORCE_EN"; - break; - default: - s = ": UNKNOWN"; - } s; }) : ""); - break; - case USB_RECIP_INTERFACE: - snprintf(str, size, "%s Interface Feature(%s)", - b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", - v == USB_INTRF_FUNC_SUSPEND ? - "Function Suspend" : "UNKNOWN"); - break; - case USB_RECIP_ENDPOINT: - snprintf(str, size, "%s Endpoint Feature(%s ep%d%s)", - b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", - v == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN", - i & ~USB_DIR_IN, - i & USB_DIR_IN ? "in" : "out"); - break; - } -} - -static inline void dwc3_decode_set_address(__u16 v, char *str, size_t size) -{ - snprintf(str, size, "Set Address(Addr = %02x)", v); -} - -static inline void dwc3_decode_get_set_descriptor(__u8 t, __u8 b, __u16 v, - __u16 i, __u16 l, char *str, size_t size) -{ - snprintf(str, size, "%s %s Descriptor(Index = %d, Length = %d)", - b == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set", - ({ char *s; - switch (v >> 8) { - case USB_DT_DEVICE: - s = "Device"; - break; - case USB_DT_CONFIG: - s = "Configuration"; - break; - case USB_DT_STRING: - s = "String"; - break; - case USB_DT_INTERFACE: - s = "Interface"; - break; - case USB_DT_ENDPOINT: - s = "Endpoint"; - break; - case USB_DT_DEVICE_QUALIFIER: - s = "Device Qualifier"; - break; - case USB_DT_OTHER_SPEED_CONFIG: - s = "Other Speed Config"; - break; - case USB_DT_INTERFACE_POWER: - s = "Interface Power"; - break; - case USB_DT_OTG: - s = "OTG"; - break; - case USB_DT_DEBUG: - s = "Debug"; - break; - case USB_DT_INTERFACE_ASSOCIATION: - s = "Interface Association"; - break; - case USB_DT_BOS: - s = "BOS"; - break; - case USB_DT_DEVICE_CAPABILITY: - s = "Device Capability"; - break; - case USB_DT_PIPE_USAGE: - s = "Pipe Usage"; - break; - case USB_DT_SS_ENDPOINT_COMP: - s = "SS Endpoint Companion"; - break; - case USB_DT_SSP_ISOC_ENDPOINT_COMP: - s = "SSP Isochronous Endpoint Companion"; - break; - default: - s = "UNKNOWN"; - break; - } s; }), v & 0xff, l); -} - - -static inline void dwc3_decode_get_configuration(__u16 l, char *str, - size_t size) -{ - snprintf(str, size, "Get Configuration(Length = %d)", l); -} - -static inline void dwc3_decode_set_configuration(__u8 v, char *str, size_t size) -{ - snprintf(str, size, "Set Configuration(Config = %d)", v); -} - -static inline void dwc3_decode_get_intf(__u16 i, __u16 l, char *str, - size_t size) -{ - snprintf(str, size, "Get Interface(Intf = %d, Length = %d)", i, l); -} - -static inline void dwc3_decode_set_intf(__u8 v, __u16 i, char *str, size_t size) -{ - snprintf(str, size, "Set Interface(Intf = %d, Alt.Setting = %d)", i, v); -} - -static inline void dwc3_decode_synch_frame(__u16 i, __u16 l, char *str, - size_t size) -{ - snprintf(str, size, "Synch Frame(Endpoint = %d, Length = %d)", i, l); -} - -static inline void dwc3_decode_set_sel(__u16 l, char *str, size_t size) -{ - snprintf(str, size, "Set SEL(Length = %d)", l); -} - -static inline void dwc3_decode_set_isoch_delay(__u8 v, char *str, size_t size) -{ - snprintf(str, size, "Set Isochronous Delay(Delay = %d ns)", v); -} - -/** - * dwc3_decode_ctrl - returns a string represetion of ctrl request - */ -static inline const char *dwc3_decode_ctrl(char *str, size_t size, - __u8 bRequestType, __u8 bRequest, __u16 wValue, __u16 wIndex, - __u16 wLength) -{ - switch (bRequest) { - case USB_REQ_GET_STATUS: - dwc3_decode_get_status(bRequestType, wIndex, wLength, str, - size); - break; - case USB_REQ_CLEAR_FEATURE: - case USB_REQ_SET_FEATURE: - dwc3_decode_set_clear_feature(bRequestType, bRequest, wValue, - wIndex, str, size); - break; - case USB_REQ_SET_ADDRESS: - dwc3_decode_set_address(wValue, str, size); - break; - case USB_REQ_GET_DESCRIPTOR: - case USB_REQ_SET_DESCRIPTOR: - dwc3_decode_get_set_descriptor(bRequestType, bRequest, wValue, - wIndex, wLength, str, size); - break; - case USB_REQ_GET_CONFIGURATION: - dwc3_decode_get_configuration(wLength, str, size); - break; - case USB_REQ_SET_CONFIGURATION: - dwc3_decode_set_configuration(wValue, str, size); - break; - case USB_REQ_GET_INTERFACE: - dwc3_decode_get_intf(wIndex, wLength, str, size); - break; - case USB_REQ_SET_INTERFACE: - dwc3_decode_set_intf(wValue, wIndex, str, size); - break; - case USB_REQ_SYNCH_FRAME: - dwc3_decode_synch_frame(wIndex, wLength, str, size); - break; - case USB_REQ_SET_SEL: - dwc3_decode_set_sel(wLength, str, size); - break; - case USB_REQ_SET_ISOCH_DELAY: - dwc3_decode_set_isoch_delay(wValue, str, size); - break; - default: - snprintf(str, size, "%02x %02x %02x %02x %02x %02x %02x %02x", - bRequestType, bRequest, - cpu_to_le16(wValue) & 0xff, - cpu_to_le16(wValue) >> 8, - cpu_to_le16(wIndex) & 0xff, - cpu_to_le16(wIndex) >> 8, - cpu_to_le16(wLength) & 0xff, - cpu_to_le16(wLength) >> 8); - } - - return str; -} - /** * dwc3_ep_event_string - returns event name * @event: then event code diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h index 5d479c508cb5..32196b9bc45b 100644 --- a/drivers/usb/dwc3/trace.h +++ b/drivers/usb/dwc3/trace.h @@ -86,7 +86,7 @@ DECLARE_EVENT_CLASS(dwc3_log_ctrl, __entry->wIndex = le16_to_cpu(ctrl->wIndex); __entry->wLength = le16_to_cpu(ctrl->wLength); ), - TP_printk("%s", dwc3_decode_ctrl(__get_str(str), DWC3_MSG_MAX, + TP_printk("%s", usb_decode_ctrl(__get_str(str), DWC3_MSG_MAX, __entry->bRequestType, __entry->bRequest, __entry->wValue, __entry->wIndex, __entry->wLength) diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 523aa088f6ab..db21b11bec6e 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -62,4 +62,29 @@ extern enum usb_device_speed usb_get_maximum_speed(struct device *dev); */ extern const char *usb_state_string(enum usb_device_state state); +/** + * usb_decode_ctrl - Returns human readable representation of control request. + * @str: buffer to return a human-readable representation of control request. + * This buffer should have about 200 bytes. + * @size: size of str buffer. + * @bRequestType: matches the USB bmRequestType field + * @bRequest: matches the USB bRequest field + * @wValue: matches the USB wValue field (CPU byte order) + * @wIndex: matches the USB wIndex field (CPU byte order) + * @wLength: matches the USB wLength field (CPU byte order) + * + * Function returns decoded, formatted and human-readable description of + * control request packet. + * + * The usage scenario for this is for tracepoints, so function as a return + * use the same value as in parameters. This approach allows to use this + * function in TP_printk + * + * Important: wValue, wIndex, wLength parameters before invoking this function + * should be processed by le16_to_cpu macro. + */ +const char *usb_decode_ctrl(char *str, size_t size, __u8 bRequestType, + __u8 bRequest, __u16 wValue, __u16 wIndex, + __u16 wLength); + #endif /* __LINUX_USB_CH9_H */ -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pawel Laszczak Subject: [PATCH v4 2/6] usb:common Separated decoding functions from dwc3 driver. Date: Thu, 14 Feb 2019 19:45:10 +0000 Message-ID: <1550173514-23573-3-git-send-email-pawell@cadence.com> References: <1550173514-23573-1-git-send-email-pawell@cadence.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: In-Reply-To: <1550173514-23573-1-git-send-email-pawell@cadence.com> Sender: linux-kernel-owner@vger.kernel.org To: devicetree@vger.kernel.org Cc: gregkh@linuxfoundation.org, felipe.balbi@linux.intel.com, mark.rutland@arm.com, linux-usb@vger.kernel.org, hdegoede@redhat.com, heikki.krogerus@linux.intel.com, andy.shevchenko@gmail.com, robh+dt@kernel.org, rogerq@ti.com, linux-kernel@vger.kernel.org, jbergsagel@ti.com, nsekhar@ti.com, nm@ti.com, sureshp@cadence.com, peter.chen@nxp.com, kurahul@cadence.com, Pawel Laszczak List-Id: devicetree@vger.kernel.org Patch moves some decoding functions from driver/usb/dwc3/debug.h driver to driver/usb/common/debug.c file. These moved functions include: dwc3_decode_get_status dwc3_decode_set_clear_feature dwc3_decode_set_address dwc3_decode_get_set_descriptor dwc3_decode_get_configuration dwc3_decode_set_configuration dwc3_decode_get_intf dwc3_decode_set_intf dwc3_decode_synch_frame dwc3_decode_set_sel dwc3_decode_set_isoch_delay dwc3_decode_ctrl These functions are used also in inroduced cdns3 driver. All functions prefixes were changed from dwc3 to usb. Also, function's parameters has been extended according to the name of fields in standard SETUP packet. Additionally, patch adds usb_decode_ctrl function to include/linux/usb/ch9.h file. Signed-off-by: Pawel Laszczak --- drivers/usb/common/Makefile | 2 +- drivers/usb/common/debug.c | 270 ++++++++++++++++++++++++++++++++++++ drivers/usb/dwc3/debug.h | 249 --------------------------------- drivers/usb/dwc3/trace.h | 2 +- include/linux/usb/ch9.h | 25 ++++ 5 files changed, 297 insertions(+), 251 deletions(-) create mode 100644 drivers/usb/common/debug.c diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile index fb4d5ef4165c..3d3d2962ea4b 100644 --- a/drivers/usb/common/Makefile +++ b/drivers/usb/common/Makefile @@ -4,7 +4,7 @@ # obj-$(CONFIG_USB_COMMON) += usb-common.o -usb-common-y += common.o +usb-common-y += common.o debug.o usb-common-$(CONFIG_USB_LED_TRIG) += led.o obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o diff --git a/drivers/usb/common/debug.c b/drivers/usb/common/debug.c new file mode 100644 index 000000000000..3fdf116da909 --- /dev/null +++ b/drivers/usb/common/debug.c @@ -0,0 +1,270 @@ +// SPDX-License-Identifier: GPL-2.0 +/** + * Common USB debugging functions + * + * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com + * + * Authors: Felipe Balbi , + * Sebastian Andrzej Siewior + */ + +#ifndef __LINUX_USB_COMMON_DEBUG +#define __LINUX_USB_COMMON_DEBUG + +#include + +static void usb_decode_get_status(__u8 bRequestType, __u16 wIndex, + __u16 wLength, char *str, size_t size) +{ + switch (bRequestType & USB_RECIP_MASK) { + case USB_RECIP_INTERFACE: + snprintf(str, size, + "Get Interface Status(Intf = %d, Length = %d)", + wIndex, wLength); + break; + case USB_RECIP_ENDPOINT: + snprintf(str, size, "Get Endpoint Status(ep%d%s)", + wIndex & ~USB_DIR_IN, + wIndex & USB_DIR_IN ? "in" : "out"); + break; + } +} + +static void usb_decode_set_clear_feature(__u8 bRequestType, __u8 bRequest, + __u16 wValue, __u16 wIndex, + char *str, size_t size) +{ + switch (bRequestType & USB_RECIP_MASK) { + case USB_RECIP_DEVICE: + snprintf(str, size, "%s Device Feature(%s%s)", + bRequest == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", + ({char *s; + switch (wValue) { + case USB_DEVICE_SELF_POWERED: + s = "Self Powered"; + break; + case USB_DEVICE_REMOTE_WAKEUP: + s = "Remote Wakeup"; + break; + case USB_DEVICE_TEST_MODE: + s = "Test Mode"; + break; + case USB_DEVICE_U1_ENABLE: + s = "U1 Enable"; + break; + case USB_DEVICE_U2_ENABLE: + s = "U2 Enable"; + break; + case USB_DEVICE_LTM_ENABLE: + s = "LTM Enable"; + break; + default: + s = "UNKNOWN"; + } s; }), + wValue == USB_DEVICE_TEST_MODE ? + ({ char *s; + switch (wIndex) { + case TEST_J: + s = ": TEST_J"; + break; + case TEST_K: + s = ": TEST_K"; + break; + case TEST_SE0_NAK: + s = ": TEST_SE0_NAK"; + break; + case TEST_PACKET: + s = ": TEST_PACKET"; + break; + case TEST_FORCE_EN: + s = ": TEST_FORCE_EN"; + break; + default: + s = ": UNKNOWN"; + } s; }) : ""); + break; + case USB_RECIP_INTERFACE: + snprintf(str, size, "%s Interface Feature(%s)", + bRequest == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", + wValue == USB_INTRF_FUNC_SUSPEND ? + "Function Suspend" : "UNKNOWN"); + break; + case USB_RECIP_ENDPOINT: + snprintf(str, size, "%s Endpoint Feature(%s ep%d%s)", + bRequest == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", + wValue == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN", + wIndex & ~USB_DIR_IN, + wIndex & USB_DIR_IN ? "in" : "out"); + break; + } +} + +static void usb_decode_set_address(__u16 wValue, char *str, size_t size) +{ + snprintf(str, size, "Set Address(Addr = %02x)", wValue); +} + +static void usb_decode_get_set_descriptor(__u8 bRequestType, __u8 bRequest, + __u16 wValue, __u16 wIndex, + __u16 wLength, char *str, size_t size) +{ + snprintf(str, size, "%s %s Descriptor(Index = %d, Length = %d)", + bRequest == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set", + ({ char *s; + switch (wValue >> 8) { + case USB_DT_DEVICE: + s = "Device"; + break; + case USB_DT_CONFIG: + s = "Configuration"; + break; + case USB_DT_STRING: + s = "String"; + break; + case USB_DT_INTERFACE: + s = "Interface"; + break; + case USB_DT_ENDPOINT: + s = "Endpoint"; + break; + case USB_DT_DEVICE_QUALIFIER: + s = "Device Qualifier"; + break; + case USB_DT_OTHER_SPEED_CONFIG: + s = "Other Speed Config"; + break; + case USB_DT_INTERFACE_POWER: + s = "Interface Power"; + break; + case USB_DT_OTG: + s = "OTG"; + break; + case USB_DT_DEBUG: + s = "Debug"; + break; + case USB_DT_INTERFACE_ASSOCIATION: + s = "Interface Association"; + break; + case USB_DT_BOS: + s = "BOS"; + break; + case USB_DT_DEVICE_CAPABILITY: + s = "Device Capability"; + break; + case USB_DT_PIPE_USAGE: + s = "Pipe Usage"; + break; + case USB_DT_SS_ENDPOINT_COMP: + s = "SS Endpoint Companion"; + break; + case USB_DT_SSP_ISOC_ENDPOINT_COMP: + s = "SSP Isochronous Endpoint Companion"; + break; + default: + s = "UNKNOWN"; + break; + } s; }), wValue & 0xff, wLength); +} + +static void usb_decode_get_configuration(__u16 wLength, char *str, size_t size) +{ + snprintf(str, size, "Get Configuration(Length = %d)", wLength); +} + +static void usb_decode_set_configuration(__u8 wValue, char *str, size_t size) +{ + snprintf(str, size, "Set Configuration(Config = %d)", wValue); +} + +static void usb_decode_get_intf(__u16 wIndex, __u16 wLength, char *str, + size_t size) +{ + snprintf(str, size, "Get Interface(Intf = %d, Length = %d)", + wIndex, wLength); +} + +static void usb_decode_set_intf(__u8 wValue, __u16 wIndex, char *str, + size_t size) +{ + snprintf(str, size, "Set Interface(Intf = %d, Alt.Setting = %d)", + wIndex, wValue); +} + +static void usb_decode_synch_frame(__u16 wIndex, __u16 wLength, + char *str, size_t size) +{ + snprintf(str, size, "Synch Frame(Endpoint = %d, Length = %d)", + wIndex, wLength); +} + +static void usb_decode_set_sel(__u16 wLength, char *str, size_t size) +{ + snprintf(str, size, "Set SEL(Length = %d)", wLength); +} + +static void usb_decode_set_isoch_delay(__u8 wValue, char *str, size_t size) +{ + snprintf(str, size, "Set Isochronous Delay(Delay = %d ns)", wValue); +} + +/** + * usb_decode_ctrl - returns a string representation of ctrl request + */ +const char *usb_decode_ctrl(char *str, size_t size, __u8 bRequestType, + __u8 bRequest, __u16 wValue, __u16 wIndex, + __u16 wLength) +{ + switch (bRequest) { + case USB_REQ_GET_STATUS: + usb_decode_get_status(bRequestType, wIndex, wLength, str, size); + break; + case USB_REQ_CLEAR_FEATURE: + case USB_REQ_SET_FEATURE: + usb_decode_set_clear_feature(bRequestType, bRequest, wValue, + wIndex, str, size); + break; + case USB_REQ_SET_ADDRESS: + usb_decode_set_address(wValue, str, size); + break; + case USB_REQ_GET_DESCRIPTOR: + case USB_REQ_SET_DESCRIPTOR: + usb_decode_get_set_descriptor(bRequestType, bRequest, wValue, + wIndex, wLength, str, size); + break; + case USB_REQ_GET_CONFIGURATION: + usb_decode_get_configuration(wLength, str, size); + break; + case USB_REQ_SET_CONFIGURATION: + usb_decode_set_configuration(wValue, str, size); + break; + case USB_REQ_GET_INTERFACE: + usb_decode_get_intf(wIndex, wLength, str, size); + break; + case USB_REQ_SET_INTERFACE: + usb_decode_set_intf(wValue, wIndex, str, size); + break; + case USB_REQ_SYNCH_FRAME: + usb_decode_synch_frame(wIndex, wLength, str, size); + break; + case USB_REQ_SET_SEL: + usb_decode_set_sel(wLength, str, size); + break; + case USB_REQ_SET_ISOCH_DELAY: + usb_decode_set_isoch_delay(wValue, str, size); + break; + default: + snprintf(str, size, "%02x %02x %02x %02x %02x %02x %02x %02x", + bRequestType, bRequest, + (u8)(cpu_to_le16(wValue) & 0xff), + (u8)(cpu_to_le16(wValue) >> 8), + (u8)(cpu_to_le16(wIndex) & 0xff), + (u8)(cpu_to_le16(wIndex) >> 8), + (u8)(cpu_to_le16(wLength) & 0xff), + (u8)(cpu_to_le16(wLength) >> 8)); + } + + return str; +} +EXPORT_SYMBOL_GPL(usb_decode_ctrl); + +#endif /* __LINUX_USB_COMMON_DEBUG */ diff --git a/drivers/usb/dwc3/debug.h b/drivers/usb/dwc3/debug.h index 6ec4280fa40c..3cf84c0ba486 100644 --- a/drivers/usb/dwc3/debug.h +++ b/drivers/usb/dwc3/debug.h @@ -217,255 +217,6 @@ static inline const char *dwc3_gadget_event_string(char *str, size_t size, return str; } -static inline void dwc3_decode_get_status(__u8 t, __u16 i, __u16 l, char *str, - size_t size) -{ - switch (t & USB_RECIP_MASK) { - case USB_RECIP_INTERFACE: - snprintf(str, size, "Get Interface Status(Intf = %d, Length = %d)", - i, l); - break; - case USB_RECIP_ENDPOINT: - snprintf(str, size, "Get Endpoint Status(ep%d%s)", - i & ~USB_DIR_IN, - i & USB_DIR_IN ? "in" : "out"); - break; - } -} - -static inline void dwc3_decode_set_clear_feature(__u8 t, __u8 b, __u16 v, - __u16 i, char *str, size_t size) -{ - switch (t & USB_RECIP_MASK) { - case USB_RECIP_DEVICE: - snprintf(str, size, "%s Device Feature(%s%s)", - b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", - ({char *s; - switch (v) { - case USB_DEVICE_SELF_POWERED: - s = "Self Powered"; - break; - case USB_DEVICE_REMOTE_WAKEUP: - s = "Remote Wakeup"; - break; - case USB_DEVICE_TEST_MODE: - s = "Test Mode"; - break; - case USB_DEVICE_U1_ENABLE: - s = "U1 Enable"; - break; - case USB_DEVICE_U2_ENABLE: - s = "U2 Enable"; - break; - case USB_DEVICE_LTM_ENABLE: - s = "LTM Enable"; - break; - default: - s = "UNKNOWN"; - } s; }), - v == USB_DEVICE_TEST_MODE ? - ({ char *s; - switch (i) { - case TEST_J: - s = ": TEST_J"; - break; - case TEST_K: - s = ": TEST_K"; - break; - case TEST_SE0_NAK: - s = ": TEST_SE0_NAK"; - break; - case TEST_PACKET: - s = ": TEST_PACKET"; - break; - case TEST_FORCE_EN: - s = ": TEST_FORCE_EN"; - break; - default: - s = ": UNKNOWN"; - } s; }) : ""); - break; - case USB_RECIP_INTERFACE: - snprintf(str, size, "%s Interface Feature(%s)", - b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", - v == USB_INTRF_FUNC_SUSPEND ? - "Function Suspend" : "UNKNOWN"); - break; - case USB_RECIP_ENDPOINT: - snprintf(str, size, "%s Endpoint Feature(%s ep%d%s)", - b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", - v == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN", - i & ~USB_DIR_IN, - i & USB_DIR_IN ? "in" : "out"); - break; - } -} - -static inline void dwc3_decode_set_address(__u16 v, char *str, size_t size) -{ - snprintf(str, size, "Set Address(Addr = %02x)", v); -} - -static inline void dwc3_decode_get_set_descriptor(__u8 t, __u8 b, __u16 v, - __u16 i, __u16 l, char *str, size_t size) -{ - snprintf(str, size, "%s %s Descriptor(Index = %d, Length = %d)", - b == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set", - ({ char *s; - switch (v >> 8) { - case USB_DT_DEVICE: - s = "Device"; - break; - case USB_DT_CONFIG: - s = "Configuration"; - break; - case USB_DT_STRING: - s = "String"; - break; - case USB_DT_INTERFACE: - s = "Interface"; - break; - case USB_DT_ENDPOINT: - s = "Endpoint"; - break; - case USB_DT_DEVICE_QUALIFIER: - s = "Device Qualifier"; - break; - case USB_DT_OTHER_SPEED_CONFIG: - s = "Other Speed Config"; - break; - case USB_DT_INTERFACE_POWER: - s = "Interface Power"; - break; - case USB_DT_OTG: - s = "OTG"; - break; - case USB_DT_DEBUG: - s = "Debug"; - break; - case USB_DT_INTERFACE_ASSOCIATION: - s = "Interface Association"; - break; - case USB_DT_BOS: - s = "BOS"; - break; - case USB_DT_DEVICE_CAPABILITY: - s = "Device Capability"; - break; - case USB_DT_PIPE_USAGE: - s = "Pipe Usage"; - break; - case USB_DT_SS_ENDPOINT_COMP: - s = "SS Endpoint Companion"; - break; - case USB_DT_SSP_ISOC_ENDPOINT_COMP: - s = "SSP Isochronous Endpoint Companion"; - break; - default: - s = "UNKNOWN"; - break; - } s; }), v & 0xff, l); -} - - -static inline void dwc3_decode_get_configuration(__u16 l, char *str, - size_t size) -{ - snprintf(str, size, "Get Configuration(Length = %d)", l); -} - -static inline void dwc3_decode_set_configuration(__u8 v, char *str, size_t size) -{ - snprintf(str, size, "Set Configuration(Config = %d)", v); -} - -static inline void dwc3_decode_get_intf(__u16 i, __u16 l, char *str, - size_t size) -{ - snprintf(str, size, "Get Interface(Intf = %d, Length = %d)", i, l); -} - -static inline void dwc3_decode_set_intf(__u8 v, __u16 i, char *str, size_t size) -{ - snprintf(str, size, "Set Interface(Intf = %d, Alt.Setting = %d)", i, v); -} - -static inline void dwc3_decode_synch_frame(__u16 i, __u16 l, char *str, - size_t size) -{ - snprintf(str, size, "Synch Frame(Endpoint = %d, Length = %d)", i, l); -} - -static inline void dwc3_decode_set_sel(__u16 l, char *str, size_t size) -{ - snprintf(str, size, "Set SEL(Length = %d)", l); -} - -static inline void dwc3_decode_set_isoch_delay(__u8 v, char *str, size_t size) -{ - snprintf(str, size, "Set Isochronous Delay(Delay = %d ns)", v); -} - -/** - * dwc3_decode_ctrl - returns a string represetion of ctrl request - */ -static inline const char *dwc3_decode_ctrl(char *str, size_t size, - __u8 bRequestType, __u8 bRequest, __u16 wValue, __u16 wIndex, - __u16 wLength) -{ - switch (bRequest) { - case USB_REQ_GET_STATUS: - dwc3_decode_get_status(bRequestType, wIndex, wLength, str, - size); - break; - case USB_REQ_CLEAR_FEATURE: - case USB_REQ_SET_FEATURE: - dwc3_decode_set_clear_feature(bRequestType, bRequest, wValue, - wIndex, str, size); - break; - case USB_REQ_SET_ADDRESS: - dwc3_decode_set_address(wValue, str, size); - break; - case USB_REQ_GET_DESCRIPTOR: - case USB_REQ_SET_DESCRIPTOR: - dwc3_decode_get_set_descriptor(bRequestType, bRequest, wValue, - wIndex, wLength, str, size); - break; - case USB_REQ_GET_CONFIGURATION: - dwc3_decode_get_configuration(wLength, str, size); - break; - case USB_REQ_SET_CONFIGURATION: - dwc3_decode_set_configuration(wValue, str, size); - break; - case USB_REQ_GET_INTERFACE: - dwc3_decode_get_intf(wIndex, wLength, str, size); - break; - case USB_REQ_SET_INTERFACE: - dwc3_decode_set_intf(wValue, wIndex, str, size); - break; - case USB_REQ_SYNCH_FRAME: - dwc3_decode_synch_frame(wIndex, wLength, str, size); - break; - case USB_REQ_SET_SEL: - dwc3_decode_set_sel(wLength, str, size); - break; - case USB_REQ_SET_ISOCH_DELAY: - dwc3_decode_set_isoch_delay(wValue, str, size); - break; - default: - snprintf(str, size, "%02x %02x %02x %02x %02x %02x %02x %02x", - bRequestType, bRequest, - cpu_to_le16(wValue) & 0xff, - cpu_to_le16(wValue) >> 8, - cpu_to_le16(wIndex) & 0xff, - cpu_to_le16(wIndex) >> 8, - cpu_to_le16(wLength) & 0xff, - cpu_to_le16(wLength) >> 8); - } - - return str; -} - /** * dwc3_ep_event_string - returns event name * @event: then event code diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h index 5d479c508cb5..32196b9bc45b 100644 --- a/drivers/usb/dwc3/trace.h +++ b/drivers/usb/dwc3/trace.h @@ -86,7 +86,7 @@ DECLARE_EVENT_CLASS(dwc3_log_ctrl, __entry->wIndex = le16_to_cpu(ctrl->wIndex); __entry->wLength = le16_to_cpu(ctrl->wLength); ), - TP_printk("%s", dwc3_decode_ctrl(__get_str(str), DWC3_MSG_MAX, + TP_printk("%s", usb_decode_ctrl(__get_str(str), DWC3_MSG_MAX, __entry->bRequestType, __entry->bRequest, __entry->wValue, __entry->wIndex, __entry->wLength) diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index 523aa088f6ab..db21b11bec6e 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h @@ -62,4 +62,29 @@ extern enum usb_device_speed usb_get_maximum_speed(struct device *dev); */ extern const char *usb_state_string(enum usb_device_state state); +/** + * usb_decode_ctrl - Returns human readable representation of control request. + * @str: buffer to return a human-readable representation of control request. + * This buffer should have about 200 bytes. + * @size: size of str buffer. + * @bRequestType: matches the USB bmRequestType field + * @bRequest: matches the USB bRequest field + * @wValue: matches the USB wValue field (CPU byte order) + * @wIndex: matches the USB wIndex field (CPU byte order) + * @wLength: matches the USB wLength field (CPU byte order) + * + * Function returns decoded, formatted and human-readable description of + * control request packet. + * + * The usage scenario for this is for tracepoints, so function as a return + * use the same value as in parameters. This approach allows to use this + * function in TP_printk + * + * Important: wValue, wIndex, wLength parameters before invoking this function + * should be processed by le16_to_cpu macro. + */ +const char *usb_decode_ctrl(char *str, size_t size, __u8 bRequestType, + __u8 bRequest, __u16 wValue, __u16 wIndex, + __u16 wLength); + #endif /* __LINUX_USB_CH9_H */ -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v4,2/6] usb:common Separated decoding functions from dwc3 driver. From: Pawel Laszczak Message-Id: <1550173514-23573-3-git-send-email-pawell@cadence.com> Date: Thu, 14 Feb 2019 19:45:10 +0000 To: devicetree@vger.kernel.org Cc: gregkh@linuxfoundation.org, felipe.balbi@linux.intel.com, mark.rutland@arm.com, linux-usb@vger.kernel.org, hdegoede@redhat.com, heikki.krogerus@linux.intel.com, andy.shevchenko@gmail.com, robh+dt@kernel.org, rogerq@ti.com, linux-kernel@vger.kernel.org, jbergsagel@ti.com, nsekhar@ti.com, nm@ti.com, sureshp@cadence.com, peter.chen@nxp.com, kurahul@cadence.com, Pawel Laszczak List-ID: UGF0Y2ggbW92ZXMgc29tZSBkZWNvZGluZyBmdW5jdGlvbnMgZnJvbSBkcml2ZXIvdXNiL2R3YzMv ZGVidWcuaCBkcml2ZXIKdG8gZHJpdmVyL3VzYi9jb21tb24vZGVidWcuYyBmaWxlLiBUaGVzZSBt b3ZlZCBmdW5jdGlvbnMgaW5jbHVkZToKICAgIGR3YzNfZGVjb2RlX2dldF9zdGF0dXMKICAgIGR3 YzNfZGVjb2RlX3NldF9jbGVhcl9mZWF0dXJlCiAgICBkd2MzX2RlY29kZV9zZXRfYWRkcmVzcwog ICAgZHdjM19kZWNvZGVfZ2V0X3NldF9kZXNjcmlwdG9yCiAgICBkd2MzX2RlY29kZV9nZXRfY29u ZmlndXJhdGlvbgogICAgZHdjM19kZWNvZGVfc2V0X2NvbmZpZ3VyYXRpb24KICAgIGR3YzNfZGVj b2RlX2dldF9pbnRmCiAgICBkd2MzX2RlY29kZV9zZXRfaW50ZgogICAgZHdjM19kZWNvZGVfc3lu Y2hfZnJhbWUKICAgIGR3YzNfZGVjb2RlX3NldF9zZWwKICAgIGR3YzNfZGVjb2RlX3NldF9pc29j aF9kZWxheQogICAgZHdjM19kZWNvZGVfY3RybAoKVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGFs c28gaW4gaW5yb2R1Y2VkIGNkbnMzIGRyaXZlci4KCkFsbCBmdW5jdGlvbnMgcHJlZml4ZXMgd2Vy ZSBjaGFuZ2VkIGZyb20gZHdjMyB0byB1c2IuCkFsc28sIGZ1bmN0aW9uJ3MgcGFyYW1ldGVycyBo YXMgYmVlbiBleHRlbmRlZCBhY2NvcmRpbmcgdG8gdGhlIG5hbWUKb2YgZmllbGRzIGluIHN0YW5k YXJkIFNFVFVQIHBhY2tldC4KQWRkaXRpb25hbGx5LCBwYXRjaCBhZGRzIHVzYl9kZWNvZGVfY3Ry bCBmdW5jdGlvbiB0bwppbmNsdWRlL2xpbnV4L3VzYi9jaDkuaCBmaWxlLgoKU2lnbmVkLW9mZi1i eTogUGF3ZWwgTGFzemN6YWsgPHBhd2VsbEBjYWRlbmNlLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi9j b21tb24vTWFrZWZpbGUgfCAgIDIgKy0KIGRyaXZlcnMvdXNiL2NvbW1vbi9kZWJ1Zy5jICB8IDI3 MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2R3YzMv ZGVidWcuaCAgICB8IDI0OSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZl cnMvdXNiL2R3YzMvdHJhY2UuaCAgICB8ICAgMiArLQogaW5jbHVkZS9saW51eC91c2IvY2g5Lmgg ICAgIHwgIDI1ICsrKysKIDUgZmlsZXMgY2hhbmdlZCwgMjk3IGluc2VydGlvbnMoKyksIDI1MSBk ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9jb21tb24vZGVidWcu YwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvbW1vbi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNi L2NvbW1vbi9NYWtlZmlsZQppbmRleCBmYjRkNWVmNDE2NWMuLjNkM2QyOTYyZWE0YiAxMDA2NDQK LS0tIGEvZHJpdmVycy91c2IvY29tbW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2NvbW1v bi9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKICMKIAogb2JqLSQoQ09ORklHX1VTQl9DT01NT04p CSAgKz0gdXNiLWNvbW1vbi5vCi11c2ItY29tbW9uLXkJCQkgICs9IGNvbW1vbi5vCit1c2ItY29t bW9uLXkJCQkgICs9IGNvbW1vbi5vIGRlYnVnLm8KIHVzYi1jb21tb24tJChDT05GSUdfVVNCX0xF RF9UUklHKSArPSBsZWQubwogCiBvYmotJChDT05GSUdfVVNCX09UR19GU00pICs9IHVzYi1vdGct ZnNtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvbW1vbi9kZWJ1Zy5jIGIvZHJpdmVycy91 c2IvY29tbW9uL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw Li4zZmRmMTE2ZGE5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9jb21tb24vZGVi dWcuYwpAQCAtMCwwICsxLDI3MCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0y LjAKKy8qKgorICogQ29tbW9uIFVTQiBkZWJ1Z2dpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJp Z2h0IChDKSAyMDEwLTIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDov L3d3dy50aS5jb20KKyAqCisgKiBBdXRob3JzOiBGZWxpcGUgQmFsYmkgPGJhbGJpQHRpLmNvbT4s CisgKgkgICAgU2ViYXN0aWFuIEFuZHJ6ZWogU2lld2lvciA8YmlnZWFzeUBsaW51dHJvbml4LmRl PgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfQ09NTU9OX0RFQlVHCisjZGVmaW5lIF9fTElO VVhfVVNCX0NPTU1PTl9ERUJVRworCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorCitzdGF0 aWMgdm9pZCB1c2JfZGVjb2RlX2dldF9zdGF0dXMoX191OCBiUmVxdWVzdFR5cGUsIF9fdTE2IHdJ bmRleCwKKwkJCQkgIF9fdTE2IHdMZW5ndGgsIGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpCit7CisJ c3dpdGNoIChiUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgeworCWNhc2UgVVNCX1JFQ0lQ X0lOVEVSRkFDRToKKwkJc25wcmludGYoc3RyLCBzaXplLAorCQkJICJHZXQgSW50ZXJmYWNlIFN0 YXR1cyhJbnRmID0gJWQsIExlbmd0aCA9ICVkKSIsCisJCQkgd0luZGV4LCB3TGVuZ3RoKTsKKwkJ YnJlYWs7CisJY2FzZSBVU0JfUkVDSVBfRU5EUE9JTlQ6CisJCXNucHJpbnRmKHN0ciwgc2l6ZSwg IkdldCBFbmRwb2ludCBTdGF0dXMoZXAlZCVzKSIsCisJCQkgd0luZGV4ICYgflVTQl9ESVJfSU4s CisJCQkgd0luZGV4ICYgVVNCX0RJUl9JTiA/ICJpbiIgOiAib3V0Iik7CisJCWJyZWFrOworCX0K K30KKworc3RhdGljIHZvaWQgdXNiX2RlY29kZV9zZXRfY2xlYXJfZmVhdHVyZShfX3U4IGJSZXF1 ZXN0VHlwZSwgX191OCBiUmVxdWVzdCwKKwkJCQkJIF9fdTE2IHdWYWx1ZSwgX191MTYgd0luZGV4 LAorCQkJCQkgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzd2l0Y2ggKGJSZXF1ZXN0VHlw ZSAmIFVTQl9SRUNJUF9NQVNLKSB7CisJY2FzZSBVU0JfUkVDSVBfREVWSUNFOgorCQlzbnByaW50 ZihzdHIsIHNpemUsICIlcyBEZXZpY2UgRmVhdHVyZSglcyVzKSIsCisJCQkgYlJlcXVlc3QgPT0g VVNCX1JFUV9DTEVBUl9GRUFUVVJFID8gIkNsZWFyIiA6ICJTZXQiLAorCQkJICh7Y2hhciAqczsK KwkJCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQkJCWNhc2UgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQ6 CisJCQkJCXMgPSAiU2VsZiBQb3dlcmVkIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBVU0JfREVW SUNFX1JFTU9URV9XQUtFVVA6CisJCQkJCXMgPSAiUmVtb3RlIFdha2V1cCI7CisJCQkJCWJyZWFr OworCQkJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6CisJCQkJCXMgPSAiVGVzdCBNb2RlIjsK KwkJCQkJYnJlYWs7CisJCQkJY2FzZSBVU0JfREVWSUNFX1UxX0VOQUJMRToKKwkJCQkJcyA9ICJV MSBFbmFibGUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIFVTQl9ERVZJQ0VfVTJfRU5BQkxFOgor CQkJCQlzID0gIlUyIEVuYWJsZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgVVNCX0RFVklDRV9M VE1fRU5BQkxFOgorCQkJCQlzID0gIkxUTSBFbmFibGUiOworCQkJCQlicmVhazsKKwkJCQlkZWZh dWx0OgorCQkJCQlzID0gIlVOS05PV04iOworCQkJCX0gczsgfSksCisJCQkgd1ZhbHVlID09IFVT Ql9ERVZJQ0VfVEVTVF9NT0RFID8KKwkJCSAoeyBjaGFyICpzOworCQkJCXN3aXRjaCAod0luZGV4 KSB7CisJCQkJY2FzZSBURVNUX0o6CisJCQkJCXMgPSAiOiBURVNUX0oiOworCQkJCQlicmVhazsK KwkJCQljYXNlIFRFU1RfSzoKKwkJCQkJcyA9ICI6IFRFU1RfSyI7CisJCQkJCWJyZWFrOworCQkJ CWNhc2UgVEVTVF9TRTBfTkFLOgorCQkJCQlzID0gIjogVEVTVF9TRTBfTkFLIjsKKwkJCQkJYnJl YWs7CisJCQkJY2FzZSBURVNUX1BBQ0tFVDoKKwkJCQkJcyA9ICI6IFRFU1RfUEFDS0VUIjsKKwkJ CQkJYnJlYWs7CisJCQkJY2FzZSBURVNUX0ZPUkNFX0VOOgorCQkJCQlzID0gIjogVEVTVF9GT1JD RV9FTiI7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXMgPSAiOiBVTktOT1dOIjsK KwkJCQl9IHM7IH0pIDogIiIpOworCQlicmVhazsKKwljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6 CisJCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVzIEludGVyZmFjZSBGZWF0dXJlKCVzKSIsCisJCQkg YlJlcXVlc3QgPT0gVVNCX1JFUV9DTEVBUl9GRUFUVVJFID8gIkNsZWFyIiA6ICJTZXQiLAorCQkJ IHdWYWx1ZSA9PSBVU0JfSU5UUkZfRlVOQ19TVVNQRU5EID8KKwkJCSAiRnVuY3Rpb24gU3VzcGVu ZCIgOiAiVU5LTk9XTiIpOworCQlicmVhazsKKwljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJ c25wcmludGYoc3RyLCBzaXplLCAiJXMgRW5kcG9pbnQgRmVhdHVyZSglcyBlcCVkJXMpIiwKKwkJ CSBiUmVxdWVzdCA9PSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkUgPyAiQ2xlYXIiIDogIlNldCIsCisJ CQkgd1ZhbHVlID09IFVTQl9FTkRQT0lOVF9IQUxUID8gIkhhbHQiIDogIlVOS05PV04iLAorCQkJ IHdJbmRleCAmIH5VU0JfRElSX0lOLAorCQkJIHdJbmRleCAmIFVTQl9ESVJfSU4gPyAiaW4iIDog Im91dCIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9kZWNvZGVfc2V0X2Fk ZHJlc3MoX191MTYgd1ZhbHVlLCBjaGFyICpzdHIsIHNpemVfdCBzaXplKQoreworCXNucHJpbnRm KHN0ciwgc2l6ZSwgIlNldCBBZGRyZXNzKEFkZHIgPSAlMDJ4KSIsIHdWYWx1ZSk7Cit9CisKK3N0 YXRpYyB2b2lkIHVzYl9kZWNvZGVfZ2V0X3NldF9kZXNjcmlwdG9yKF9fdTggYlJlcXVlc3RUeXBl LCBfX3U4IGJSZXF1ZXN0LAorCQkJCQkgIF9fdTE2IHdWYWx1ZSwgX191MTYgd0luZGV4LAorCQkJ CQkgIF9fdTE2IHdMZW5ndGgsIGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpCit7CisJc25wcmludGYo c3RyLCBzaXplLCAiJXMgJXMgRGVzY3JpcHRvcihJbmRleCA9ICVkLCBMZW5ndGggPSAlZCkiLAor CQkgYlJlcXVlc3QgPT0gVVNCX1JFUV9HRVRfREVTQ1JJUFRPUiA/ICJHZXQiIDogIlNldCIsCisJ CSAoeyBjaGFyICpzOworCQkJc3dpdGNoICh3VmFsdWUgPj4gOCkgeworCQkJY2FzZSBVU0JfRFRf REVWSUNFOgorCQkJCXMgPSAiRGV2aWNlIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RUX0NP TkZJRzoKKwkJCQlzID0gIkNvbmZpZ3VyYXRpb24iOworCQkJCWJyZWFrOworCQkJY2FzZSBVU0Jf RFRfU1RSSU5HOgorCQkJCXMgPSAiU3RyaW5nIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RU X0lOVEVSRkFDRToKKwkJCQlzID0gIkludGVyZmFjZSI7CisJCQkJYnJlYWs7CisJCQljYXNlIFVT Ql9EVF9FTkRQT0lOVDoKKwkJCQlzID0gIkVuZHBvaW50IjsKKwkJCQlicmVhazsKKwkJCWNhc2Ug VVNCX0RUX0RFVklDRV9RVUFMSUZJRVI6CisJCQkJcyA9ICJEZXZpY2UgUXVhbGlmaWVyIjsKKwkJ CQlicmVhazsKKwkJCWNhc2UgVVNCX0RUX09USEVSX1NQRUVEX0NPTkZJRzoKKwkJCQlzID0gIk90 aGVyIFNwZWVkIENvbmZpZyI7CisJCQkJYnJlYWs7CisJCQljYXNlIFVTQl9EVF9JTlRFUkZBQ0Vf UE9XRVI6CisJCQkJcyA9ICJJbnRlcmZhY2UgUG93ZXIiOworCQkJCWJyZWFrOworCQkJY2FzZSBV U0JfRFRfT1RHOgorCQkJCXMgPSAiT1RHIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RUX0RF QlVHOgorCQkJCXMgPSAiRGVidWciOworCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfRFRfSU5URVJG QUNFX0FTU09DSUFUSU9OOgorCQkJCXMgPSAiSW50ZXJmYWNlIEFzc29jaWF0aW9uIjsKKwkJCQli cmVhazsKKwkJCWNhc2UgVVNCX0RUX0JPUzoKKwkJCQlzID0gIkJPUyI7CisJCQkJYnJlYWs7CisJ CQljYXNlIFVTQl9EVF9ERVZJQ0VfQ0FQQUJJTElUWToKKwkJCQlzID0gIkRldmljZSBDYXBhYmls aXR5IjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RUX1BJUEVfVVNBR0U6CisJCQkJcyA9ICJQ aXBlIFVzYWdlIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgVVNCX0RUX1NTX0VORFBPSU5UX0NPTVA6 CisJCQkJcyA9ICJTUyBFbmRwb2ludCBDb21wYW5pb24iOworCQkJCWJyZWFrOworCQkJY2FzZSBV U0JfRFRfU1NQX0lTT0NfRU5EUE9JTlRfQ09NUDoKKwkJCQlzID0gIlNTUCBJc29jaHJvbm91cyBF bmRwb2ludCBDb21wYW5pb24iOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzID0gIlVO S05PV04iOworCQkJCWJyZWFrOworCQkJfSBzOyB9KSwgd1ZhbHVlICYgMHhmZiwgd0xlbmd0aCk7 Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9kZWNvZGVfZ2V0X2NvbmZpZ3VyYXRpb24oX191MTYgd0xl bmd0aCwgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzbnByaW50ZihzdHIsIHNpemUsICJH ZXQgQ29uZmlndXJhdGlvbihMZW5ndGggPSAlZCkiLCB3TGVuZ3RoKTsKK30KKworc3RhdGljIHZv aWQgdXNiX2RlY29kZV9zZXRfY29uZmlndXJhdGlvbihfX3U4IHdWYWx1ZSwgY2hhciAqc3RyLCBz aXplX3Qgc2l6ZSkKK3sKKwlzbnByaW50ZihzdHIsIHNpemUsICJTZXQgQ29uZmlndXJhdGlvbihD b25maWcgPSAlZCkiLCB3VmFsdWUpOworfQorCitzdGF0aWMgdm9pZCB1c2JfZGVjb2RlX2dldF9p bnRmKF9fdTE2IHdJbmRleCwgX191MTYgd0xlbmd0aCwgY2hhciAqc3RyLAorCQkJCXNpemVfdCBz aXplKQoreworCXNucHJpbnRmKHN0ciwgc2l6ZSwgIkdldCBJbnRlcmZhY2UoSW50ZiA9ICVkLCBM ZW5ndGggPSAlZCkiLAorCQkgd0luZGV4LCB3TGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgdXNi X2RlY29kZV9zZXRfaW50ZihfX3U4IHdWYWx1ZSwgX191MTYgd0luZGV4LCBjaGFyICpzdHIsCisJ CQkJc2l6ZV90IHNpemUpCit7CisJc25wcmludGYoc3RyLCBzaXplLCAiU2V0IEludGVyZmFjZShJ bnRmID0gJWQsIEFsdC5TZXR0aW5nID0gJWQpIiwKKwkJIHdJbmRleCwgd1ZhbHVlKTsKK30KKwor c3RhdGljIHZvaWQgdXNiX2RlY29kZV9zeW5jaF9mcmFtZShfX3UxNiB3SW5kZXgsIF9fdTE2IHdM ZW5ndGgsCisJCQkJICAgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzbnByaW50ZihzdHIs IHNpemUsICJTeW5jaCBGcmFtZShFbmRwb2ludCA9ICVkLCBMZW5ndGggPSAlZCkiLAorCQkgd0lu ZGV4LCB3TGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgdXNiX2RlY29kZV9zZXRfc2VsKF9fdTE2 IHdMZW5ndGgsIGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpCit7CisJc25wcmludGYoc3RyLCBzaXpl LCAiU2V0IFNFTChMZW5ndGggPSAlZCkiLCB3TGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgdXNi X2RlY29kZV9zZXRfaXNvY2hfZGVsYXkoX191OCB3VmFsdWUsIGNoYXIgKnN0ciwgc2l6ZV90IHNp emUpCit7CisJc25wcmludGYoc3RyLCBzaXplLCAiU2V0IElzb2Nocm9ub3VzIERlbGF5KERlbGF5 ID0gJWQgbnMpIiwgd1ZhbHVlKTsKK30KKworLyoqCisgKiB1c2JfZGVjb2RlX2N0cmwgLSByZXR1 cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGN0cmwgcmVxdWVzdAorICovCitjb25zdCBj aGFyICp1c2JfZGVjb2RlX2N0cmwoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgX191OCBiUmVxdWVz dFR5cGUsCisJCQkgICAgX191OCBiUmVxdWVzdCwgX191MTYgd1ZhbHVlLCBfX3UxNiB3SW5kZXgs CisJCQkgICAgX191MTYgd0xlbmd0aCkKK3sKKwlzd2l0Y2ggKGJSZXF1ZXN0KSB7CisJY2FzZSBV U0JfUkVRX0dFVF9TVEFUVVM6CisJCXVzYl9kZWNvZGVfZ2V0X3N0YXR1cyhiUmVxdWVzdFR5cGUs IHdJbmRleCwgd0xlbmd0aCwgc3RyLCBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX0NM RUFSX0ZFQVRVUkU6CisJY2FzZSBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQl1c2JfZGVjb2RlX3Nl dF9jbGVhcl9mZWF0dXJlKGJSZXF1ZXN0VHlwZSwgYlJlcXVlc3QsIHdWYWx1ZSwKKwkJCQkJICAg ICB3SW5kZXgsIHN0ciwgc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVT UzoKKwkJdXNiX2RlY29kZV9zZXRfYWRkcmVzcyh3VmFsdWUsIHN0ciwgc2l6ZSk7CisJCWJyZWFr OworCWNhc2UgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUjoKKwljYXNlIFVTQl9SRVFfU0VUX0RFU0NS SVBUT1I6CisJCXVzYl9kZWNvZGVfZ2V0X3NldF9kZXNjcmlwdG9yKGJSZXF1ZXN0VHlwZSwgYlJl cXVlc3QsIHdWYWx1ZSwKKwkJCQkJICAgICAgd0luZGV4LCB3TGVuZ3RoLCBzdHIsIHNpemUpOwor CQlicmVhazsKKwljYXNlIFVTQl9SRVFfR0VUX0NPTkZJR1VSQVRJT046CisJCXVzYl9kZWNvZGVf Z2V0X2NvbmZpZ3VyYXRpb24od0xlbmd0aCwgc3RyLCBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBV U0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOgorCQl1c2JfZGVjb2RlX3NldF9jb25maWd1cmF0aW9u KHdWYWx1ZSwgc3RyLCBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX0dFVF9JTlRFUkZB Q0U6CisJCXVzYl9kZWNvZGVfZ2V0X2ludGYod0luZGV4LCB3TGVuZ3RoLCBzdHIsIHNpemUpOwor CQlicmVhazsKKwljYXNlIFVTQl9SRVFfU0VUX0lOVEVSRkFDRToKKwkJdXNiX2RlY29kZV9zZXRf aW50Zih3VmFsdWUsIHdJbmRleCwgc3RyLCBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVR X1NZTkNIX0ZSQU1FOgorCQl1c2JfZGVjb2RlX3N5bmNoX2ZyYW1lKHdJbmRleCwgd0xlbmd0aCwg c3RyLCBzaXplKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9TRUw6CisJCXVzYl9kZWNv ZGVfc2V0X3NlbCh3TGVuZ3RoLCBzdHIsIHNpemUpOworCQlicmVhazsKKwljYXNlIFVTQl9SRVFf U0VUX0lTT0NIX0RFTEFZOgorCQl1c2JfZGVjb2RlX3NldF9pc29jaF9kZWxheSh3VmFsdWUsIHN0 ciwgc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiUw MnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCIsCisJCQkgYlJlcXVlc3RUeXBl LCBiUmVxdWVzdCwKKwkJCSAodTgpKGNwdV90b19sZTE2KHdWYWx1ZSkgJiAweGZmKSwKKwkJCSAo dTgpKGNwdV90b19sZTE2KHdWYWx1ZSkgPj4gOCksCisJCQkgKHU4KShjcHVfdG9fbGUxNih3SW5k ZXgpICYgMHhmZiksCisJCQkgKHU4KShjcHVfdG9fbGUxNih3SW5kZXgpID4+IDgpLAorCQkJICh1 OCkoY3B1X3RvX2xlMTYod0xlbmd0aCkgJiAweGZmKSwKKwkJCSAodTgpKGNwdV90b19sZTE2KHdM ZW5ndGgpID4+IDgpKTsKKwl9CisKKwlyZXR1cm4gc3RyOworfQorRVhQT1JUX1NZTUJPTF9HUEwo dXNiX2RlY29kZV9jdHJsKTsKKworI2VuZGlmIC8qIF9fTElOVVhfVVNCX0NPTU1PTl9ERUJVRyAq LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kZWJ1Zy5oIGIvZHJpdmVycy91c2IvZHdj My9kZWJ1Zy5oCmluZGV4IDZlYzQyODBmYTQwYy4uM2NmODRjMGJhNDg2IDEwMDY0NAotLS0gYS9k cml2ZXJzL3VzYi9kd2MzL2RlYnVnLmgKKysrIGIvZHJpdmVycy91c2IvZHdjMy9kZWJ1Zy5oCkBA IC0yMTcsMjU1ICsyMTcsNiBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmR3YzNfZ2FkZ2V0 X2V2ZW50X3N0cmluZyhjaGFyICpzdHIsIHNpemVfdCBzaXplLAogCXJldHVybiBzdHI7CiB9CiAK LXN0YXRpYyBpbmxpbmUgdm9pZCBkd2MzX2RlY29kZV9nZXRfc3RhdHVzKF9fdTggdCwgX191MTYg aSwgX191MTYgbCwgY2hhciAqc3RyLAotCQlzaXplX3Qgc2l6ZSkKLXsKLQlzd2l0Y2ggKHQgJiBV U0JfUkVDSVBfTUFTSykgewotCWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKLQkJc25wcmludGYo c3RyLCBzaXplLCAiR2V0IEludGVyZmFjZSBTdGF0dXMoSW50ZiA9ICVkLCBMZW5ndGggPSAlZCki LAotCQkJCWksIGwpOwotCQlicmVhazsKLQljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKLQkJc25w cmludGYoc3RyLCBzaXplLCAiR2V0IEVuZHBvaW50IFN0YXR1cyhlcCVkJXMpIiwKLQkJCWkgJiB+ VVNCX0RJUl9JTiwKLQkJCWkgJiBVU0JfRElSX0lOID8gImluIiA6ICJvdXQiKTsKLQkJYnJlYWs7 Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHdjM19kZWNvZGVfc2V0X2NsZWFyX2ZlYXR1 cmUoX191OCB0LCBfX3U4IGIsIF9fdTE2IHYsCi0JCV9fdTE2IGksIGNoYXIgKnN0ciwgc2l6ZV90 IHNpemUpCi17Ci0Jc3dpdGNoICh0ICYgVVNCX1JFQ0lQX01BU0spIHsKLQljYXNlIFVTQl9SRUNJ UF9ERVZJQ0U6Ci0JCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVzIERldmljZSBGZWF0dXJlKCVzJXMp IiwKLQkJCWIgPT0gVVNCX1JFUV9DTEVBUl9GRUFUVVJFID8gIkNsZWFyIiA6ICJTZXQiLAotCQkJ KHtjaGFyICpzOwotCQkJCXN3aXRjaCAodikgewotCQkJCWNhc2UgVVNCX0RFVklDRV9TRUxGX1BP V0VSRUQ6Ci0JCQkJCXMgPSAiU2VsZiBQb3dlcmVkIjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBV U0JfREVWSUNFX1JFTU9URV9XQUtFVVA6Ci0JCQkJCXMgPSAiUmVtb3RlIFdha2V1cCI7Ci0JCQkJ CWJyZWFrOwotCQkJCWNhc2UgVVNCX0RFVklDRV9URVNUX01PREU6Ci0JCQkJCXMgPSAiVGVzdCBN b2RlIjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVU0JfREVWSUNFX1UxX0VOQUJMRToKLQkJCQkJ cyA9ICJVMSBFbmFibGUiOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFVTQl9ERVZJQ0VfVTJfRU5B QkxFOgotCQkJCQlzID0gIlUyIEVuYWJsZSI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVVNCX0RF VklDRV9MVE1fRU5BQkxFOgotCQkJCQlzID0gIkxUTSBFbmFibGUiOwotCQkJCQlicmVhazsKLQkJ CQlkZWZhdWx0OgotCQkJCQlzID0gIlVOS05PV04iOwotCQkJCX0gczsgfSksCi0JCQl2ID09IFVT Ql9ERVZJQ0VfVEVTVF9NT0RFID8KLQkJCSh7IGNoYXIgKnM7Ci0JCQkJc3dpdGNoIChpKSB7Ci0J CQkJY2FzZSBURVNUX0o6Ci0JCQkJCXMgPSAiOiBURVNUX0oiOwotCQkJCQlicmVhazsKLQkJCQlj YXNlIFRFU1RfSzoKLQkJCQkJcyA9ICI6IFRFU1RfSyI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Ug VEVTVF9TRTBfTkFLOgotCQkJCQlzID0gIjogVEVTVF9TRTBfTkFLIjsKLQkJCQkJYnJlYWs7Ci0J CQkJY2FzZSBURVNUX1BBQ0tFVDoKLQkJCQkJcyA9ICI6IFRFU1RfUEFDS0VUIjsKLQkJCQkJYnJl YWs7Ci0JCQkJY2FzZSBURVNUX0ZPUkNFX0VOOgotCQkJCQlzID0gIjogVEVTVF9GT1JDRV9FTiI7 Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXMgPSAiOiBVTktOT1dOIjsKLQkJCQl9 IHM7IH0pIDogIiIpOwotCQlicmVhazsKLQljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6Ci0JCXNu cHJpbnRmKHN0ciwgc2l6ZSwgIiVzIEludGVyZmFjZSBGZWF0dXJlKCVzKSIsCi0JCQliID09IFVT Ql9SRVFfQ0xFQVJfRkVBVFVSRSA/ICJDbGVhciIgOiAiU2V0IiwKLQkJCXYgPT0gVVNCX0lOVFJG X0ZVTkNfU1VTUEVORCA/Ci0JCQkiRnVuY3Rpb24gU3VzcGVuZCIgOiAiVU5LTk9XTiIpOwotCQli cmVhazsKLQljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKLQkJc25wcmludGYoc3RyLCBzaXplLCAi JXMgRW5kcG9pbnQgRmVhdHVyZSglcyBlcCVkJXMpIiwKLQkJCWIgPT0gVVNCX1JFUV9DTEVBUl9G RUFUVVJFID8gIkNsZWFyIiA6ICJTZXQiLAotCQkJdiA9PSBVU0JfRU5EUE9JTlRfSEFMVCA/ICJI YWx0IiA6ICJVTktOT1dOIiwKLQkJCWkgJiB+VVNCX0RJUl9JTiwKLQkJCWkgJiBVU0JfRElSX0lO ID8gImluIiA6ICJvdXQiKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQg ZHdjM19kZWNvZGVfc2V0X2FkZHJlc3MoX191MTYgdiwgY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSkK LXsKLQlzbnByaW50ZihzdHIsIHNpemUsICJTZXQgQWRkcmVzcyhBZGRyID0gJTAyeCkiLCB2KTsK LX0KLQotc3RhdGljIGlubGluZSB2b2lkIGR3YzNfZGVjb2RlX2dldF9zZXRfZGVzY3JpcHRvcihf X3U4IHQsIF9fdTggYiwgX191MTYgdiwKLQkJX191MTYgaSwgX191MTYgbCwgY2hhciAqc3RyLCBz aXplX3Qgc2l6ZSkKLXsKLQlzbnByaW50ZihzdHIsIHNpemUsICIlcyAlcyBEZXNjcmlwdG9yKElu ZGV4ID0gJWQsIExlbmd0aCA9ICVkKSIsCi0JCWIgPT0gVVNCX1JFUV9HRVRfREVTQ1JJUFRPUiA/ ICJHZXQiIDogIlNldCIsCi0JCSh7IGNoYXIgKnM7Ci0JCQlzd2l0Y2ggKHYgPj4gOCkgewotCQkJ Y2FzZSBVU0JfRFRfREVWSUNFOgotCQkJCXMgPSAiRGV2aWNlIjsKLQkJCQlicmVhazsKLQkJCWNh c2UgVVNCX0RUX0NPTkZJRzoKLQkJCQlzID0gIkNvbmZpZ3VyYXRpb24iOwotCQkJCWJyZWFrOwot CQkJY2FzZSBVU0JfRFRfU1RSSU5HOgotCQkJCXMgPSAiU3RyaW5nIjsKLQkJCQlicmVhazsKLQkJ CWNhc2UgVVNCX0RUX0lOVEVSRkFDRToKLQkJCQlzID0gIkludGVyZmFjZSI7Ci0JCQkJYnJlYWs7 Ci0JCQljYXNlIFVTQl9EVF9FTkRQT0lOVDoKLQkJCQlzID0gIkVuZHBvaW50IjsKLQkJCQlicmVh azsKLQkJCWNhc2UgVVNCX0RUX0RFVklDRV9RVUFMSUZJRVI6Ci0JCQkJcyA9ICJEZXZpY2UgUXVh bGlmaWVyIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0RUX09USEVSX1NQRUVEX0NPTkZJRzoK LQkJCQlzID0gIk90aGVyIFNwZWVkIENvbmZpZyI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVTQl9E VF9JTlRFUkZBQ0VfUE9XRVI6Ci0JCQkJcyA9ICJJbnRlcmZhY2UgUG93ZXIiOwotCQkJCWJyZWFr OwotCQkJY2FzZSBVU0JfRFRfT1RHOgotCQkJCXMgPSAiT1RHIjsKLQkJCQlicmVhazsKLQkJCWNh c2UgVVNCX0RUX0RFQlVHOgotCQkJCXMgPSAiRGVidWciOwotCQkJCWJyZWFrOwotCQkJY2FzZSBV U0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OOgotCQkJCXMgPSAiSW50ZXJmYWNlIEFzc29jaWF0 aW9uIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0RUX0JPUzoKLQkJCQlzID0gIkJPUyI7Ci0J CQkJYnJlYWs7Ci0JCQljYXNlIFVTQl9EVF9ERVZJQ0VfQ0FQQUJJTElUWToKLQkJCQlzID0gIkRl dmljZSBDYXBhYmlsaXR5IjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0RUX1BJUEVfVVNBR0U6 Ci0JCQkJcyA9ICJQaXBlIFVzYWdlIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgVVNCX0RUX1NTX0VO RFBPSU5UX0NPTVA6Ci0JCQkJcyA9ICJTUyBFbmRwb2ludCBDb21wYW5pb24iOwotCQkJCWJyZWFr OwotCQkJY2FzZSBVU0JfRFRfU1NQX0lTT0NfRU5EUE9JTlRfQ09NUDoKLQkJCQlzID0gIlNTUCBJ c29jaHJvbm91cyBFbmRwb2ludCBDb21wYW5pb24iOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoK LQkJCQlzID0gIlVOS05PV04iOwotCQkJCWJyZWFrOwotCQkJfSBzOyB9KSwgdiAmIDB4ZmYsIGwp OwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkd2MzX2RlY29kZV9nZXRfY29uZmlndXJhdGlv bihfX3UxNiBsLCBjaGFyICpzdHIsCi0JCXNpemVfdCBzaXplKQotewotCXNucHJpbnRmKHN0ciwg c2l6ZSwgIkdldCBDb25maWd1cmF0aW9uKExlbmd0aCA9ICVkKSIsIGwpOwotfQotCi1zdGF0aWMg aW5saW5lIHZvaWQgZHdjM19kZWNvZGVfc2V0X2NvbmZpZ3VyYXRpb24oX191OCB2LCBjaGFyICpz dHIsIHNpemVfdCBzaXplKQotewotCXNucHJpbnRmKHN0ciwgc2l6ZSwgIlNldCBDb25maWd1cmF0 aW9uKENvbmZpZyA9ICVkKSIsIHYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHdjM19kZWNv ZGVfZ2V0X2ludGYoX191MTYgaSwgX191MTYgbCwgY2hhciAqc3RyLAotCQlzaXplX3Qgc2l6ZSkK LXsKLQlzbnByaW50ZihzdHIsIHNpemUsICJHZXQgSW50ZXJmYWNlKEludGYgPSAlZCwgTGVuZ3Ro ID0gJWQpIiwgaSwgbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkd2MzX2RlY29kZV9zZXRf aW50ZihfX3U4IHYsIF9fdTE2IGksIGNoYXIgKnN0ciwgc2l6ZV90IHNpemUpCi17Ci0Jc25wcmlu dGYoc3RyLCBzaXplLCAiU2V0IEludGVyZmFjZShJbnRmID0gJWQsIEFsdC5TZXR0aW5nID0gJWQp IiwgaSwgdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkd2MzX2RlY29kZV9zeW5jaF9mcmFt ZShfX3UxNiBpLCBfX3UxNiBsLCBjaGFyICpzdHIsCi0JCXNpemVfdCBzaXplKQotewotCXNucHJp bnRmKHN0ciwgc2l6ZSwgIlN5bmNoIEZyYW1lKEVuZHBvaW50ID0gJWQsIExlbmd0aCA9ICVkKSIs IGksIGwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHdjM19kZWNvZGVfc2V0X3NlbChfX3Ux NiBsLCBjaGFyICpzdHIsIHNpemVfdCBzaXplKQotewotCXNucHJpbnRmKHN0ciwgc2l6ZSwgIlNl dCBTRUwoTGVuZ3RoID0gJWQpIiwgbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkd2MzX2Rl Y29kZV9zZXRfaXNvY2hfZGVsYXkoX191OCB2LCBjaGFyICpzdHIsIHNpemVfdCBzaXplKQotewot CXNucHJpbnRmKHN0ciwgc2l6ZSwgIlNldCBJc29jaHJvbm91cyBEZWxheShEZWxheSA9ICVkIG5z KSIsIHYpOwotfQotCi0vKioKLSAqIGR3YzNfZGVjb2RlX2N0cmwgLSByZXR1cm5zIGEgc3RyaW5n IHJlcHJlc2V0aW9uIG9mIGN0cmwgcmVxdWVzdAotICovCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNo YXIgKmR3YzNfZGVjb2RlX2N0cmwoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwKLQkJX191OCBiUmVx dWVzdFR5cGUsIF9fdTggYlJlcXVlc3QsIF9fdTE2IHdWYWx1ZSwgX191MTYgd0luZGV4LAotCQlf X3UxNiB3TGVuZ3RoKQotewotCXN3aXRjaCAoYlJlcXVlc3QpIHsKLQljYXNlIFVTQl9SRVFfR0VU X1NUQVRVUzoKLQkJZHdjM19kZWNvZGVfZ2V0X3N0YXR1cyhiUmVxdWVzdFR5cGUsIHdJbmRleCwg d0xlbmd0aCwgc3RyLAotCQkJCXNpemUpOwotCQlicmVhazsKLQljYXNlIFVTQl9SRVFfQ0xFQVJf RkVBVFVSRToKLQljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6Ci0JCWR3YzNfZGVjb2RlX3NldF9j bGVhcl9mZWF0dXJlKGJSZXF1ZXN0VHlwZSwgYlJlcXVlc3QsIHdWYWx1ZSwKLQkJCQl3SW5kZXgs IHN0ciwgc2l6ZSk7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKLQkJZHdj M19kZWNvZGVfc2V0X2FkZHJlc3Mod1ZhbHVlLCBzdHIsIHNpemUpOwotCQlicmVhazsKLQljYXNl IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I6Ci0JY2FzZSBVU0JfUkVRX1NFVF9ERVNDUklQVE9SOgot CQlkd2MzX2RlY29kZV9nZXRfc2V0X2Rlc2NyaXB0b3IoYlJlcXVlc3RUeXBlLCBiUmVxdWVzdCwg d1ZhbHVlLAotCQkJCXdJbmRleCwgd0xlbmd0aCwgc3RyLCBzaXplKTsKLQkJYnJlYWs7Ci0JY2Fz ZSBVU0JfUkVRX0dFVF9DT05GSUdVUkFUSU9OOgotCQlkd2MzX2RlY29kZV9nZXRfY29uZmlndXJh dGlvbih3TGVuZ3RoLCBzdHIsIHNpemUpOwotCQlicmVhazsKLQljYXNlIFVTQl9SRVFfU0VUX0NP TkZJR1VSQVRJT046Ci0JCWR3YzNfZGVjb2RlX3NldF9jb25maWd1cmF0aW9uKHdWYWx1ZSwgc3Ry LCBzaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfUkVRX0dFVF9JTlRFUkZBQ0U6Ci0JCWR3YzNf ZGVjb2RlX2dldF9pbnRmKHdJbmRleCwgd0xlbmd0aCwgc3RyLCBzaXplKTsKLQkJYnJlYWs7Ci0J Y2FzZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0U6Ci0JCWR3YzNfZGVjb2RlX3NldF9pbnRmKHdWYWx1 ZSwgd0luZGV4LCBzdHIsIHNpemUpOwotCQlicmVhazsKLQljYXNlIFVTQl9SRVFfU1lOQ0hfRlJB TUU6Ci0JCWR3YzNfZGVjb2RlX3N5bmNoX2ZyYW1lKHdJbmRleCwgd0xlbmd0aCwgc3RyLCBzaXpl KTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfUkVRX1NFVF9TRUw6Ci0JCWR3YzNfZGVjb2RlX3NldF9z ZWwod0xlbmd0aCwgc3RyLCBzaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfUkVRX1NFVF9JU09D SF9ERUxBWToKLQkJZHdjM19kZWNvZGVfc2V0X2lzb2NoX2RlbGF5KHdWYWx1ZSwgc3RyLCBzaXpl KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc25wcmludGYoc3RyLCBzaXplLCAiJTAyeCAlMDJ4 ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IiwKLQkJCWJSZXF1ZXN0VHlwZSwgYlJlcXVl c3QsCi0JCQljcHVfdG9fbGUxNih3VmFsdWUpICYgMHhmZiwKLQkJCWNwdV90b19sZTE2KHdWYWx1 ZSkgPj4gOCwKLQkJCWNwdV90b19sZTE2KHdJbmRleCkgJiAweGZmLAotCQkJY3B1X3RvX2xlMTYo d0luZGV4KSA+PiA4LAotCQkJY3B1X3RvX2xlMTYod0xlbmd0aCkgJiAweGZmLAotCQkJY3B1X3Rv X2xlMTYod0xlbmd0aCkgPj4gOCk7Ci0JfQotCi0JcmV0dXJuIHN0cjsKLX0KLQogLyoqCiAgKiBk d2MzX2VwX2V2ZW50X3N0cmluZyAtIHJldHVybnMgZXZlbnQgbmFtZQogICogQGV2ZW50OiB0aGVu IGV2ZW50IGNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvdHJhY2UuaCBiL2RyaXZl cnMvdXNiL2R3YzMvdHJhY2UuaAppbmRleCA1ZDQ3OWM1MDhjYjUuLjMyMTk2YjliYzQ1YiAxMDA2 NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy90cmFjZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMv dHJhY2UuaApAQCAtODYsNyArODYsNyBAQCBERUNMQVJFX0VWRU5UX0NMQVNTKGR3YzNfbG9nX2N0 cmwsCiAJCV9fZW50cnktPndJbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CiAJCV9f ZW50cnktPndMZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAkpLAotCVRQX3By aW50aygiJXMiLCBkd2MzX2RlY29kZV9jdHJsKF9fZ2V0X3N0cihzdHIpLCBEV0MzX01TR19NQVgs CisJVFBfcHJpbnRrKCIlcyIsIHVzYl9kZWNvZGVfY3RybChfX2dldF9zdHIoc3RyKSwgRFdDM19N U0dfTUFYLAogCQkJCQlfX2VudHJ5LT5iUmVxdWVzdFR5cGUsCiAJCQkJCV9fZW50cnktPmJSZXF1 ZXN0LCBfX2VudHJ5LT53VmFsdWUsCiAJCQkJCV9fZW50cnktPndJbmRleCwgX19lbnRyeS0+d0xl bmd0aCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oIGIvaW5jbHVkZS9saW51 eC91c2IvY2g5LmgKaW5kZXggNTIzYWEwODhmNmFiLi5kYjIxYjExYmVjNmUgMTAwNjQ0Ci0tLSBh L2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NoOS5oCkBA IC02Miw0ICs2MiwyOSBAQCBleHRlcm4gZW51bSB1c2JfZGV2aWNlX3NwZWVkIHVzYl9nZXRfbWF4 aW11bV9zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogICovCiBleHRlcm4gY29uc3QgY2hhciAq dXNiX3N0YXRlX3N0cmluZyhlbnVtIHVzYl9kZXZpY2Vfc3RhdGUgc3RhdGUpOwogCisvKioKKyAq IHVzYl9kZWNvZGVfY3RybCAtIFJldHVybnMgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24g b2YgY29udHJvbCByZXF1ZXN0LgorICogQHN0cjogYnVmZmVyIHRvIHJldHVybiBhIGh1bWFuLXJl YWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGNvbnRyb2wgcmVxdWVzdC4KKyAqICAgICAgIFRoaXMg YnVmZmVyIHNob3VsZCBoYXZlIGFib3V0IDIwMCBieXRlcy4KKyAqIEBzaXplOiBzaXplIG9mIHN0 ciBidWZmZXIuCisgKiBAYlJlcXVlc3RUeXBlOiBtYXRjaGVzIHRoZSBVU0IgYm1SZXF1ZXN0VHlw ZSBmaWVsZAorICogQGJSZXF1ZXN0OiBtYXRjaGVzIHRoZSBVU0IgYlJlcXVlc3QgZmllbGQKKyAq IEB3VmFsdWU6IG1hdGNoZXMgdGhlIFVTQiB3VmFsdWUgZmllbGQgKENQVSBieXRlIG9yZGVyKQor ICogQHdJbmRleDogbWF0Y2hlcyB0aGUgVVNCIHdJbmRleCBmaWVsZCAoQ1BVIGJ5dGUgb3JkZXIp CisgKiBAd0xlbmd0aDogbWF0Y2hlcyB0aGUgVVNCIHdMZW5ndGggZmllbGQgKENQVSBieXRlIG9y ZGVyKQorICoKKyAqIEZ1bmN0aW9uIHJldHVybnMgZGVjb2RlZCwgZm9ybWF0dGVkIGFuZCBodW1h bi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZgorICogY29udHJvbCByZXF1ZXN0IHBhY2tldC4KKyAq CisgKiBUaGUgdXNhZ2Ugc2NlbmFyaW8gZm9yIHRoaXMgaXMgZm9yIHRyYWNlcG9pbnRzLCBzbyBm dW5jdGlvbiBhcyBhIHJldHVybgorICogdXNlIHRoZSBzYW1lIHZhbHVlIGFzIGluIHBhcmFtZXRl cnMuIFRoaXMgYXBwcm9hY2ggYWxsb3dzIHRvIHVzZSB0aGlzCisgKiBmdW5jdGlvbiBpbiBUUF9w cmludGsKKyAqCisgKiBJbXBvcnRhbnQ6IHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoIHBhcmFtZXRl cnMgYmVmb3JlIGludm9raW5nIHRoaXMgZnVuY3Rpb24KKyAqIHNob3VsZCBiZSBwcm9jZXNzZWQg YnkgbGUxNl90b19jcHUgbWFjcm8uCisgKi8KK2NvbnN0IGNoYXIgKnVzYl9kZWNvZGVfY3RybChj aGFyICpzdHIsIHNpemVfdCBzaXplLCBfX3U4IGJSZXF1ZXN0VHlwZSwKKwkJCSAgICBfX3U4IGJS ZXF1ZXN0LCBfX3UxNiB3VmFsdWUsIF9fdTE2IHdJbmRleCwKKwkJCSAgICBfX3UxNiB3TGVuZ3Ro KTsKKwogI2VuZGlmIC8qIF9fTElOVVhfVVNCX0NIOV9IICovCg==