Lines Matching refs:ep
30 int ast_vhub_reply(struct ast_vhub_ep *ep, char *ptr, int len) in ast_vhub_reply() argument
32 struct usb_request *req = &ep->ep0.req.req; in ast_vhub_reply()
35 if (WARN_ON(ep->d_idx != 0)) in ast_vhub_reply()
37 if (WARN_ON(!ep->ep0.dir_in)) in ast_vhub_reply()
54 spin_unlock(&ep->vhub->lock); in ast_vhub_reply()
55 if (ep->ep.ops->queue(&ep->ep, req, GFP_ATOMIC)) in ast_vhub_reply()
59 spin_lock(&ep->vhub->lock); in ast_vhub_reply()
63 int __ast_vhub_simple_reply(struct ast_vhub_ep *ep, int len, ...) in __ast_vhub_simple_reply() argument
65 u8 *buffer = ep->buf; in __ast_vhub_simple_reply()
77 return ast_vhub_reply(ep, NULL, len); in __ast_vhub_simple_reply()
80 void ast_vhub_ep0_handle_setup(struct ast_vhub_ep *ep) in ast_vhub_ep0_handle_setup() argument
86 if (WARN_ON(ep->d_idx != 0)) in ast_vhub_ep0_handle_setup()
93 memcpy_fromio(&crq, ep->ep0.setup, sizeof(crq)); in ast_vhub_ep0_handle_setup()
95 EPDBG(ep, "SETUP packet %02x/%02x/%04x/%04x/%04x [%s] st=%d\n", in ast_vhub_ep0_handle_setup()
101 ep->ep0.state); in ast_vhub_ep0_handle_setup()
113 if (ep->ep0.state != ep0_state_token && in ast_vhub_ep0_handle_setup()
114 ep->ep0.state != ep0_state_stall) { in ast_vhub_ep0_handle_setup()
115 EPDBG(ep, "wrong state\n"); in ast_vhub_ep0_handle_setup()
116 ast_vhub_nuke(ep, -EIO); in ast_vhub_ep0_handle_setup()
120 ep->ep0.state = ep0_state_data; in ast_vhub_ep0_handle_setup()
121 ep->ep0.dir_in = !!(crq.bRequestType & USB_DIR_IN); in ast_vhub_ep0_handle_setup()
125 if (ep->dev == NULL) { in ast_vhub_ep0_handle_setup()
127 std_req_rc = ast_vhub_std_hub_request(ep, &crq); in ast_vhub_ep0_handle_setup()
129 std_req_rc = ast_vhub_class_hub_request(ep, &crq); in ast_vhub_ep0_handle_setup()
133 std_req_rc = ast_vhub_std_dev_request(ep, &crq); in ast_vhub_ep0_handle_setup()
148 if (WARN_ON(!ep->dev)) in ast_vhub_ep0_handle_setup()
150 if (ep->dev->driver) { in ast_vhub_ep0_handle_setup()
151 EPDBG(ep, "forwarding to gadget...\n"); in ast_vhub_ep0_handle_setup()
152 spin_unlock(&ep->vhub->lock); in ast_vhub_ep0_handle_setup()
153 rc = ep->dev->driver->setup(&ep->dev->gadget, &crq); in ast_vhub_ep0_handle_setup()
154 spin_lock(&ep->vhub->lock); in ast_vhub_ep0_handle_setup()
155 EPDBG(ep, "driver returned %d\n", rc); in ast_vhub_ep0_handle_setup()
157 EPDBG(ep, "no gadget for request !\n"); in ast_vhub_ep0_handle_setup()
163 EPDBG(ep, "stalling\n"); in ast_vhub_ep0_handle_setup()
164 writel(VHUB_EP0_CTRL_STALL, ep->ep0.ctlstat); in ast_vhub_ep0_handle_setup()
165 ep->ep0.state = ep0_state_stall; in ast_vhub_ep0_handle_setup()
166 ep->ep0.dir_in = false; in ast_vhub_ep0_handle_setup()
170 EPVDBG(ep, "sending [in] status with no data\n"); in ast_vhub_ep0_handle_setup()
171 writel(VHUB_EP0_TX_BUFF_RDY, ep->ep0.ctlstat); in ast_vhub_ep0_handle_setup()
172 ep->ep0.state = ep0_state_status; in ast_vhub_ep0_handle_setup()
173 ep->ep0.dir_in = false; in ast_vhub_ep0_handle_setup()
177 static void ast_vhub_ep0_do_send(struct ast_vhub_ep *ep, in ast_vhub_ep0_do_send() argument
191 EPVDBG(ep, "complete send %d/%d\n", in ast_vhub_ep0_do_send()
193 ep->ep0.state = ep0_state_status; in ast_vhub_ep0_do_send()
194 writel(VHUB_EP0_RX_BUFF_RDY, ep->ep0.ctlstat); in ast_vhub_ep0_do_send()
195 ast_vhub_done(ep, req, 0); in ast_vhub_ep0_do_send()
204 if (chunk > ep->ep.maxpacket) in ast_vhub_ep0_do_send()
205 chunk = ep->ep.maxpacket; in ast_vhub_ep0_do_send()
206 else if ((chunk < ep->ep.maxpacket) || !req->req.zero) in ast_vhub_ep0_do_send()
209 EPVDBG(ep, "send chunk=%d last=%d, req->act=%d mp=%d\n", in ast_vhub_ep0_do_send()
210 chunk, req->last_desc, req->req.actual, ep->ep.maxpacket); in ast_vhub_ep0_do_send()
217 memcpy(ep->buf, req->req.buf + req->req.actual, chunk); in ast_vhub_ep0_do_send()
219 vhub_dma_workaround(ep->buf); in ast_vhub_ep0_do_send()
223 writel(reg, ep->ep0.ctlstat); in ast_vhub_ep0_do_send()
224 writel(reg | VHUB_EP0_TX_BUFF_RDY, ep->ep0.ctlstat); in ast_vhub_ep0_do_send()
228 static void ast_vhub_ep0_rx_prime(struct ast_vhub_ep *ep) in ast_vhub_ep0_rx_prime() argument
230 EPVDBG(ep, "rx prime\n"); in ast_vhub_ep0_rx_prime()
233 writel(VHUB_EP0_RX_BUFF_RDY, ep->ep0.ctlstat); in ast_vhub_ep0_rx_prime()
236 static void ast_vhub_ep0_do_receive(struct ast_vhub_ep *ep, struct ast_vhub_req *req, in ast_vhub_ep0_do_receive() argument
245 EPVDBG(ep, "receive got=%d remain=%d\n", len, remain); in ast_vhub_ep0_do_receive()
249 EPDBG(ep, "receiving too much (ovf: %d) !\n", in ast_vhub_ep0_do_receive()
255 memcpy(req->req.buf + req->req.actual, ep->buf, len); in ast_vhub_ep0_do_receive()
259 if (len < ep->ep.maxpacket || len == remain) { in ast_vhub_ep0_do_receive()
260 ep->ep0.state = ep0_state_status; in ast_vhub_ep0_do_receive()
261 writel(VHUB_EP0_TX_BUFF_RDY, ep->ep0.ctlstat); in ast_vhub_ep0_do_receive()
262 ast_vhub_done(ep, req, rc); in ast_vhub_ep0_do_receive()
264 ast_vhub_ep0_rx_prime(ep); in ast_vhub_ep0_do_receive()
267 void ast_vhub_ep0_handle_ack(struct ast_vhub_ep *ep, bool in_ack) in ast_vhub_ep0_handle_ack() argument
270 struct ast_vhub *vhub = ep->vhub; in ast_vhub_ep0_handle_ack()
276 stat = readl(ep->ep0.ctlstat); in ast_vhub_ep0_handle_ack()
279 req = list_first_entry_or_null(&ep->queue, struct ast_vhub_req, queue); in ast_vhub_ep0_handle_ack()
281 EPVDBG(ep, "ACK status=%08x,state=%d is_in=%d in_ack=%d req=%p\n", in ast_vhub_ep0_handle_ack()
282 stat, ep->ep0.state, ep->ep0.dir_in, in_ack, req); in ast_vhub_ep0_handle_ack()
284 switch(ep->ep0.state) { in ast_vhub_ep0_handle_ack()
289 ast_vhub_nuke(ep, -EINVAL); in ast_vhub_ep0_handle_ack()
296 if ((ep->ep0.dir_in && (stat & VHUB_EP0_TX_BUFF_RDY)) || in ast_vhub_ep0_handle_ack()
297 (!ep->ep0.dir_in && (stat & VHUB_EP0_RX_BUFF_RDY)) || in ast_vhub_ep0_handle_ack()
298 (ep->ep0.dir_in != in_ack)) { in ast_vhub_ep0_handle_ack()
314 if (ep->ep0.dir_in) in ast_vhub_ep0_handle_ack()
315 ast_vhub_ep0_do_send(ep, req); in ast_vhub_ep0_handle_ack()
317 ast_vhub_ep0_do_receive(ep, req, VHUB_EP0_RX_LEN(stat)); in ast_vhub_ep0_handle_ack()
323 ast_vhub_nuke(ep, -EINVAL); in ast_vhub_ep0_handle_ack()
331 if (ep->ep0.dir_in == in_ack) { in ast_vhub_ep0_handle_ack()
341 ast_vhub_nuke(ep, -EIO); in ast_vhub_ep0_handle_ack()
347 writel(VHUB_EP0_CTRL_STALL, ep->ep0.ctlstat); in ast_vhub_ep0_handle_ack()
348 ep->ep0.state = ep0_state_stall; in ast_vhub_ep0_handle_ack()
350 ep->ep0.state = ep0_state_token; in ast_vhub_ep0_handle_ack()
357 struct ast_vhub_ep *ep = to_ast_ep(u_ep); in ast_vhub_ep0_queue() local
358 struct ast_vhub *vhub = ep->vhub; in ast_vhub_ep0_queue()
373 if (WARN_ON(ep->d_idx != 0)) in ast_vhub_ep0_queue()
377 if (ep->dev && !ep->dev->enabled) in ast_vhub_ep0_queue()
386 EPVDBG(ep, "enqueue req @%p\n", req); in ast_vhub_ep0_queue()
387 EPVDBG(ep, " l=%d zero=%d noshort=%d is_in=%d\n", in ast_vhub_ep0_queue()
389 u_req->short_not_ok, ep->ep0.dir_in); in ast_vhub_ep0_queue()
400 if (!list_empty(&ep->queue) || in ast_vhub_ep0_queue()
401 ep->ep0.state == ep0_state_token || in ast_vhub_ep0_queue()
402 ep->ep0.state == ep0_state_stall) { in ast_vhub_ep0_queue()
404 EPVDBG(ep, "EP0: list_empty=%d state=%d\n", in ast_vhub_ep0_queue()
405 list_empty(&ep->queue), ep->ep0.state); in ast_vhub_ep0_queue()
411 list_add_tail(&req->queue, &ep->queue); in ast_vhub_ep0_queue()
413 if (ep->ep0.dir_in) { in ast_vhub_ep0_queue()
415 ast_vhub_ep0_do_send(ep, req); in ast_vhub_ep0_queue()
418 EPVDBG(ep, "0-length rx completion\n"); in ast_vhub_ep0_queue()
419 ep->ep0.state = ep0_state_status; in ast_vhub_ep0_queue()
420 writel(VHUB_EP0_TX_BUFF_RDY, ep->ep0.ctlstat); in ast_vhub_ep0_queue()
421 ast_vhub_done(ep, req, 0); in ast_vhub_ep0_queue()
424 ast_vhub_ep0_rx_prime(ep); in ast_vhub_ep0_queue()
434 struct ast_vhub_ep *ep = to_ast_ep(u_ep); in ast_vhub_ep0_dequeue() local
435 struct ast_vhub *vhub = ep->vhub; in ast_vhub_ep0_dequeue()
443 req = list_first_entry_or_null(&ep->queue, struct ast_vhub_req, queue); in ast_vhub_ep0_dequeue()
447 EPVDBG(ep, "dequeue req @%p\n", req); in ast_vhub_ep0_dequeue()
453 ast_vhub_done(ep, req, -ECONNRESET); in ast_vhub_ep0_dequeue()
456 writel(VHUB_EP0_CTRL_STALL, ep->ep0.ctlstat); in ast_vhub_ep0_dequeue()
457 ep->ep0.state = ep0_state_status; in ast_vhub_ep0_dequeue()
458 ep->ep0.dir_in = false; in ast_vhub_ep0_dequeue()
475 struct ast_vhub_ep *ep = &dev->ep0; in ast_vhub_reset_ep0() local
477 ast_vhub_nuke(ep, -EIO); in ast_vhub_reset_ep0()
478 ep->ep0.state = ep0_state_token; in ast_vhub_reset_ep0()
482 void ast_vhub_init_ep0(struct ast_vhub *vhub, struct ast_vhub_ep *ep, in ast_vhub_init_ep0() argument
485 memset(ep, 0, sizeof(*ep)); in ast_vhub_init_ep0()
487 INIT_LIST_HEAD(&ep->ep.ep_list); in ast_vhub_init_ep0()
488 INIT_LIST_HEAD(&ep->queue); in ast_vhub_init_ep0()
489 ep->ep.ops = &ast_vhub_ep0_ops; in ast_vhub_init_ep0()
490 ep->ep.name = "ep0"; in ast_vhub_init_ep0()
491 ep->ep.caps.type_control = true; in ast_vhub_init_ep0()
492 usb_ep_set_maxpacket_limit(&ep->ep, AST_VHUB_EP0_MAX_PACKET); in ast_vhub_init_ep0()
493 ep->d_idx = 0; in ast_vhub_init_ep0()
494 ep->dev = dev; in ast_vhub_init_ep0()
495 ep->vhub = vhub; in ast_vhub_init_ep0()
496 ep->ep0.state = ep0_state_token; in ast_vhub_init_ep0()
497 INIT_LIST_HEAD(&ep->ep0.req.queue); in ast_vhub_init_ep0()
498 ep->ep0.req.internal = true; in ast_vhub_init_ep0()
502 ep->ep0.ctlstat = dev->regs + AST_VHUB_DEV_EP0_CTRL; in ast_vhub_init_ep0()
503 ep->ep0.setup = vhub->regs + in ast_vhub_init_ep0()
505 ep->buf = vhub->ep0_bufs + in ast_vhub_init_ep0()
507 ep->buf_dma = vhub->ep0_bufs_dma + in ast_vhub_init_ep0()
510 ep->ep0.ctlstat = vhub->regs + AST_VHUB_EP0_CTRL; in ast_vhub_init_ep0()
511 ep->ep0.setup = vhub->regs + AST_VHUB_SETUP0; in ast_vhub_init_ep0()
512 ep->buf = vhub->ep0_bufs; in ast_vhub_init_ep0()
513 ep->buf_dma = vhub->ep0_bufs_dma; in ast_vhub_init_ep0()