Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5846169imu; Sun, 2 Dec 2018 04:53:30 -0800 (PST) X-Google-Smtp-Source: AFSGD/Wg1AVaYQMH4OmOzECNni0AKya8eofSaOtmJJBP802tm+r0w8+b7B7pUJZ34bRxw94ABTdE X-Received: by 2002:a62:a99:: with SMTP id 25mr12020076pfk.121.1543755210785; Sun, 02 Dec 2018 04:53:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543755210; cv=none; d=google.com; s=arc-20160816; b=EAHLe0GtOSvxM/NrxJ/RSN1bn83g17sXQebiU+j5imrHLZX4G6CiLSyI5NGXC8rWIj abYliUekeEj22kkS2s7/h9h3hO93ByDSmFJlrJCimeY7h+ymne+oPskHvijdLta43Muy 2IdQ6p+rLUSnHICFD9gWjVShIRtONigYfNYKwU5m4klkDfswUFVuul/8WWrb1AONGplt khxL4ENIqxa4dBuHiTdj1q3SYu4GojKFQuhN3RiO6tG6RsJuo7no4iDJNfCCb6xXAN3C CQZVkoWv6vmuXrkNkHlxe93CvBSmXSJUBxPGSVTiv+V+pocgdhP5RtSb74Rb8bzn+7iY 10nQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :spamdiagnosticmetadata:spamdiagnosticoutput:content-language :accept-language:in-reply-to:references:message-id:date:thread-index :thread-topic:subject:cc:to:from:dkim-signature:dkim-signature; bh=4FDZFsrkdT9Z68/qR6bjbWUHXuiDYs9CZSpNGGfHzLo=; b=mX9T0gZjgK1Y907hNJn8EbVDZ7SiXUMRn0eK/2nWu098OJUq9uqJjkq9j5qGS0oU9f f9yBY5rZ8P/eZufgNavKYS1Tp84KZpJdiol1RtfQM+T7Lzv/gFQGZkurY3PFImgG5XBD A++S7zATLYqIitVBQCke5jRF8H8Abld0RmAwiEgsx6GXKtkSBXCBOojbukI1626tXoSG JpX1ik03gKYsJFMaK/o3Oy5xTjQRE9mNt1xEeMdKzYj100o5/GeTuerhI/ay+G0rRF7h Cr0jhOiwtzOp+ISkajA5/XXQqIjzR1y8vRpzIyx83To6737sH+pZ/lNBQrjF2QDW/GN8 glHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cadence.com header.s=proofpoint header.b=SG4vRHFZ; dkim=pass header.i=@cadence.com header.s=selector1 header.b=cs76tsz4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cadence.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 76si11324378pfw.66.2018.12.02.04.53.14; Sun, 02 Dec 2018 04:53:30 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@cadence.com header.s=proofpoint header.b=SG4vRHFZ; dkim=pass header.i=@cadence.com header.s=selector1 header.b=cs76tsz4; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cadence.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725851AbeLBMwi (ORCPT + 99 others); Sun, 2 Dec 2018 07:52:38 -0500 Received: from mx0b-0014ca01.pphosted.com ([208.86.201.193]:53964 "EHLO mx0a-0014ca01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1725801AbeLBMwi (ORCPT ); Sun, 2 Dec 2018 07:52:38 -0500 Received: from pps.filterd (m0042333.ppops.net [127.0.0.1]) by mx0b-0014ca01.pphosted.com (8.16.0.27/8.16.0.27) with SMTP id wB2CnlJI030060; Sun, 2 Dec 2018 04:52:16 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cadence.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=proofpoint; bh=4FDZFsrkdT9Z68/qR6bjbWUHXuiDYs9CZSpNGGfHzLo=; b=SG4vRHFZxdpQUTkgpMgf3lYgvOTEsYIhie7kLT8WNQKPzgo8wnb8T71QNlznFXxKmXa2 tru1CyVMJYA8v0cqjbHuLu5TB7SRspcWevy0Jj67W2mOwVfyYBeEW9znolbBRXYljLQA 1KyPukmFboeJpJbQI9J5ATibyLrv3A/gksWtUaT8tWW/w+bh5000e/S+AL3BsA/yzjAP YvJMoQsuAhcovFfRJ13F9SxjekjjEf4eNRfHH67Y1omJI5i2CGK+Pd/5wJnZ3SiRAvpg frqgelXQDMZWc9ZqMWVkTBS6dhhEcTpzBuUtES4pwoXz2rm2kF/n4FAh/kt2B3qEdvhL sg== Authentication-Results: cadence.com; spf=pass smtp.mailfrom=pawell@cadence.com Received: from nam05-by2-obe.outbound.protection.outlook.com (mail-by2nam05lp2054.outbound.protection.outlook.com [104.47.50.54]) by mx0b-0014ca01.pphosted.com with ESMTP id 2p3ps2ds3y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 02 Dec 2018 04:52:15 -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=4FDZFsrkdT9Z68/qR6bjbWUHXuiDYs9CZSpNGGfHzLo=; b=cs76tsz44LvToHeGJ4N9jPgop1qyEfEjuh7aWo0p+rhLigC26t6AcBKLArY4bAltynHlS/LcKUeg09fAax8xofgOnvbLSgrHSsAZPRdxK5SODgmPzGIzBpAZj1Io8585hBWwpKdxH5l8+sKeVMVfd7/CXiKm3UaJSWdWabTm4Cs= Received: from BYAPR07MB4709.namprd07.prod.outlook.com (52.135.204.159) by BYAPR07MB4519.namprd07.prod.outlook.com (52.135.225.140) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1382.22; Sun, 2 Dec 2018 12:52:12 +0000 Received: from BYAPR07MB4709.namprd07.prod.outlook.com ([fe80::e0dc:ebd5:e248:d644]) by BYAPR07MB4709.namprd07.prod.outlook.com ([fe80::e0dc:ebd5:e248:d644%6]) with mapi id 15.20.1382.020; Sun, 2 Dec 2018 12:52:10 +0000 From: Pawel Laszczak To: Roger Quadros , "devicetree@vger.kernel.org" CC: "gregkh@linuxfoundation.org" , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Alan Douglas , "jbergsagel@ti.com" , "nsekhar@ti.com" , "nm@ti.com" , Suresh Punnoose , "peter.chen@nxp.com" , Pawel Jez , Rahul Kumar Subject: RE: [RFC PATCH v2 11/15] usb:cdns3: Implements ISR functionality. Thread-Topic: [RFC PATCH v2 11/15] usb:cdns3: Implements ISR functionality. Thread-Index: AQHUfycbSqacYB4L1k+qmHxKGhjP3aVlViQAgAYBSACAABwkkA== Date: Sun, 2 Dec 2018 12:52:10 +0000 Message-ID: References: <1542535751-16079-1-git-send-email-pawell@cadence.com> <1542535751-16079-12-git-send-email-pawell@cadence.com> <5BFEAC14.1030408@ti.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-dg-ref: PG1ldGE+PGF0IG5tPSJib2R5LnR4dCIgcD0iYzpcdXNlcnNccGF3ZWxsXGFwcGRhdGFccm9hbWluZ1wwOWQ4NDliNi0zMmQzLTRhNDAtODVlZS02Yjg0YmEyOWUzNWJcbXNnc1xtc2ctMTI4YWM3NWYtZjYzMS0xMWU4LTg3MjYtMWM0ZDcwMWRmYmE0XGFtZS10ZXN0XDEyOGFjNzYwLWY2MzEtMTFlOC04NzI2LTFjNGQ3MDFkZmJhNGJvZHkudHh0IiBzej0iMTU5NDkiIHQ9IjEzMTg4MjI4NzI3MTU1NTc5OSIgaD0iYVhRR2J4NGtWUEU3RlJ3ZkRRMDRRWm0rT3ZVPSIgaWQ9IiIgYmw9IjAiIGJvPSIxIi8+PC9tZXRhPg== x-dg-rorf: x-originating-ip: [185.217.253.59] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;BYAPR07MB4519;20:cED8bH87MCRHagNSq16GhN9SmkcrfrzG7FtHwOi9SjuJaLuoAtNlY9exjbvLfSNt/eCfWFdDfBgexjmUAOAZ+/x3p2eZS3A7tewq+oWqxcgnnrRD6EdYMJeO9fWjAsR/+U+U0b3WfrHWxGNsrooSU2Zpk30KDrg6biv43zFjc31/zleDRrS/FxXfzHcX1YCrhHgeYExgdVVa/1lxwJ8fPavb9NC5uaWgtt5bvsr4D+STVIvGcAnbpVLNcGwC0uxy x-ms-exchange-antispam-srfa-diagnostics: SOS;SOR; x-forefront-antispam-report: SFV:SKI;SCL:-1;SFV:NSPM;SFS:(10009020)(346002)(376002)(136003)(39850400004)(366004)(396003)(53234004)(51444003)(199004)(189003)(36092001)(66066001)(14444005)(256004)(26005)(33656002)(25786009)(6436002)(4326008)(229853002)(14454004)(186003)(575784001)(86362001)(316002)(102836004)(93886005)(53946003)(6506007)(68736007)(6246003)(107886003)(105586002)(9686003)(106356001)(8676002)(8936002)(81166006)(81156014)(53936002)(54906003)(7696005)(93156006)(99286004)(76176011)(71190400001)(3846002)(71200400001)(4744004)(74316002)(2906002)(7736002)(305945005)(6116002)(55016002)(97736004)(110136005)(217873002)(2501003)(5660300001)(2940100002)(486006)(476003)(446003)(11346002)(478600001);DIR:OUT;SFP:1101;SCL:1;SRVR:BYAPR07MB4519;H:BYAPR07MB4709.namprd07.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; x-ms-office365-filtering-correlation-id: 93782153-5c10-4947-26bc-08d65854f9a3 x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390098)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(2017052603328)(7153060)(7193020);SRVR:BYAPR07MB4519; x-ms-traffictypediagnostic: BYAPR07MB4519: x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3002001)(10201501046)(3231455)(999002)(944501488)(52105112)(93006095)(93001095)(148016)(149066)(150057)(6041310)(20161123564045)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(201708071742011)(7699051)(76991095);SRVR:BYAPR07MB4519;BCL:0;PCL:0;RULEID:;SRVR:BYAPR07MB4519; x-forefront-prvs: 087474FBFA received-spf: None (protection.outlook.com: cadence.com does not designate permitted sender hosts) x-microsoft-antispam-message-info: BeTpElOhVE/rgLWv45U05hV8mxLDXqqcksju2G9wDBwruAFFZgTnF7wFbSr2uhMp+hyJTTzAJ3Fpbw3eUZ1g9fHCWstjXk7wVmaee+fKBH0VdIgBSF9c+c2nO9aWRqRROkylatd0ibTz3l694bABvvUJYsMBRFjZZ7DXqtyelkI6/jO25W++9sOIGd3UZzVUK41LF7O4/7XkSFCOyB8AoRuhYnrjjkvA8vZ9DAthJ3Yg25/xory4eKJA6JaIxeCpxhloqWil5ZuwCfeIVF5PrxmCxt7rMtOQLSDrzLLAJTDDBqrHcvZGAvTK+88JX9kubaKnqoEU6khZKNglhzuBYgkF9tNue1CJP/EyQmwPRxs= spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: cadence.com X-MS-Exchange-CrossTenant-Network-Message-Id: 93782153-5c10-4947-26bc-08d65854f9a3 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Dec 2018 12:52:10.7109 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: d36035c5-6ce6-4662-a3dc-e762e61ae4c9 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR07MB4519 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=2018-12-02_08:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_check_notspam policy=outbound_check score=0 priorityscore=1501 malwarescore=0 suspectscore=0 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-1812020125 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org >Hi, > >>> Patch adds set of generic functions used for handling interrupts >>> generated by controller. Interrupt related functions are divided >>> into three groups. The first is related to ep0 and is placed in ep0.c. >>> The second is responsible for non-default endpoints and is >>> implemented in gadget.c file. The last group is not related to >>> endpoints interrupts and is placed in gadget.c. >>> All groups have common entry point in cdns3_irq_handler_thread function= . >>> >>> Signed-off-by: Pawel Laszczak >>> --- >>> drivers/usb/cdns3/ep0.c | 63 +++++++++++ >>> drivers/usb/cdns3/gadget.c | 224 ++++++++++++++++++++++++++++++++++++- >>> drivers/usb/cdns3/gadget.h | 1 + >>> 3 files changed, 287 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/usb/cdns3/ep0.c b/drivers/usb/cdns3/ep0.c >>> index d05169e73631..eb92fd234bd7 100644 >>> --- a/drivers/usb/cdns3/ep0.c >>> +++ b/drivers/usb/cdns3/ep0.c >>> @@ -90,6 +90,69 @@ static void cdns3_set_hw_configuration(struct cdns3_= device *priv_dev) >>> } >>> } >>> >>> +static void __pending_setup_status_handler(struct cdns3_device *priv_d= ev) >>> +{ >>> + //TODO: Implements this function >>> +} >>> + >>> +/** >>> + * cdns3_ep0_setup_phase - Handling setup USB requests >>> + * @priv_dev: extended gadget object >>> + */ >>> +static void cdns3_ep0_setup_phase(struct cdns3_device *priv_dev) >>> +{ >>> + //TODO: Implements this function. >>> +} >>> + >>> +static void cdns3_transfer_completed(struct cdns3_device *priv_dev) >>> +{ >>> + //TODO: Implements this function >>> +} >>> + >>> +/** >>> + * cdns3_check_ep0_interrupt_proceed - Processes interrupt related to = endpoint 0 >>> + * @priv_dev: extended gadget object >>> + * @dir: 1 for IN direction, 0 for OUT direction >>> + */ >>> +void cdns3_check_ep0_interrupt_proceed(struct cdns3_device *priv_dev, = int dir) >>> +{ >>> + struct cdns3_usb_regs __iomem *regs =3D priv_dev->regs; >>> + u32 ep_sts_reg; >>> + >>> + cdns3_select_ep(priv_dev, 0 | (dir ? USB_DIR_IN : USB_DIR_OUT)); >>> + ep_sts_reg =3D readl(®s->ep_sts); >>> + >>> + __pending_setup_status_handler(priv_dev); >>> + >>> + if ((ep_sts_reg & EP_STS_SETUP) && dir =3D=3D 0) { >>> + struct usb_ctrlrequest *setup =3D priv_dev->setup; >>> + >>> + writel(EP_STS_SETUP | EP_STS_IOC | EP_STS_ISP, ®s->ep_sts); >> >>instead you can just clear all events at the end of this function by >> writel(ep_sts_reg, ®s->ep_sts); > >But I can delete events that can appear during processing this function. >I think that safer is to add this fragment at the beginning, below line >ep_sts_reg =3D readl(®s->ep_sts); > > >>> + >>> + priv_dev->ep0_data_dir =3D setup->bRequestType & USB_DIR_IN; >>> + cdns3_ep0_setup_phase(priv_dev); >>> + ep_sts_reg &=3D ~(EP_STS_SETUP | EP_STS_IOC | EP_STS_ISP); >> >>Not required. >Why not ? I must clear at least EP_STS_IOC | EP_STS_ISP. >I don't want to handle the last condition in this function, of course if = SETUP was reported. > >Of course I can also change the construction of function and then I could = delete this statement. >> >>> + } >>> + >>> + if (ep_sts_reg & EP_STS_TRBERR) >>> + writel(EP_STS_TRBERR, &priv_dev->regs->ep_sts); >> >>Can be omitted. >>> + >>> + if (ep_sts_reg & EP_STS_DESCMIS) { >>> + writel(EP_STS_DESCMIS, &priv_dev->regs->ep_sts); >> >>This as well. >>> + >>> + if (dir =3D=3D 0 && !priv_dev->setup_pending) { >>> + priv_dev->ep0_data_dir =3D 0; >>> + cdns3_ep0_run_transfer(priv_dev, priv_dev->setup_dma, >>> + 8, 0); >>> + } >>> + } >>> + >>> + if ((ep_sts_reg & EP_STS_IOC) || (ep_sts_reg & EP_STS_ISP)) { >>> + writel(EP_STS_IOC, &priv_dev->regs->ep_sts); >> >>this write can be omitted. >>> + cdns3_transfer_completed(priv_dev); >>> + } >> >>here you can do >> writel(ep_sts_reg, ®s->ep_sts); >>> +} >>> + >>> /** >>> * cdns3_gadget_ep0_enable >>> * Function shouldn't be called by gadget driver, >>> diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c >>> index c965da16c0c8..309202474e57 100644 >>> --- a/drivers/usb/cdns3/gadget.c >>> +++ b/drivers/usb/cdns3/gadget.c >>> @@ -58,6 +58,18 @@ void cdns3_set_register_bit(void __iomem *ptr, u32 m= ask) >>> writel(mask, ptr); >>> } >>> >>> +/** >>> + * cdns3_ep_reg_pos_to_index - Macro converts bit position of ep_ists = register >>> + * to index of endpoint object in cdns3_device.eps[] container >>> + * @i: bit position of endpoint for which endpoint object is required >>> + * >>> + * Remember that endpoint container doesn't contain default endpoint >>> + */ >>> +static u8 cdns3_ep_reg_pos_to_index(int i) >>> +{ >>> + return ((i / 16) + (((i % 16) - 2) * 2)); >>> +} >>> + >>> /** >>> * cdns3_next_request - returns next request from list >>> * @list: list containing requests >>> @@ -188,6 +200,21 @@ static void cdns3_ep_stall_flush(struct cdns3_endp= oint *priv_ep) >>> priv_ep->flags |=3D EP_STALL; >>> } >>> >>> +/** >>> + * cdns3_gadget_unconfig - reset device configuration >>> + * @priv_dev: extended gadget object >>> + */ >>> +void cdns3_gadget_unconfig(struct cdns3_device *priv_dev) >>> +{ >>> + /* RESET CONFIGURATION */ >>> + writel(USB_CONF_CFGRST, &priv_dev->regs->usb_conf); >>> + >>> + cdns3_enable_l1(priv_dev, 0); >>> + priv_dev->hw_configured_flag =3D 0; >>> + priv_dev->onchip_mem_allocated_size =3D 0; >>> + priv_dev->out_mem_is_allocated =3D 0; >>> +} >>> + >>> void cdns3_enable_l1(struct cdns3_device *priv_dev, int enable) >>> { >>> if (enable) >>> @@ -196,6 +223,23 @@ void cdns3_enable_l1(struct cdns3_device *priv_dev= , int enable) >>> writel(USB_CONF_L1DS, &priv_dev->regs->usb_conf); >>> } >>> >>> +static enum usb_device_speed cdns3_get_speed(struct cdns3_device *priv= _dev) >>> +{ >>> + u32 reg; >>> + >>> + reg =3D readl(&priv_dev->regs->usb_sts); >>> + >>> + if (DEV_SUPERSPEED(reg)) >>> + return USB_SPEED_SUPER; >>> + else if (DEV_HIGHSPEED(reg)) >>> + return USB_SPEED_HIGH; >>> + else if (DEV_FULLSPEED(reg)) >>> + return USB_SPEED_FULL; >>> + else if (DEV_LOWSPEED(reg)) >>> + return USB_SPEED_LOW; >>> + return USB_SPEED_UNKNOWN; >>> +} >>> + >>> /** >>> * cdns3_gadget_giveback - call struct usb_request's ->complete callba= ck >>> * @priv_ep: The endpoint to whom the request belongs to >>> @@ -221,12 +265,136 @@ void cdns3_gadget_giveback(struct cdns3_endpoint= *priv_ep, >>> */ >>> int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep, >>> struct usb_request *request) >>> +{ >>> + return 0; >>> +} >>> + >>> +static void cdns3_transfer_completed(struct cdns3_device *priv_dev, >>> + struct cdns3_endpoint *priv_ep) >>> { >>> //TODO: Implements this function. >>> +} >>> + >>> +/** >>> + * cdns3_check_ep_interrupt_proceed - Processes interrupt related to e= ndpoint >>> + * @priv_ep: endpoint object >>> + * >>> + * Returns 0 >>> + */ >>> +static int cdns3_check_ep_interrupt_proceed(struct cdns3_endpoint *pri= v_ep) >>> +{ >>> + struct cdns3_device *priv_dev =3D priv_ep->cdns3_dev; >>> + struct cdns3_usb_regs __iomem *regs; >>> + u32 ep_sts_reg; >>> + >>> + regs =3D priv_dev->regs; >>> + >>> + cdns3_select_ep(priv_dev, priv_ep->endpoint.address); >>> + ep_sts_reg =3D readl(®s->ep_sts); >>> + >>> + if (ep_sts_reg & EP_STS_TRBERR) >>> + writel(EP_STS_TRBERR, ®s->ep_sts); >>> + >>> + if (ep_sts_reg & EP_STS_ISOERR) >>> + writel(EP_STS_ISOERR, ®s->ep_sts); >>> + >>> + if (ep_sts_reg & EP_STS_OUTSMM) >>> + writel(EP_STS_OUTSMM, ®s->ep_sts); >>> + >>> + if (ep_sts_reg & EP_STS_NRDY) >>> + writel(EP_STS_NRDY, ®s->ep_sts); >> >>Why check for each bit when you are not doing anything. Instead at the en= d >>you could just do >> writel(ep_sts_reg, ®s->ep_sts) >>to clear all pending events. > >Some time ago I had in these conditions debug messages, but then >I created the cdns3_decode_epx_irq and I removed them from there. > >I will remove them. > >>> + >>> + if ((ep_sts_reg & EP_STS_IOC) || (ep_sts_reg & EP_STS_ISP)) { >>> + writel(EP_STS_IOC | EP_STS_ISP, ®s->ep_sts); >>> + cdns3_transfer_completed(priv_dev, priv_ep); >>> + } >>> + >>> + if (ep_sts_reg & EP_STS_DESCMIS) >>> + writel(EP_STS_DESCMIS, ®s->ep_sts); >>> >>> return 0; >>> } >>> >>> +/** >>> + * cdns3_check_usb_interrupt_proceed - Processes interrupt related to = device >>> + * @priv_dev: extended gadget object >>> + * @usb_ists: bitmap representation of device's reported interrupts >>> + * (usb_ists register value) >>> + */ >>> +static void cdns3_check_usb_interrupt_proceed(struct cdns3_device *pri= v_dev, >>> + u32 usb_ists) >>> +{ >>> + struct cdns3_usb_regs __iomem *regs; >>> + int speed =3D 0; >>> + >>> + regs =3D priv_dev->regs; >>> + >>> + /* Connection detected */ >>> + if (usb_ists & (USB_ISTS_CON2I | USB_ISTS_CONI)) { >>> + writel(USB_ISTS_CON2I | USB_ISTS_CONI, ®s->usb_ists); >>> + speed =3D cdns3_get_speed(priv_dev); >>> + >>> + dev_dbg(&priv_dev->dev, "Connection detected at speed: %s %d\n", >>> + usb_speed_string(speed), speed); >>> + >>> + priv_dev->gadget.speed =3D speed; >>> + priv_dev->is_connected =3D 1; >>> + usb_gadget_set_state(&priv_dev->gadget, USB_STATE_POWERED); >>> + cdns3_ep0_config(priv_dev); >>> + } >>> + >>> + /* SS Disconnection detected */ >>> + if (usb_ists & (USB_ISTS_DIS2I | USB_ISTS_DISI)) { >>> + dev_dbg(&priv_dev->dev, "Disconnection detected\n"); >>> + >>> + writel(USB_ISTS_DIS2I | USB_ISTS_DISI, ®s->usb_ists); >>> + if (priv_dev->gadget_driver && >>> + priv_dev->gadget_driver->disconnect) { >>> + spin_unlock(&priv_dev->lock); >>> + priv_dev->gadget_driver->disconnect(&priv_dev->gadget); >>> + spin_lock(&priv_dev->lock); >>> + } >>> + priv_dev->gadget.speed =3D USB_SPEED_UNKNOWN; >>> + usb_gadget_set_state(&priv_dev->gadget, USB_STATE_NOTATTACHED); >>> + priv_dev->is_connected =3D 0; >>> + cdns3_gadget_unconfig(priv_dev); >>> + } >> >>What about non Super-Speed disconnects? > >I connect 2 conditions and I forgot to change the comment. >USB_ISTS_DIS2I - HS/FS disconnection >USB_ISTS_DISI) - SS disconnection > >> >>> + >>> + if (usb_ists & USB_ISTS_L2ENTI) { >>> + dev_dbg(&priv_dev->dev, "Device suspended\n"); >>> + writel(USB_ISTS_L2ENTI, ®s->usb_ists); >>> + } >>> + >>> + /* Exit from standby mode on L2 exit (Suspend in HS/FS or SS) */ >>> + if (usb_ists & USB_ISTS_L2EXTI) { >>> + dev_dbg(&priv_dev->dev, "[Interrupt] L2 exit detected\n"); >>> + writel(USB_ISTS_L2EXTI, ®s->usb_ists); >>> + } >>> + >>> + /* Exit from standby mode on U3 exit (Suspend in HS/FS or SS). */ >>> + if (usb_ists & USB_ISTS_U3EXTI) { >>> + dev_dbg(&priv_dev->dev, "U3 exit detected\n"); >>> + writel(USB_ISTS_U3EXTI, ®s->usb_ists); >>> + } >>> + >>> + /* resets cases */ >>> + if (usb_ists & (USB_ISTS_UWRESI | USB_ISTS_UHRESI | USB_ISTS_U2RESI))= { >>> + writel(USB_ISTS_U2RESI | USB_ISTS_UWRESI | USB_ISTS_UHRESI, >>> + ®s->usb_ists); >>> + >>> + /*read again to check the actuall speed*/ >>> + speed =3D cdns3_get_speed(priv_dev); >>> + >>> + dev_dbg(&priv_dev->dev, "Reset detected at speed: %s %d\n", >>> + usb_speed_string(speed), speed); >>> + >>> + usb_gadget_set_state(&priv_dev->gadget, USB_STATE_DEFAULT); >>> + priv_dev->gadget.speed =3D speed; >>> + cdns3_gadget_unconfig(priv_dev); >>> + cdns3_ep0_config(priv_dev); >>> + } >>> +} >>> + >>> /** >>> * cdns3_irq_handler - irq line interrupt handler >>> * @cdns: cdns3 instance >>> @@ -237,8 +405,62 @@ int cdns3_ep_run_transfer(struct cdns3_endpoint *p= riv_ep, >>> */ >>> static irqreturn_t cdns3_irq_handler_thread(struct cdns3 *cdns) >>> { >>> + struct cdns3_device *priv_dev; >>> irqreturn_t ret =3D IRQ_NONE; >>> - //TODO: implements this function >>> + unsigned long flags; >>> + u32 reg; >>> + >>> + priv_dev =3D container_of(cdns->gadget_dev, struct cdns3_device, dev)= ; >>> + spin_lock_irqsave(&priv_dev->lock, flags); >>> + >>> + /* check USB device interrupt */ >>> + reg =3D readl(&priv_dev->regs->usb_ists); >>> + if (reg) { >>> + dev_dbg(&priv_dev->dev, "IRQ: usb_ists: %08X\n", reg); >> >>dev_dbg will be terribly slow to be useful. Tracepoints? > >It will be moved to Tracepoint. >> >>> + cdns3_check_usb_interrupt_proceed(priv_dev, reg); >>> + ret =3D IRQ_HANDLED; >>> + } >>> + >>> + /* check endpoint interrupt */ >>> + reg =3D readl(&priv_dev->regs->ep_ists); >>> + if (reg !=3D 0) { >>> + dev_dbg(&priv_dev->dev, "IRQ ep_ists: %08X\n", reg); >>> + } else { >>> + if (USB_STS_CFGSTS(readl(&priv_dev->regs->usb_sts))) >>> + ret =3D IRQ_HANDLED; >> >>Why is this done. We don't seem to be handling anything here. >>Don't we need to clear the usb_sts? > >This check CFGSTS bit. From controller spec: >Configuration status - >1 - device is in the configured state >0 - device is not configured >This bit set during SET_CONFIGURATION >request means that status stage of this >request was finished successfully, thus device >configuration was finished successfully > >And again, the setting related with setting endpoint configuration. > >The author did not mention anything about setting alternate setting >that require reconfiguring endpoints. > >I think that this fragment protects against handling epx before setting co= nfiguration. > >I think that I can omit this fragment, but I need to test it with Command = Verifier. > >Regarding clearing usb_sts, it's cleared but in other functions invoked = from this one. >Maybe it could be better to pass to these other function content of usb_is= ts and do >clearing in one place. It could limit access to registers and make the cod= e more readable Sorry, I am little confused.=20 We have ep_sts, usb_ists and ep_ists=20 usb_ists - must be cleared by software=20 ep_ists - we don't have to clear this register. It's RO. I think that clea= ring it by software could=20 cause some racing.=20 >> >>> + goto irqend; >>> + } >>> + >>> + /* handle default endpoint OUT */ >>> + if (reg & EP_ISTS_EP_OUT0) { >>> + cdns3_check_ep0_interrupt_proceed(priv_dev, 0); >>> + ret =3D IRQ_HANDLED; >>> + } >>> + >>> + /* handle default endpoint IN */ >>> + if (reg & EP_ISTS_EP_IN0) { >>> + cdns3_check_ep0_interrupt_proceed(priv_dev, 1); >>> + ret =3D IRQ_HANDLED; >>> + } >>> + >>> + /* check if interrupt from non default endpoint, if no exit */ >>> + reg &=3D ~(EP_ISTS_EP_OUT0 | EP_ISTS_EP_IN0); >>> + if (!reg) >>> + goto irqend; >>> + >>> + do { >>> + unsigned int bit_pos =3D ffs(reg); >>> + u32 bit_mask =3D 1 << (bit_pos - 1); >>> + int index; >>> + >>> + index =3D cdns3_ep_reg_pos_to_index(bit_pos); >>> + cdns3_check_ep_interrupt_proceed(priv_dev->eps[index]); >>> + reg &=3D ~bit_mask; >>> + ret =3D IRQ_HANDLED; >>> + } while (reg); >>> + >>> +irqend: >>> + spin_unlock_irqrestore(&priv_dev->lock, flags); >>> return ret; >>> } >>> >>> diff --git a/drivers/usb/cdns3/gadget.h b/drivers/usb/cdns3/gadget.h >>> index 224f6b830bc9..8c2f363f9340 100644 >>> --- a/drivers/usb/cdns3/gadget.h >>> +++ b/drivers/usb/cdns3/gadget.h >>> @@ -1072,6 +1072,7 @@ int cdns3_handshake(void __iomem *ptr, u32 mask, = u32 done, int usec); >>> void cdns3_set_register_bit(void __iomem *ptr, u32 mask); >>> int cdns3_init_ep0(struct cdns3_device *priv_dev); >>> void cdns3_ep0_config(struct cdns3_device *priv_dev); >>> +void cdns3_check_ep0_interrupt_proceed(struct cdns3_device *priv_dev, = int dir); >>> void cdns3_select_ep(struct cdns3_device *priv_dev, u32 ep); >>> void cdns3_enable_l1(struct cdns3_device *priv_dev, int enable); >>> struct usb_request *cdns3_next_request(struct list_head *list); >>> > >Thanks >Cheers, >Pawel