/* * queue push/pop */ static void usbhsh_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) { struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt); struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); struct usb_hcd *hcd = usbhsh_hpriv_to_hcd(hpriv); struct urb *urb = ureq->urb; struct device *dev = usbhs_priv_to_dev(priv); int status = 0; dev_dbg(dev, "%s\n", __func__); if (!urb) { dev_warn(dev, "pkt doesn't have urb\n"); return; } if (!usbhsh_is_running(hpriv)) status = -ESHUTDOWN; urb->actual_length = pkt->actual; usbhsh_endpoint_sequence_save(hpriv, urb, pkt); usbhsh_ureq_free(hpriv, ureq); usbhsh_pipe_detach(hpriv, usbhsh_ep_to_uep(urb->ep)); usb_hcd_unlink_urb_from_ep(hcd, urb); usb_hcd_giveback_urb(hcd, urb, status); }
/* * DCP data stage */ static void usbhsh_data_stage_packet_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) { struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt); struct usbhsh_hpriv *hpriv = usbhsh_priv_to_hpriv(priv); /* this ureq was connected to urb when usbhsh_urb_enqueue() */ usbhsh_ureq_free(hpriv, ureq); }
/* * dma map functions */ static int usbhsh_dma_map_ctrl(struct usbhs_pkt *pkt, int map) { if (map) { struct usbhsh_request *ureq = usbhsh_pkt_to_ureq(pkt); struct urb *urb = ureq->urb; /* it can not use scatter/gather */ if (urb->num_sgs) return -EINVAL; pkt->dma = urb->transfer_dma; if (!pkt->dma) return -EINVAL; } return 0; }