From: Tatyana Brokhman <tlinder@codeaurora.org>
To: greg@kroah.com
Cc: linux-usb@vger.kernel.org, linux-arm-msm@vger.kernel.org,
balbi@ti.com, ablay@codeaurora.org,
Tatyana Brokhman <tlinder@codeaurora.org>,
open list <linux-kernel@vger.kernel.org>
Subject: [PATCH v12 2/8] usb: Configure endpoint according to gadget speed.
Date: Mon, 23 May 2011 09:41:11 +0300 [thread overview]
Message-ID: <1306132882-9668-3-git-send-email-tlinder@codeaurora.org> (raw)
In-Reply-To: <1306132882-9668-1-git-send-email-tlinder@codeaurora.org>
Add config_ep_by_speed() to configure the endpoint according to the gadget
speed. Using this function will spare the FDs from handling the endpoint
chosen descriptor.
Signed-off-by: Tatyana Brokhman <tlinder@codeaurora.org>
---
drivers/usb/gadget/composite.c | 85 +++++++++++++++++++++++++++++++++++++++
drivers/usb/gadget/epautoconf.c | 1 +
include/linux/usb/composite.h | 3 +
include/linux/usb/gadget.h | 3 +
4 files changed, 92 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 5cbb1a4..1c6bd66 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -74,6 +74,91 @@ MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");
static char composite_manufacturer[50];
/*-------------------------------------------------------------------------*/
+/**
+ * next_ep_desc() - advance to the next EP descriptor
+ * @t: currect pointer within descriptor array
+ *
+ * Return: next EP descriptor or NULL
+ *
+ * Iterate over @t until either EP descriptor found or
+ * NULL (that indicates end of list) encountered
+ */
+static struct usb_descriptor_header**
+next_ep_desc(struct usb_descriptor_header **t)
+{
+ for (; *t; t++) {
+ if ((*t)->bDescriptorType == USB_DT_ENDPOINT)
+ return t;
+ }
+ return NULL;
+}
+
+/*
+ * for_each_ep_desc()- iterate over endpoint descriptors in the
+ * descriptors list
+ * @start: pointer within descriptor array.
+ * @ep_desc: endpoint descriptor to use as the loop cursor
+ */
+#define for_each_ep_desc(start, ep_desc) \
+ for (ep_desc = next_ep_desc(start); \
+ ep_desc; ep_desc = next_ep_desc(ep_desc+1))
+
+/**
+ * config_ep_by_speed() - configures the given endpoint
+ * according to gadget speed.
+ * @g: pointer to the gadget
+ * @f: usb function
+ * @_ep: the endpoint to configure
+ *
+ * Return: error code, 0 on success
+ *
+ * This function chooses the right descriptors for a given
+ * endpoint according to gadget speed and saves it in the
+ * endpoint desc field. If the endpoint already has a descriptor
+ * assigned to it - overwrites it with currently corresponding
+ * descriptor. The endpoint maxpacket field is updated according
+ * to the chosen descriptor.
+ * Note: the supplied function should hold all the descriptors
+ * for supported speeds
+ */
+int config_ep_by_speed(struct usb_gadget *g,
+ struct usb_function *f,
+ struct usb_ep *_ep)
+{
+ struct usb_endpoint_descriptor *chosen_desc = NULL;
+ struct usb_descriptor_header **speed_desc = NULL;
+
+ struct usb_descriptor_header **d_spd; /* cursor for speed desc */
+
+ if (!g || !f || !_ep)
+ return -EIO;
+
+ /* select desired speed */
+ switch (g->speed) {
+ case USB_SPEED_HIGH:
+ if (gadget_is_dualspeed(g)) {
+ speed_desc = f->hs_descriptors;
+ break;
+ }
+ /* else: fall through */
+ default:
+ speed_desc = f->descriptors;
+ }
+ /* find descriptors */
+ for_each_ep_desc(speed_desc, d_spd) {
+ chosen_desc = (struct usb_endpoint_descriptor *)*d_spd;
+ if (chosen_desc->bEndpointAddress == _ep->address)
+ goto ep_found;
+ }
+ return -EIO;
+
+ep_found:
+ /* commit results */
+ _ep->maxpacket = le16_to_cpu(chosen_desc->wMaxPacketSize);
+ _ep->desc = chosen_desc;
+
+ return 0;
+}
/**
* usb_add_function() - add a function to a configuration
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 9b7360f..0022d44 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -191,6 +191,7 @@ ep_matches (
size = 64;
desc->wMaxPacketSize = cpu_to_le16(size);
}
+ ep->address = desc->bEndpointAddress;
return 1;
}
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
index b78cba4..2014d6b 100644
--- a/include/linux/usb/composite.h
+++ b/include/linux/usb/composite.h
@@ -145,6 +145,9 @@ int usb_function_activate(struct usb_function *);
int usb_interface_id(struct usb_configuration *, struct usb_function *);
+int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f,
+ struct usb_ep *_ep);
+
/**
* ep_choose - select descriptor endpoint at current device speed
* @g: gadget, connected and running at some speed
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 5c4c30c..8015ceb 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -132,6 +132,8 @@ struct usb_ep_ops {
* value can sometimes be reduced (hardware allowing), according to
* the endpoint descriptor used to configure the endpoint.
* @driver_data:for use by the gadget driver.
+ * @address: used to identify the endpoint when finding descriptor that
+ * matches connection speed
* @desc: endpoint descriptor. This pointer is set before the endpoint is
* enabled and remains valid until the endpoint is disabled.
*
@@ -146,6 +148,7 @@ struct usb_ep {
const struct usb_ep_ops *ops;
struct list_head ep_list;
unsigned maxpacket:16;
+ u8 address;
const struct usb_endpoint_descriptor *desc;
};
--
1.7.3.3
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
WARNING: multiple messages have this Message-ID (diff)
From: Tatyana Brokhman <tlinder@codeaurora.org>
To: greg@kroah.com
Cc: linux-usb@vger.kernel.org, linux-arm-msm@vger.kernel.org,
balbi@ti.com, ablay@codeaurora.org,
Tatyana Brokhman <tlinder@codeaurora.org>,
linux-kernel@vger.kernel.org (open list)
Subject: [PATCH v12 2/8] usb: Configure endpoint according to gadget speed.
Date: Mon, 23 May 2011 09:41:11 +0300 [thread overview]
Message-ID: <1306132882-9668-3-git-send-email-tlinder@codeaurora.org> (raw)
In-Reply-To: <1306132882-9668-1-git-send-email-tlinder@codeaurora.org>
Add config_ep_by_speed() to configure the endpoint according to the gadget
speed. Using this function will spare the FDs from handling the endpoint
chosen descriptor.
Signed-off-by: Tatyana Brokhman <tlinder@codeaurora.org>
---
drivers/usb/gadget/composite.c | 85 +++++++++++++++++++++++++++++++++++++++
drivers/usb/gadget/epautoconf.c | 1 +
include/linux/usb/composite.h | 3 +
include/linux/usb/gadget.h | 3 +
4 files changed, 92 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 5cbb1a4..1c6bd66 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -74,6 +74,91 @@ MODULE_PARM_DESC(iSerialNumber, "SerialNumber string");
static char composite_manufacturer[50];
/*-------------------------------------------------------------------------*/
+/**
+ * next_ep_desc() - advance to the next EP descriptor
+ * @t: currect pointer within descriptor array
+ *
+ * Return: next EP descriptor or NULL
+ *
+ * Iterate over @t until either EP descriptor found or
+ * NULL (that indicates end of list) encountered
+ */
+static struct usb_descriptor_header**
+next_ep_desc(struct usb_descriptor_header **t)
+{
+ for (; *t; t++) {
+ if ((*t)->bDescriptorType == USB_DT_ENDPOINT)
+ return t;
+ }
+ return NULL;
+}
+
+/*
+ * for_each_ep_desc()- iterate over endpoint descriptors in the
+ * descriptors list
+ * @start: pointer within descriptor array.
+ * @ep_desc: endpoint descriptor to use as the loop cursor
+ */
+#define for_each_ep_desc(start, ep_desc) \
+ for (ep_desc = next_ep_desc(start); \
+ ep_desc; ep_desc = next_ep_desc(ep_desc+1))
+
+/**
+ * config_ep_by_speed() - configures the given endpoint
+ * according to gadget speed.
+ * @g: pointer to the gadget
+ * @f: usb function
+ * @_ep: the endpoint to configure
+ *
+ * Return: error code, 0 on success
+ *
+ * This function chooses the right descriptors for a given
+ * endpoint according to gadget speed and saves it in the
+ * endpoint desc field. If the endpoint already has a descriptor
+ * assigned to it - overwrites it with currently corresponding
+ * descriptor. The endpoint maxpacket field is updated according
+ * to the chosen descriptor.
+ * Note: the supplied function should hold all the descriptors
+ * for supported speeds
+ */
+int config_ep_by_speed(struct usb_gadget *g,
+ struct usb_function *f,
+ struct usb_ep *_ep)
+{
+ struct usb_endpoint_descriptor *chosen_desc = NULL;
+ struct usb_descriptor_header **speed_desc = NULL;
+
+ struct usb_descriptor_header **d_spd; /* cursor for speed desc */
+
+ if (!g || !f || !_ep)
+ return -EIO;
+
+ /* select desired speed */
+ switch (g->speed) {
+ case USB_SPEED_HIGH:
+ if (gadget_is_dualspeed(g)) {
+ speed_desc = f->hs_descriptors;
+ break;
+ }
+ /* else: fall through */
+ default:
+ speed_desc = f->descriptors;
+ }
+ /* find descriptors */
+ for_each_ep_desc(speed_desc, d_spd) {
+ chosen_desc = (struct usb_endpoint_descriptor *)*d_spd;
+ if (chosen_desc->bEndpointAddress == _ep->address)
+ goto ep_found;
+ }
+ return -EIO;
+
+ep_found:
+ /* commit results */
+ _ep->maxpacket = le16_to_cpu(chosen_desc->wMaxPacketSize);
+ _ep->desc = chosen_desc;
+
+ return 0;
+}
/**
* usb_add_function() - add a function to a configuration
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 9b7360f..0022d44 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -191,6 +191,7 @@ ep_matches (
size = 64;
desc->wMaxPacketSize = cpu_to_le16(size);
}
+ ep->address = desc->bEndpointAddress;
return 1;
}
diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h
index b78cba4..2014d6b 100644
--- a/include/linux/usb/composite.h
+++ b/include/linux/usb/composite.h
@@ -145,6 +145,9 @@ int usb_function_activate(struct usb_function *);
int usb_interface_id(struct usb_configuration *, struct usb_function *);
+int config_ep_by_speed(struct usb_gadget *g, struct usb_function *f,
+ struct usb_ep *_ep);
+
/**
* ep_choose - select descriptor endpoint at current device speed
* @g: gadget, connected and running at some speed
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 5c4c30c..8015ceb 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -132,6 +132,8 @@ struct usb_ep_ops {
* value can sometimes be reduced (hardware allowing), according to
* the endpoint descriptor used to configure the endpoint.
* @driver_data:for use by the gadget driver.
+ * @address: used to identify the endpoint when finding descriptor that
+ * matches connection speed
* @desc: endpoint descriptor. This pointer is set before the endpoint is
* enabled and remains valid until the endpoint is disabled.
*
@@ -146,6 +148,7 @@ struct usb_ep {
const struct usb_ep_ops *ops;
struct list_head ep_list;
unsigned maxpacket:16;
+ u8 address;
const struct usb_endpoint_descriptor *desc;
};
--
1.7.3.3
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next prev parent reply other threads:[~2011-05-23 6:41 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-23 6:41 [PATCH v12 0/8] usb gadget: Add SuperSpeed support to the Gadget Framework Tatyana Brokhman
[not found] ` <1306132882-9668-1-git-send-email-tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-23 6:41 ` [PATCH/RESEND v12 1/8] usb: Add usb_endpoint_descriptor to be part of the struct usb_ep Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
2011-05-23 6:41 ` [PATCH v12 4/8] usb:gadget: Add SuperSpeed support to the Gadget Framework Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
2011-05-23 12:31 ` Sebastian Andrzej Siewior
2011-05-23 22:18 ` Mike Frysinger
2011-05-24 5:10 ` Tanya Brokhman
2011-05-24 5:10 ` Tanya Brokhman
2011-05-24 5:14 ` Mike Frysinger
2011-05-24 5:37 ` Tanya Brokhman
2011-05-24 5:37 ` Tanya Brokhman
2011-05-24 17:12 ` Mike Frysinger
2011-05-23 6:41 ` Tatyana Brokhman [this message]
2011-05-23 6:41 ` [PATCH v12 2/8] usb: Configure endpoint according to gadget speed Tatyana Brokhman
2011-05-23 6:41 ` [PATCH/RESEND v12 3/8] usb: Modify existing gadget drivers to use config_ep_by_speed() instead of ep_choose Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
2011-05-23 6:41 ` [PATCH/RESEND v12 5/8] usb: Add streams support to the gadget framework Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
2011-05-23 6:41 ` [PATCH v12 6/8] usb:dummy_hcd: use the shared_hcd infrastructure Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
2011-05-23 6:41 ` [PATCH v12 7/8] usb: Adding SuperSpeed support to dummy_hcd Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
[not found] ` <1306132882-9668-8-git-send-email-tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-23 7:05 ` Felipe Balbi
2011-05-23 7:05 ` Felipe Balbi
2011-05-23 7:20 ` Tanya Brokhman
2011-05-23 7:20 ` Tanya Brokhman
2011-05-23 7:21 ` Felipe Balbi
2011-05-23 8:18 ` Tanya Brokhman
2011-05-23 8:18 ` Tanya Brokhman
2011-05-23 8:32 ` Felipe Balbi
2011-05-23 9:16 ` Tanya Brokhman
2011-05-23 9:16 ` Tanya Brokhman
2011-05-23 14:22 ` Alan Stern
2011-05-23 14:22 ` Alan Stern
2011-05-23 16:08 ` Sarah Sharp
2011-05-23 16:08 ` Sarah Sharp
2011-05-23 16:28 ` Alan Stern
2011-05-23 16:28 ` Alan Stern
2011-05-23 21:06 ` Felipe Balbi
2011-05-23 21:06 ` Felipe Balbi
[not found] ` <BD27AEAC-1E6D-480C-9E18-A970B992AD75-l0cyMroinI0@public.gmane.org>
2011-05-23 21:21 ` Alan Stern
2011-05-23 21:21 ` Alan Stern
2011-05-24 5:53 ` Tanya Brokhman
2011-05-24 5:53 ` Tanya Brokhman
2011-05-24 10:18 ` Felipe Balbi
2011-05-24 10:31 ` Tanya Brokhman
2011-05-24 10:31 ` Tanya Brokhman
2011-05-24 10:33 ` Felipe Balbi
2011-05-24 10:33 ` Felipe Balbi
2011-05-24 10:43 ` Tanya Brokhman
2011-05-24 10:43 ` Tanya Brokhman
2011-05-24 14:20 ` Alan Stern
2011-05-24 14:20 ` Alan Stern
2011-05-25 4:46 ` Tanya Brokhman
2011-05-25 4:46 ` Tanya Brokhman
2011-05-25 9:21 ` Felipe Balbi
[not found] ` <20110525092124.GI14556-UiBtZHVXSwEVvW8u9ZQWYwjfymiNCTlR@public.gmane.org>
2011-05-25 9:26 ` Tanya Brokhman
2011-05-25 9:26 ` Tanya Brokhman
2011-05-25 9:27 ` Felipe Balbi
2011-05-25 9:43 ` Tanya Brokhman
2011-05-25 9:43 ` Tanya Brokhman
2011-05-25 9:49 ` Felipe Balbi
2011-05-25 10:03 ` Tanya Brokhman
2011-05-25 10:03 ` Tanya Brokhman
2011-05-25 10:29 ` Felipe Balbi
2011-05-25 10:52 ` Tanya Brokhman
2011-05-25 10:52 ` Tanya Brokhman
2011-05-25 11:23 ` Felipe Balbi
2011-05-25 11:33 ` Tanya Brokhman
2011-05-25 11:33 ` Tanya Brokhman
2011-05-25 12:42 ` Felipe Balbi
2011-05-25 14:23 ` Alan Stern
2011-05-25 14:23 ` Alan Stern
2011-05-25 14:39 ` Alan Stern
2011-05-25 14:39 ` Alan Stern
2011-05-28 11:05 ` Tanya Brokhman
2011-05-28 11:05 ` Tanya Brokhman
2011-05-28 14:15 ` Alan Stern
2011-05-28 14:15 ` Alan Stern
2011-06-07 10:33 ` Felipe Balbi
2011-05-25 17:07 ` Brokhman Tatyana
2011-05-25 17:29 ` Alan Stern
2011-05-25 17:29 ` Alan Stern
[not found] ` <Pine.LNX.4.44L0.1105251316170.1987-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2011-05-25 18:13 ` Brokhman Tatyana
2011-05-25 18:13 ` Brokhman Tatyana
2011-05-25 18:59 ` Alan Stern
2011-05-25 18:59 ` Alan Stern
2011-05-26 6:51 ` Tanya Brokhman
2011-05-26 6:51 ` Tanya Brokhman
2011-05-26 14:31 ` Alan Stern
2011-05-26 14:31 ` Alan Stern
2011-05-26 16:15 ` Brokhman Tatyana
2011-05-25 9:20 ` Felipe Balbi
2011-05-23 15:55 ` Sarah Sharp
[not found] ` <20110523072142.GK3095-UiBtZHVXSwEVvW8u9ZQWYwjfymiNCTlR@public.gmane.org>
2011-05-23 14:20 ` Alan Stern
2011-05-23 14:20 ` Alan Stern
[not found] ` <20110523070556.GJ3095-UiBtZHVXSwEVvW8u9ZQWYwjfymiNCTlR@public.gmane.org>
2011-05-23 14:18 ` Alan Stern
2011-05-23 14:18 ` Alan Stern
2011-05-23 6:41 ` [PATCH v12 8/8] usb:gadget: coding style fixes Tatyana Brokhman
2011-05-23 6:41 ` Tatyana Brokhman
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=1306132882-9668-3-git-send-email-tlinder@codeaurora.org \
--to=tlinder@codeaurora.org \
--cc=ablay@codeaurora.org \
--cc=balbi@ti.com \
--cc=greg@kroah.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
/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.