Commit 47e97605 authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Greg Kroah-Hartman

USB: musb_gadget: implement set_wedge() method

Implement the driver's set_wedge() method by adding the 'wedged' flag
to the 'struct musb_ep'.
Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 196f1b7a
...@@ -966,6 +966,7 @@ static int musb_gadget_enable(struct usb_ep *ep, ...@@ -966,6 +966,7 @@ static int musb_gadget_enable(struct usb_ep *ep,
musb_ep->desc = desc; musb_ep->desc = desc;
musb_ep->busy = 0; musb_ep->busy = 0;
musb_ep->wedged = 0;
status = 0; status = 0;
pr_debug("%s periph: enabled %s for %s %s, %smaxpacket %d\n", pr_debug("%s periph: enabled %s for %s %s, %smaxpacket %d\n",
...@@ -1262,7 +1263,8 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) ...@@ -1262,7 +1263,8 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value)
goto done; goto done;
} }
} }
} } else
musb_ep->wedged = 0;
/* set/clear the stall and toggle bits */ /* set/clear the stall and toggle bits */
DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear"); DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear");
...@@ -1301,6 +1303,21 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) ...@@ -1301,6 +1303,21 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value)
return status; return status;
} }
/*
* Sets the halt feature with the clear requests ignored
*/
int musb_gadget_set_wedge(struct usb_ep *ep)
{
struct musb_ep *musb_ep = to_musb_ep(ep);
if (!ep)
return -EINVAL;
musb_ep->wedged = 1;
return usb_ep_set_halt(ep);
}
static int musb_gadget_fifo_status(struct usb_ep *ep) static int musb_gadget_fifo_status(struct usb_ep *ep)
{ {
struct musb_ep *musb_ep = to_musb_ep(ep); struct musb_ep *musb_ep = to_musb_ep(ep);
...@@ -1371,6 +1388,7 @@ static const struct usb_ep_ops musb_ep_ops = { ...@@ -1371,6 +1388,7 @@ static const struct usb_ep_ops musb_ep_ops = {
.queue = musb_gadget_queue, .queue = musb_gadget_queue,
.dequeue = musb_gadget_dequeue, .dequeue = musb_gadget_dequeue,
.set_halt = musb_gadget_set_halt, .set_halt = musb_gadget_set_halt,
.set_wedge = musb_gadget_set_wedge,
.fifo_status = musb_gadget_fifo_status, .fifo_status = musb_gadget_fifo_status,
.fifo_flush = musb_gadget_fifo_flush .fifo_flush = musb_gadget_fifo_flush
}; };
......
...@@ -75,6 +75,8 @@ struct musb_ep { ...@@ -75,6 +75,8 @@ struct musb_ep {
/* later things are modified based on usage */ /* later things are modified based on usage */
struct list_head req_list; struct list_head req_list;
u8 wedged;
/* true if lock must be dropped but req_list may not be advanced */ /* true if lock must be dropped but req_list may not be advanced */
u8 busy; u8 busy;
}; };
......
...@@ -273,6 +273,11 @@ __acquires(musb->lock) ...@@ -273,6 +273,11 @@ __acquires(musb->lock)
if (!musb_ep->desc) if (!musb_ep->desc)
break; break;
handled = 1;
/* Ignore request if endpoint is wedged */
if (musb_ep->wedged)
break;
/* REVISIT do it directly, no locking games */ /* REVISIT do it directly, no locking games */
spin_unlock(&musb->lock); spin_unlock(&musb->lock);
musb_gadget_set_halt(&musb_ep->end_point, 0); musb_gadget_set_halt(&musb_ep->end_point, 0);
...@@ -280,7 +285,6 @@ __acquires(musb->lock) ...@@ -280,7 +285,6 @@ __acquires(musb->lock)
/* select ep0 again */ /* select ep0 again */
musb_ep_select(mbase, 0); musb_ep_select(mbase, 0);
handled = 1;
} break; } break;
default: default:
/* class, vendor, etc ... delegate */ /* class, vendor, etc ... delegate */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment