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: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
196f1b7a38
commit
47e9760529
@@ -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)
|
|||||||
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 @@ done:
|
|||||||
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 = {
|
|||||||
.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 {
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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 */
|
||||||
|
Reference in New Issue
Block a user