|
@@ -1040,6 +1040,7 @@ net2280_queue (struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
|
|
|
|
|
|
} /* else the irq handler advances the queue. */
|
|
} /* else the irq handler advances the queue. */
|
|
|
|
|
|
|
|
+ ep->responded = 1;
|
|
if (req)
|
|
if (req)
|
|
list_add_tail (&req->queue, &ep->queue);
|
|
list_add_tail (&req->queue, &ep->queue);
|
|
done:
|
|
done:
|
|
@@ -2188,7 +2189,8 @@ static void handle_ep_small (struct net2280_ep *ep)
|
|
ep->stopped = 1;
|
|
ep->stopped = 1;
|
|
set_halt (ep);
|
|
set_halt (ep);
|
|
mode = 2;
|
|
mode = 2;
|
|
- } else if (!req && !ep->stopped)
|
|
|
|
|
|
+ } else if (ep->responded &&
|
|
|
|
+ !req && !ep->stopped)
|
|
write_fifo (ep, NULL);
|
|
write_fifo (ep, NULL);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
@@ -2203,7 +2205,7 @@ static void handle_ep_small (struct net2280_ep *ep)
|
|
} else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT))
|
|
} else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT))
|
|
&& req
|
|
&& req
|
|
&& req->req.actual == req->req.length)
|
|
&& req->req.actual == req->req.length)
|
|
- || !req) {
|
|
|
|
|
|
+ || (ep->responded && !req)) {
|
|
ep->dev->protocol_stall = 1;
|
|
ep->dev->protocol_stall = 1;
|
|
set_halt (ep);
|
|
set_halt (ep);
|
|
ep->stopped = 1;
|
|
ep->stopped = 1;
|
|
@@ -2469,6 +2471,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat)
|
|
/* we made the hardware handle most lowlevel requests;
|
|
/* we made the hardware handle most lowlevel requests;
|
|
* everything else goes uplevel to the gadget code.
|
|
* everything else goes uplevel to the gadget code.
|
|
*/
|
|
*/
|
|
|
|
+ ep->responded = 1;
|
|
switch (u.r.bRequest) {
|
|
switch (u.r.bRequest) {
|
|
case USB_REQ_GET_STATUS: {
|
|
case USB_REQ_GET_STATUS: {
|
|
struct net2280_ep *e;
|
|
struct net2280_ep *e;
|
|
@@ -2537,6 +2540,7 @@ delegate:
|
|
u.r.bRequestType, u.r.bRequest,
|
|
u.r.bRequestType, u.r.bRequest,
|
|
w_value, w_index, w_length,
|
|
w_value, w_index, w_length,
|
|
readl (&ep->regs->ep_cfg));
|
|
readl (&ep->regs->ep_cfg));
|
|
|
|
+ ep->responded = 0;
|
|
spin_unlock (&dev->lock);
|
|
spin_unlock (&dev->lock);
|
|
tmp = dev->driver->setup (&dev->gadget, &u.r);
|
|
tmp = dev->driver->setup (&dev->gadget, &u.r);
|
|
spin_lock (&dev->lock);
|
|
spin_lock (&dev->lock);
|