From: Kishon Vijay Abraham I <kishon@ti.com>
To: balbi@ti.com, linux-usb@vger.kernel.org,
linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: gregkh@linuxfoundation.org, kishon@ti.com, nsekhar@ti.com
Subject: [PATCH v2 6/6] usb: dwc3: ep0: handle non maxpacket aligned transfers > 512
Date: Fri, 24 Jul 2015 12:17:16 +0530 [thread overview]
Message-ID: <1437720436-4261-7-git-send-email-kishon@ti.com> (raw)
In-Reply-To: <1437720436-4261-1-git-send-email-kishon@ti.com>
Use chained TRB mechanism to handle non maxpacket aligned transfers
greater than bounce buffer size. With this the first TRB will be programmed
to receive 'ALIGN(ur->length - maxp, maxp)' data and the second TRB
will be programmed to receive the remaining data using bounce buffer.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/usb/dwc3/ep0.c | 42 ++++++++++++++++++++++++++++--------------
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 6847afe..0dbc0c4 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -830,13 +830,26 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
maxp = ep0->endpoint.maxpacket;
if (dwc->ep0_bounced) {
+ /*
+ * Handle the first TRB before handling the bounce buffer if
+ * the request length is greater than the bounce buffer size
+ */
+ if (ur->length > DWC3_EP0_BOUNCE_SIZE) {
+ transfer_size = ALIGN(ur->length - maxp, maxp);
+ transferred = transfer_size - length;
+ buf = (u8 *)buf + transferred;
+ ur->actual += transferred;
+ remaining_ur_length -= transferred;
+
+ trb++;
+ length = trb->size & DWC3_TRB_SIZE_MASK;
+
+ ep0->free_slot = 0;
+ }
+
transfer_size = roundup((ur->length - transfer_size),
maxp);
- /* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */
- if (transfer_size > DWC3_EP0_BOUNCE_SIZE)
- transfer_size = DWC3_EP0_BOUNCE_SIZE;
-
transferred = min_t(u32, remaining_ur_length,
transfer_size - length);
memcpy(buf, dwc->ep0_bounce, transferred);
@@ -959,21 +972,22 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
}
maxpacket = dep->endpoint.maxpacket;
- transfer_size = roundup((req->request.length - transfer_size),
- maxpacket);
- if (transfer_size > DWC3_EP0_BOUNCE_SIZE) {
- dev_WARN(dwc->dev, "bounce buf can't handle req len\n");
- transfer_size = DWC3_EP0_BOUNCE_SIZE;
+ if (req->request.length > DWC3_EP0_BOUNCE_SIZE) {
+ transfer_size = ALIGN(req->request.length - maxpacket,
+ maxpacket);
+ ret = dwc3_ep0_start_trans(dwc, dep->number,
+ req->request.dma,
+ transfer_size,
+ DWC3_TRBCTL_CONTROL_DATA,
+ true);
}
+ transfer_size = roundup((req->request.length - transfer_size),
+ maxpacket);
+
dwc->ep0_bounced = true;
- /*
- * REVISIT in case request length is bigger than
- * DWC3_EP0_BOUNCE_SIZE we will need two chained
- * TRBs to handle the transfer.
- */
ret = dwc3_ep0_start_trans(dwc, dep->number,
dwc->ep0_bounce_addr, transfer_size,
DWC3_TRBCTL_CONTROL_DATA, false);
--
1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Kishon Vijay Abraham I <kishon@ti.com>
To: <balbi@ti.com>, <linux-usb@vger.kernel.org>,
<linux-omap@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <gregkh@linuxfoundation.org>, <kishon@ti.com>, <nsekhar@ti.com>
Subject: [PATCH v2 6/6] usb: dwc3: ep0: handle non maxpacket aligned transfers > 512
Date: Fri, 24 Jul 2015 12:17:16 +0530 [thread overview]
Message-ID: <1437720436-4261-7-git-send-email-kishon@ti.com> (raw)
In-Reply-To: <1437720436-4261-1-git-send-email-kishon@ti.com>
Use chained TRB mechanism to handle non maxpacket aligned transfers
greater than bounce buffer size. With this the first TRB will be programmed
to receive 'ALIGN(ur->length - maxp, maxp)' data and the second TRB
will be programmed to receive the remaining data using bounce buffer.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
---
drivers/usb/dwc3/ep0.c | 42 ++++++++++++++++++++++++++++--------------
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 6847afe..0dbc0c4 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -830,13 +830,26 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
maxp = ep0->endpoint.maxpacket;
if (dwc->ep0_bounced) {
+ /*
+ * Handle the first TRB before handling the bounce buffer if
+ * the request length is greater than the bounce buffer size
+ */
+ if (ur->length > DWC3_EP0_BOUNCE_SIZE) {
+ transfer_size = ALIGN(ur->length - maxp, maxp);
+ transferred = transfer_size - length;
+ buf = (u8 *)buf + transferred;
+ ur->actual += transferred;
+ remaining_ur_length -= transferred;
+
+ trb++;
+ length = trb->size & DWC3_TRB_SIZE_MASK;
+
+ ep0->free_slot = 0;
+ }
+
transfer_size = roundup((ur->length - transfer_size),
maxp);
- /* Maximum of DWC3_EP0_BOUNCE_SIZE can only be received */
- if (transfer_size > DWC3_EP0_BOUNCE_SIZE)
- transfer_size = DWC3_EP0_BOUNCE_SIZE;
-
transferred = min_t(u32, remaining_ur_length,
transfer_size - length);
memcpy(buf, dwc->ep0_bounce, transferred);
@@ -959,21 +972,22 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc,
}
maxpacket = dep->endpoint.maxpacket;
- transfer_size = roundup((req->request.length - transfer_size),
- maxpacket);
- if (transfer_size > DWC3_EP0_BOUNCE_SIZE) {
- dev_WARN(dwc->dev, "bounce buf can't handle req len\n");
- transfer_size = DWC3_EP0_BOUNCE_SIZE;
+ if (req->request.length > DWC3_EP0_BOUNCE_SIZE) {
+ transfer_size = ALIGN(req->request.length - maxpacket,
+ maxpacket);
+ ret = dwc3_ep0_start_trans(dwc, dep->number,
+ req->request.dma,
+ transfer_size,
+ DWC3_TRBCTL_CONTROL_DATA,
+ true);
}
+ transfer_size = roundup((req->request.length - transfer_size),
+ maxpacket);
+
dwc->ep0_bounced = true;
- /*
- * REVISIT in case request length is bigger than
- * DWC3_EP0_BOUNCE_SIZE we will need two chained
- * TRBs to handle the transfer.
- */
ret = dwc3_ep0_start_trans(dwc, dep->number,
dwc->ep0_bounce_addr, transfer_size,
DWC3_TRBCTL_CONTROL_DATA, false);
--
1.7.9.5
next prev parent reply other threads:[~2015-07-24 6:47 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-24 6:47 [PATCH v2 0/6] usb: dwc3: handle non maxpacket aligned transfers > 512 Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I
2015-07-24 6:47 ` [PATCH v2 1/6] usb: dwc3: ep0: Fix mem corruption on OUT transfers of more than 512 bytes Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I
2015-07-24 6:47 ` [PATCH v2 2/6] usb: dwc3: ep0: use _roundup_ to calculate the transfer size Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I
2015-07-24 6:47 ` [PATCH v2 3/6] usb: dwc3: ep0: preparation for handling non maxpacket aligned transfers > 512 Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I
2015-07-24 6:47 ` [PATCH v2 4/6] usb: dwc3; ep0: Modify _dwc3_ep0_start_trans_ API to take 'chain' parameter Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I
[not found] ` <1437720436-4261-5-git-send-email-kishon-l0cyMroinI0@public.gmane.org>
2015-07-24 12:51 ` Sergei Shtylyov
2015-07-24 12:51 ` Sergei Shtylyov
2015-07-24 6:47 ` [PATCH v2 5/6] usb: dwc3: ep0: Add chained TRB support Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I
2015-07-24 6:47 ` Kishon Vijay Abraham I [this message]
2015-07-24 6:47 ` [PATCH v2 6/6] usb: dwc3: ep0: handle non maxpacket aligned transfers > 512 Kishon Vijay Abraham I
2015-07-24 6:49 ` [RESEND PATCH v2 1/6] usb: dwc3: ep0: Fix mem corruption on OUT transfers of more than 512 bytes Kishon Vijay Abraham I
2015-07-24 6:49 ` Kishon Vijay Abraham I
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1437720436-4261-7-git-send-email-kishon@ti.com \
--to=kishon@ti.com \
--cc=balbi@ti.com \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=nsekhar@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.