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=-8.8 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,URIBL_BLOCKED,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 54875C32789 for ; Wed, 10 Oct 2018 02:49:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1B2D4214FA for ; Wed, 10 Oct 2018 02:49:36 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Lsq9lUfE" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1B2D4214FA Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727562AbeJJKJ0 (ORCPT ); Wed, 10 Oct 2018 06:09:26 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:44310 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726701AbeJJKJZ (ORCPT ); Wed, 10 Oct 2018 06:09:25 -0400 Received: from garnet.amanokami.net (unknown [96.44.9.229]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6547D1C3D; Wed, 10 Oct 2018 04:49:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1539139766; bh=LQaoT+rmlpkEpS2F515HIOIpAYO4V9yxI7kW1uHehsk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Lsq9lUfEgwo4coUIsp3ownL4+06BUij/gk556FxV34cGDNqj0IVRf0KjUL4QdchBT gLvQEbBFq3Gg/4M2LYy6vpbypu4o80hnMDhhV1jO8ZmYzV5AfA/rT1sE9iOq5ANXWT m1uVb3qGcYpJo5rJMJbiNmcMlYb3VE33ie9qEZic= From: Paul Elder To: laurent.pinchart@ideasonboard.com, kieran.bingham@ideasonboard.com Cc: Paul Elder , b-liu@ti.com, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, balbi@kernel.org, stern@rowland.harvard.edu, rogerq@ti.com Subject: [PATCH 5/6] usb: musb: gadget: implement send_response Date: Tue, 9 Oct 2018 22:49:02 -0400 Message-Id: <20181010024903.1633-6-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20181010024903.1633-1-paul.elder@ideasonboard.com> References: <20181010024903.1633-1-paul.elder@ideasonboard.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch implements a mechanism to signal the MUSB driver to reply to a control OUT request with STALL or ACK. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- drivers/usb/musb/musb_gadget_ep0.c | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 91a5027b5c1f..f0ed1f7472a3 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c @@ -458,6 +458,25 @@ __acquires(musb->lock) return handled; } +static int ep0_send_response(struct musb *musb, bool stall) +{ + void __iomem *regs = musb->control_ep->regs; + u16 ackpend; + + if (musb->ep0_state != MUSB_EP0_STAGE_RX && + musb->ep0_state != MUSB_EP0_STAGE_STATUSIN) + return -EINVAL; + + ackpend = MUSB_CSR0_P_DATAEND + | MUSB_CSR0_P_SVDRXPKTRDY + | (stall ? MUSB_CSR0_P_SENDSTALL : 0); + + musb_ep_select(musb->mregs, 0); + musb_writew(regs, MUSB_CSR0, ackpend); + + return 0; +} + /* we have an ep0out data packet * Context: caller holds controller lock */ @@ -466,10 +485,13 @@ static void ep0_rxstate(struct musb *musb) void __iomem *regs = musb->control_ep->regs; struct musb_request *request; struct usb_request *req; + struct usb_ep *ep; u16 count, csr; + bool last_packet = false; request = next_ep0_request(musb); req = &request->request; + ep = &request->ep->end_point; /* read packet and ack; or stall because of gadget driver bug: * should have provided the rx buffer before setup() returned. @@ -492,6 +514,7 @@ static void ep0_rxstate(struct musb *musb) if (count < 64 || req->actual == req->length) { musb->ep0_state = MUSB_EP0_STAGE_STATUSIN; csr |= MUSB_CSR0_P_DATAEND; + last_packet = true; } else req = NULL; } else @@ -508,6 +531,10 @@ static void ep0_rxstate(struct musb *musb) return; musb->ackpend = 0; } + + if (last_packet && ep->delayed_status) + return; + musb_ep_select(musb->mregs, 0); musb_writew(regs, MUSB_CSR0, csr); } @@ -991,6 +1018,19 @@ static int musb_g_ep0_dequeue(struct usb_ep *ep, struct usb_request *req) return -EINVAL; } +static int musb_g_ep0_send_response(struct usb_ep *e, bool stall) +{ + struct musb_ep *ep = to_musb_ep(e); + struct musb *musb = ep->musb; + unsigned long flags; + int ret; + + spin_lock_irqsave(&musb->lock, flags); + ret = ep0_send_response(musb, stall); + spin_unlock_irqrestore(&musb->lock, flags); + return ret; +} + static int musb_g_ep0_halt(struct usb_ep *e, int value) { struct musb_ep *ep; @@ -1059,4 +1099,5 @@ const struct usb_ep_ops musb_g_ep0_ops = { .queue = musb_g_ep0_queue, .dequeue = musb_g_ep0_dequeue, .set_halt = musb_g_ep0_halt, + .send_response = musb_g_ep0_send_response, }; -- 2.18.0 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: [5/6] usb: musb: gadget: implement send_response From: Paul Elder Message-Id: <20181010024903.1633-6-paul.elder@ideasonboard.com> Date: Tue, 9 Oct 2018 22:49:02 -0400 To: laurent.pinchart@ideasonboard.com, kieran.bingham@ideasonboard.com Cc: Paul Elder , b-liu@ti.com, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, balbi@kernel.org, stern@rowland.harvard.edu, rogerq@ti.com List-ID: VGhpcyBwYXRjaCBpbXBsZW1lbnRzIGEgbWVjaGFuaXNtIHRvIHNpZ25hbCB0aGUgTVVTQiBkcml2 ZXIgdG8gcmVwbHkgdG8KYSBjb250cm9sIE9VVCByZXF1ZXN0IHdpdGggU1RBTEwgb3IgQUNLLgoK U2lnbmVkLW9mZi1ieTogUGF1bCBFbGRlciA8cGF1bC5lbGRlckBpZGVhc29uYm9hcmQuY29tPgpS ZXZpZXdlZC1ieTogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9h cmQuY29tPgotLS0KIGRyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMgfCA0MSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2VkLCA0MSBpbnNlcnRpb25z KCspCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYyBiL2Ry aXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMKaW5kZXggOTFhNTAyN2I1YzFmLi5mMGVk MWY3NDcyYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXRfZXAwLmMK KysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldF9lcDAuYwpAQCAtNDU4LDYgKzQ1OCwy NSBAQCBfX2FjcXVpcmVzKG11c2ItPmxvY2spCiAJcmV0dXJuIGhhbmRsZWQ7CiB9CiAKK3N0YXRp YyBpbnQgZXAwX3NlbmRfcmVzcG9uc2Uoc3RydWN0IG11c2IgKm11c2IsIGJvb2wgc3RhbGwpCit7 CisJdm9pZCBfX2lvbWVtICpyZWdzID0gbXVzYi0+Y29udHJvbF9lcC0+cmVnczsKKwl1MTYgYWNr cGVuZDsKKworCWlmIChtdXNiLT5lcDBfc3RhdGUgIT0gTVVTQl9FUDBfU1RBR0VfUlggJiYKKwkg ICAgbXVzYi0+ZXAwX3N0YXRlICE9IE1VU0JfRVAwX1NUQUdFX1NUQVRVU0lOKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCWFja3BlbmQgPSBNVVNCX0NTUjBfUF9EQVRBRU5ECisJCXwgTVVTQl9DU1Iw X1BfU1ZEUlhQS1RSRFkKKwkJfCAoc3RhbGwgPyBNVVNCX0NTUjBfUF9TRU5EU1RBTEwgOiAwKTsK KworCW11c2JfZXBfc2VsZWN0KG11c2ItPm1yZWdzLCAwKTsKKwltdXNiX3dyaXRldyhyZWdzLCBN VVNCX0NTUjAsIGFja3BlbmQpOworCisJcmV0dXJuIDA7Cit9CisKIC8qIHdlIGhhdmUgYW4gZXAw b3V0IGRhdGEgcGFja2V0CiAgKiBDb250ZXh0OiAgY2FsbGVyIGhvbGRzIGNvbnRyb2xsZXIgbG9j awogICovCkBAIC00NjYsMTAgKzQ4NSwxMyBAQCBzdGF0aWMgdm9pZCBlcDBfcnhzdGF0ZShzdHJ1 Y3QgbXVzYiAqbXVzYikKIAl2b2lkIF9faW9tZW0JCSpyZWdzID0gbXVzYi0+Y29udHJvbF9lcC0+ cmVnczsKIAlzdHJ1Y3QgbXVzYl9yZXF1ZXN0CSpyZXF1ZXN0OwogCXN0cnVjdCB1c2JfcmVxdWVz dAkqcmVxOworCXN0cnVjdCB1c2JfZXAJCSplcDsKIAl1MTYJCQljb3VudCwgY3NyOworCWJvb2wJ CQlsYXN0X3BhY2tldCA9IGZhbHNlOwogCiAJcmVxdWVzdCA9IG5leHRfZXAwX3JlcXVlc3QobXVz Yik7CiAJcmVxID0gJnJlcXVlc3QtPnJlcXVlc3Q7CisJZXAgPSAmcmVxdWVzdC0+ZXAtPmVuZF9w b2ludDsKIAogCS8qIHJlYWQgcGFja2V0IGFuZCBhY2s7IG9yIHN0YWxsIGJlY2F1c2Ugb2YgZ2Fk Z2V0IGRyaXZlciBidWc6CiAJICogc2hvdWxkIGhhdmUgcHJvdmlkZWQgdGhlIHJ4IGJ1ZmZlciBi ZWZvcmUgc2V0dXAoKSByZXR1cm5lZC4KQEAgLTQ5Miw2ICs1MTQsNyBAQCBzdGF0aWMgdm9pZCBl cDBfcnhzdGF0ZShzdHJ1Y3QgbXVzYiAqbXVzYikKIAkJaWYgKGNvdW50IDwgNjQgfHwgcmVxLT5h Y3R1YWwgPT0gcmVxLT5sZW5ndGgpIHsKIAkJCW11c2ItPmVwMF9zdGF0ZSA9IE1VU0JfRVAwX1NU QUdFX1NUQVRVU0lOOwogCQkJY3NyIHw9IE1VU0JfQ1NSMF9QX0RBVEFFTkQ7CisJCQlsYXN0X3Bh Y2tldCA9IHRydWU7CiAJCX0gZWxzZQogCQkJcmVxID0gTlVMTDsKIAl9IGVsc2UKQEAgLTUwOCw2 ICs1MzEsMTAgQEAgc3RhdGljIHZvaWQgZXAwX3J4c3RhdGUoc3RydWN0IG11c2IgKm11c2IpCiAJ CQlyZXR1cm47CiAJCW11c2ItPmFja3BlbmQgPSAwOwogCX0KKworCWlmIChsYXN0X3BhY2tldCAm JiBlcC0+ZGVsYXllZF9zdGF0dXMpCisJCXJldHVybjsKKwogCW11c2JfZXBfc2VsZWN0KG11c2It Pm1yZWdzLCAwKTsKIAltdXNiX3dyaXRldyhyZWdzLCBNVVNCX0NTUjAsIGNzcik7CiB9CkBAIC05 OTEsNiArMTAxOCwxOSBAQCBzdGF0aWMgaW50IG11c2JfZ19lcDBfZGVxdWV1ZShzdHJ1Y3QgdXNi X2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAK K3N0YXRpYyBpbnQgbXVzYl9nX2VwMF9zZW5kX3Jlc3BvbnNlKHN0cnVjdCB1c2JfZXAgKmUsIGJv b2wgc3RhbGwpCit7CisJc3RydWN0IG11c2JfZXAgKmVwID0gdG9fbXVzYl9lcChlKTsKKwlzdHJ1 Y3QgbXVzYiAqbXVzYiA9IGVwLT5tdXNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJl dDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisJcmV0ID0gZXAw X3NlbmRfcmVzcG9uc2UobXVzYiwgc3RhbGwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11 c2ItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG11c2JfZ19l cDBfaGFsdChzdHJ1Y3QgdXNiX2VwICplLCBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IG11c2JfZXAJ CSplcDsKQEAgLTEwNTksNCArMTA5OSw1IEBAIGNvbnN0IHN0cnVjdCB1c2JfZXBfb3BzIG11c2Jf Z19lcDBfb3BzID0gewogCS5xdWV1ZQkJPSBtdXNiX2dfZXAwX3F1ZXVlLAogCS5kZXF1ZXVlCT0g bXVzYl9nX2VwMF9kZXF1ZXVlLAogCS5zZXRfaGFsdAk9IG11c2JfZ19lcDBfaGFsdCwKKwkuc2Vu ZF9yZXNwb25zZSAgPSBtdXNiX2dfZXAwX3NlbmRfcmVzcG9uc2UsCiB9Owo=