Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 115749
b: refs/heads/master
c: 2121427
h: refs/heads/master
i:
  115747: e769d72
v: v3
  • Loading branch information
David Brownell authored and Greg Kroah-Hartman committed Oct 17, 2008
1 parent 1e57262 commit b41cd2d
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3086775a4916b0fe128d924d83f4e7d7c39e4d0e
refs/heads/master: 2121427836c9eeaed3002e1add89f1e8c7a00261
61 changes: 54 additions & 7 deletions trunk/drivers/usb/gadget/f_obex.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,8 @@
* This CDC OBEX function support just packages a TTY-ish byte stream.
* A user mode server will put it into "raw" mode and handle all the
* relevant protocol details ... this is just a kernel passthrough.
*
* REVISIT this driver shouldn't actually activate before that user mode
* server is ready to respond! When the "serial gadget" utility code
* adds open/close notifications, this driver should use them with new
* (TBS) composite gadget hooks that wrap usb_gadget_disconnect() and
* usb_gadget_connect() calls with refcounts ... disconnect() when we
* bind, then connect() when the user server code is ready to respond.
* When possible, we prevent gadget enumeration until that server is
* ready to handle the commands.
*/

struct obex_ep_descs {
Expand All @@ -54,6 +49,7 @@ struct f_obex {
u8 ctrl_id;
u8 data_id;
u8 port_num;
u8 can_activate;

struct obex_ep_descs fs;
struct obex_ep_descs hs;
Expand All @@ -64,6 +60,11 @@ static inline struct f_obex *func_to_obex(struct usb_function *f)
return container_of(f, struct f_obex, port.func);
}

static inline struct f_obex *port_to_obex(struct gserial *p)
{
return container_of(p, struct f_obex, port);
}

/*-------------------------------------------------------------------------*/

#define OBEX_CTRL_IDX 0
Expand Down Expand Up @@ -269,6 +270,38 @@ static void obex_disable(struct usb_function *f)

/*-------------------------------------------------------------------------*/

static void obex_connect(struct gserial *g)
{
struct f_obex *obex = port_to_obex(g);
struct usb_composite_dev *cdev = g->func.config->cdev;
int status;

if (!obex->can_activate)
return;

status = usb_function_activate(&g->func);
if (status)
DBG(cdev, "obex ttyGS%d function activate --> %d\n",
obex->port_num, status);
}

static void obex_disconnect(struct gserial *g)
{
struct f_obex *obex = port_to_obex(g);
struct usb_composite_dev *cdev = g->func.config->cdev;
int status;

if (!obex->can_activate)
return;

status = usb_function_deactivate(&g->func);
if (status)
DBG(cdev, "obex ttyGS%d function deactivate --> %d\n",
obex->port_num, status);
}

/*-------------------------------------------------------------------------*/

static int __init
obex_bind(struct usb_configuration *c, struct usb_function *f)
{
Expand Down Expand Up @@ -338,6 +371,17 @@ obex_bind(struct usb_configuration *c, struct usb_function *f)
f->descriptors, &obex_hs_ep_out_desc);
}

/* Avoid letting this gadget enumerate until the userspace
* OBEX server is active.
*/
status = usb_function_deactivate(f);
if (status < 0)
WARNING(cdev, "obex ttyGS%d: can't prevent enumeration, %d\n",
obex->port_num, status);
else
obex->can_activate = true;


DBG(cdev, "obex ttyGS%d: %s speed IN/%s OUT/%s\n",
obex->port_num,
gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
Expand Down Expand Up @@ -426,6 +470,9 @@ int __init obex_bind_config(struct usb_configuration *c, u8 port_num)

obex->port_num = port_num;

obex->port.connect = obex_connect;
obex->port.disconnect = obex_disconnect;

obex->port.func.name = "obex";
obex->port.func.strings = obex_strings;
/* descriptors are per-instance copies */
Expand Down

0 comments on commit b41cd2d

Please sign in to comment.