static int usbhsg_irq_ready(struct usbhs_priv *priv, struct usbhs_irq_state *irq_state) { struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); struct usbhsg_uep *uep; struct usbhs_pipe *pipe; struct device *dev = usbhsg_gpriv_to_dev(gpriv); int i, ret; if (!irq_state->brdysts) { dev_err(dev, "debug %s !!\n", __func__); return -EIO; } dev_dbg(dev, "irq ready [0x%04x]\n", irq_state->brdysts); /* * search interrupted "pipe" * not "uep". */ usbhs_for_each_pipe_with_dcp(pipe, priv, i) { if (!(irq_state->brdysts & (1 << i))) continue; uep = usbhsg_pipe_to_uep(pipe); ret = usbhsg_queue_handle(uep); if (ret < 0) dev_err(dev, "receive error %d : %d\n", i, ret); } return 0; }
/* * dma map/unmap */ static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map) { struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); struct usb_request *req = &ureq->req; struct usbhs_pipe *pipe = pkt->pipe; struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); enum dma_data_direction dir; int ret = 0; dir = usbhs_pipe_is_dir_host(pipe); if (map) { /* it can not use scatter/gather */ WARN_ON(req->num_sgs); ret = usb_gadget_map_request(&gpriv->gadget, req, dir); if (ret < 0) return ret; pkt->dma = req->dma; } else { usb_gadget_unmap_request(&gpriv->gadget, req, dir); } return ret; }
static void usbhsg_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) { struct usbhs_pipe *pipe = pkt->pipe; struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); ureq->req.actual = pkt->actual; usbhsg_queue_pop(uep, ureq, 0); }
static void usbhsg_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) { struct usbhs_pipe *pipe = pkt->pipe; struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); unsigned long flags; ureq->req.actual = pkt->actual; usbhs_lock(priv, flags); if (uep) __usbhsg_queue_pop(uep, ureq, 0); usbhs_unlock(priv, flags); }
static int usbhsg_dma_map_ctrl(struct usbhs_pkt *pkt, int map) { struct usbhs_pipe *pipe = pkt->pipe; struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); struct usbhsg_gpriv *gpriv = usbhsg_uep_to_gpriv(uep); struct device *dev = usbhsg_gpriv_to_dev(gpriv); enum dma_data_direction dir; dir = usbhs_pipe_is_dir_in(pipe) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; if (map) return usbhsg_dma_map(dev, pkt, dir); else return usbhsg_dma_unmap(dev, pkt, dir); }