@@ -71,12 +71,28 @@ struct ffs_function {
struct ffs_data *ffs;
struct ffs_ep *eps;
- u8 eps_revmap[16];
+ u8 eps_revmap[31];
short *interfaces_nums;
struct usb_function function;
};
+/*
+ * index 0 for control ep
+ * For same-address, opposite-direction endpoints, each address
+ * corresponds to two indices, distinguished by dir.
+ * index 1 for 1out
+ * index 2 for 1in
+ * ...
+ */
+static int ffs_ep_revmap_index(u8 epaddr)
+{
+ if (!(epaddr & USB_ENDPOINT_NUMBER_MASK))
+ return 0;
+
+ return ((epaddr & USB_ENDPOINT_NUMBER_MASK) * 2) +
+ (epaddr & USB_DIR_IN ? 1 : 0) - 1;
+}
static struct ffs_function *ffs_func_from_usb(struct usb_function *f)
{
@@ -2820,6 +2836,7 @@ static int __ffs_func_bind_do_descs(enum ffs_entity_type type, u8 *valuep,
struct usb_ep *ep;
u8 bEndpointAddress;
u16 wMaxPacketSize;
+ int revmap_idx;
/*
* We back up bEndpointAddress because autoconfig overwrites
@@ -2843,8 +2860,8 @@ static int __ffs_func_bind_do_descs(enum ffs_entity_type type, u8 *valuep,
ffs_ep->ep = ep;
ffs_ep->req = req;
- func->eps_revmap[ds->bEndpointAddress &
- USB_ENDPOINT_NUMBER_MASK] = idx + 1;
+ revmap_idx = ffs_ep_revmap_index(ds->bEndpointAddress);
+ func->eps_revmap[revmap_idx] = idx + 1;
/*
* If we use virtual address mapping, we restore
* original bEndpointAddress value.
@@ -3371,7 +3388,7 @@ static void ffs_func_resume(struct usb_function *f)
static int ffs_func_revmap_ep(struct ffs_function *func, u8 num)
{
- num = func->eps_revmap[num & USB_ENDPOINT_NUMBER_MASK];
+ num = func->eps_revmap[ffs_ep_revmap_index(num)];
return num ? num : -EDOM;
}
Commit 41dc9ac163e7 ("usb: gadget: f_fs: Accept up to 30 endpoints.") increase eps_addrmap length to 31, eps_revmap also need to increase. Increase it's length to 31. For same-address, opposite-direction endpoints, will use same idx in eps_revmap, use ffs_ep_revmap_index to calculate idx for endpoints. Signed-off-by: Jiazi Li <jiazi.li@transsion.com> --- Changes in v2: - increase eps_revmap length to 31 - use inline function to calculate index, and add comments --- drivers/usb/gadget/function/f_fs.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)