Lines Matching refs:ctx

287 static void ezusb_ctx_complete(struct request_context *ctx);
299 static void ezusb_request_context_put(struct request_context *ctx) in ezusb_request_context_put() argument
301 if (!atomic_dec_and_test(&ctx->refcount)) in ezusb_request_context_put()
304 WARN_ON(!ctx->done.done); in ezusb_request_context_put()
305 BUG_ON(ctx->outurb->status == -EINPROGRESS); in ezusb_request_context_put()
306 BUG_ON(timer_pending(&ctx->timer)); in ezusb_request_context_put()
307 usb_free_urb(ctx->outurb); in ezusb_request_context_put()
308 kfree(ctx->buf); in ezusb_request_context_put()
309 kfree(ctx); in ezusb_request_context_put()
323 struct request_context *ctx = (void *) _ctx; in ezusb_request_timerfn() local
325 ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK; in ezusb_request_timerfn()
326 if (usb_unlink_urb(ctx->outurb) == -EINPROGRESS) { in ezusb_request_timerfn()
327 ctx->state = EZUSB_CTX_REQ_TIMEOUT; in ezusb_request_timerfn()
329 ctx->state = EZUSB_CTX_RESP_TIMEOUT; in ezusb_request_timerfn()
330 dev_dbg(&ctx->outurb->dev->dev, "couldn't unlink\n"); in ezusb_request_timerfn()
331 atomic_inc(&ctx->refcount); in ezusb_request_timerfn()
332 ctx->killed = 1; in ezusb_request_timerfn()
333 ezusb_ctx_complete(ctx); in ezusb_request_timerfn()
334 ezusb_request_context_put(ctx); in ezusb_request_timerfn()
341 struct request_context *ctx; in ezusb_alloc_ctx() local
343 ctx = kzalloc(sizeof(*ctx), GFP_ATOMIC); in ezusb_alloc_ctx()
344 if (!ctx) in ezusb_alloc_ctx()
347 ctx->buf = kmalloc(BULK_BUF_SIZE, GFP_ATOMIC); in ezusb_alloc_ctx()
348 if (!ctx->buf) { in ezusb_alloc_ctx()
349 kfree(ctx); in ezusb_alloc_ctx()
352 ctx->outurb = usb_alloc_urb(0, GFP_ATOMIC); in ezusb_alloc_ctx()
353 if (!ctx->outurb) { in ezusb_alloc_ctx()
354 kfree(ctx->buf); in ezusb_alloc_ctx()
355 kfree(ctx); in ezusb_alloc_ctx()
359 ctx->upriv = upriv; in ezusb_alloc_ctx()
360 ctx->state = EZUSB_CTX_START; in ezusb_alloc_ctx()
361 ctx->out_rid = out_rid; in ezusb_alloc_ctx()
362 ctx->in_rid = in_rid; in ezusb_alloc_ctx()
364 atomic_set(&ctx->refcount, 1); in ezusb_alloc_ctx()
365 init_completion(&ctx->done); in ezusb_alloc_ctx()
367 setup_timer(&ctx->timer, ezusb_request_timerfn, (u_long)ctx); in ezusb_alloc_ctx()
368 return ctx; in ezusb_alloc_ctx()
382 static void ezusb_ctx_complete(struct request_context *ctx) in ezusb_ctx_complete() argument
384 struct ezusb_priv *upriv = ctx->upriv; in ezusb_ctx_complete()
389 list_del_init(&ctx->list); in ezusb_ctx_complete()
396 switch (ctx->state) { in ezusb_ctx_complete()
404 if ((ctx->out_rid == EZUSB_RID_TX) && upriv->dev) { in ezusb_ctx_complete()
409 if (ctx->state != EZUSB_CTX_COMPLETE) in ezusb_ctx_complete()
416 ezusb_complete_all(&ctx->done); in ezusb_ctx_complete()
417 ezusb_request_context_put(ctx); in ezusb_ctx_complete()
426 ezusb_complete_all(&ctx->done); in ezusb_ctx_complete()
427 ezusb_request_context_put(ctx); in ezusb_ctx_complete()
451 struct request_context *ctx; in ezusb_req_queue_run() local
462 ctx = in ezusb_req_queue_run()
466 if (!ctx->upriv->udev) in ezusb_req_queue_run()
470 list_move_tail(&ctx->list, &upriv->req_active); in ezusb_req_queue_run()
472 if (ctx->state == EZUSB_CTX_QUEUED) { in ezusb_req_queue_run()
473 atomic_inc(&ctx->refcount); in ezusb_req_queue_run()
474 result = usb_submit_urb(ctx->outurb, GFP_ATOMIC); in ezusb_req_queue_run()
476 ctx->state = EZUSB_CTX_REQSUBMIT_FAIL; in ezusb_req_queue_run()
483 ezusb_ctx_complete(ctx); in ezusb_req_queue_run()
484 ezusb_request_context_put(ctx); in ezusb_req_queue_run()
488 ctx->state = EZUSB_CTX_REQ_SUBMITTED; in ezusb_req_queue_run()
489 ezusb_mod_timer(ctx->upriv, &ctx->timer, in ezusb_req_queue_run()
501 struct request_context *ctx) in ezusb_req_enqueue_run() argument
507 if (!ctx->upriv->udev) { in ezusb_req_enqueue_run()
511 atomic_inc(&ctx->refcount); in ezusb_req_enqueue_run()
512 list_add_tail(&ctx->list, &upriv->req_pending); in ezusb_req_enqueue_run()
515 ctx->state = EZUSB_CTX_QUEUED; in ezusb_req_enqueue_run()
526 struct request_context *ctx = urb->context; in ezusb_request_out_callback() local
527 struct ezusb_priv *upriv = ctx->upriv; in ezusb_request_out_callback()
531 del_timer(&ctx->timer); in ezusb_request_out_callback()
533 if (ctx->killed) { in ezusb_request_out_callback()
539 state = ctx->state; in ezusb_request_out_callback()
544 if (ctx->in_rid) { in ezusb_request_out_callback()
545 ctx->state = EZUSB_CTX_REQ_COMPLETE; in ezusb_request_out_callback()
547 ezusb_mod_timer(upriv, &ctx->timer, in ezusb_request_out_callback()
556 ctx->state = EZUSB_CTX_COMPLETE; in ezusb_request_out_callback()
558 ezusb_ctx_complete(ctx); in ezusb_request_out_callback()
574 ctx->state = EZUSB_CTX_REQ_FAILED; in ezusb_request_out_callback()
581 ezusb_ctx_complete(ctx); in ezusb_request_out_callback()
593 ezusb_request_context_put(ctx); in ezusb_request_out_callback()
600 struct request_context *ctx = NULL; in ezusb_request_in_callback() local
618 ctx = c; in ezusb_request_in_callback()
627 if (ctx == NULL) { in ezusb_request_in_callback()
636 urb->transfer_buffer = ctx->buf; in ezusb_request_in_callback()
637 ctx->buf = (void *) ans; in ezusb_request_in_callback()
638 ctx->buf_length = urb->actual_length; in ezusb_request_in_callback()
640 state = ctx->state; in ezusb_request_in_callback()
648 ctx->state = EZUSB_CTX_RESP_RECEIVED; in ezusb_request_in_callback()
659 ctx->state = EZUSB_CTX_COMPLETE; in ezusb_request_in_callback()
662 del_timer(&ctx->timer); in ezusb_request_in_callback()
666 ezusb_ctx_complete(ctx); in ezusb_request_in_callback()
675 del_timer(&ctx->timer); in ezusb_request_in_callback()
676 ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK; in ezusb_request_in_callback()
677 usb_unlink_urb(ctx->outurb); in ezusb_request_in_callback()
685 struct request_context *ctx) in ezusb_req_ctx_wait() argument
687 switch (ctx->state) { in ezusb_req_ctx_wait()
697 while (!ctx->done.done && msecs--) in ezusb_req_ctx_wait()
700 wait_event_interruptible(ctx->done.wait, in ezusb_req_ctx_wait()
701 ctx->done.done); in ezusb_req_ctx_wait()
856 struct request_context *ctx, in ezusb_access_ltv() argument
876 req_size = ezusb_fill_req(ctx->buf, length, ctx->out_rid, data, in ezusb_access_ltv()
878 usb_fill_bulk_urb(ctx->outurb, upriv->udev, upriv->write_pipe, in ezusb_access_ltv()
879 ctx->buf, req_size, in ezusb_access_ltv()
880 ezusb_request_out_callback, ctx); in ezusb_access_ltv()
882 if (ctx->in_rid) in ezusb_access_ltv()
885 ezusb_req_enqueue_run(upriv, ctx); in ezusb_access_ltv()
889 if (ctx->in_rid) in ezusb_access_ltv()
890 ezusb_req_ctx_wait(upriv, ctx); in ezusb_access_ltv()
892 state = ctx->state; in ezusb_access_ltv()
895 retval = ctx->outurb->status; in ezusb_access_ltv()
900 if (!ctx->in_rid) in ezusb_access_ltv()
923 if (ctx->in_rid) { in ezusb_access_ltv()
924 struct ezusb_packet *ans = ctx->buf; in ezusb_access_ltv()
932 if (exp_len != ctx->buf_length) { in ezusb_access_ltv()
935 ctx->in_rid, exp_len, ctx->buf_length); in ezusb_access_ltv()
946 ezusb_request_context_put(ctx); in ezusb_access_ltv()
955 struct request_context *ctx; in ezusb_write_ltv() local
967 ctx = ezusb_alloc_ctx(upriv, rid, EZUSB_RID_ACK); in ezusb_write_ltv()
968 if (!ctx) in ezusb_write_ltv()
976 return ezusb_access_ltv(upriv, ctx, length, data, frame_type, in ezusb_write_ltv()
984 struct request_context *ctx; in ezusb_read_ltv() local
989 ctx = ezusb_alloc_ctx(upriv, rid, rid); in ezusb_read_ltv()
990 if (!ctx) in ezusb_read_ltv()
993 return ezusb_access_ltv(upriv, ctx, 0, NULL, EZUSB_FRAME_CONTROL, in ezusb_read_ltv()
1001 struct request_context *ctx; in ezusb_doicmd_wait() local
1012 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_DOCMD, EZUSB_RID_ACK); in ezusb_doicmd_wait()
1013 if (!ctx) in ezusb_doicmd_wait()
1016 return ezusb_access_ltv(upriv, ctx, sizeof(data), &data, in ezusb_doicmd_wait()
1024 struct request_context *ctx; in ezusb_docmd_wait() local
1033 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_DOCMD, EZUSB_RID_ACK); in ezusb_docmd_wait()
1034 if (!ctx) in ezusb_docmd_wait()
1037 return ezusb_access_ltv(upriv, ctx, sizeof(data), &data, in ezusb_docmd_wait()
1078 struct request_context *ctx; in ezusb_read_pda() local
1083 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_READ_PDA, EZUSB_RID_READ_PDA); in ezusb_read_pda()
1084 if (!ctx) in ezusb_read_pda()
1094 return ezusb_access_ltv(upriv, ctx, sizeof(data), &data, in ezusb_read_pda()
1102 struct request_context *ctx; in ezusb_program_init() local
1105 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_PROG_INIT, EZUSB_RID_ACK); in ezusb_program_init()
1106 if (!ctx) in ezusb_program_init()
1109 return ezusb_access_ltv(upriv, ctx, sizeof(data), &data, in ezusb_program_init()
1116 struct request_context *ctx; in ezusb_program_end() local
1118 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_PROG_END, EZUSB_RID_ACK); in ezusb_program_end()
1119 if (!ctx) in ezusb_program_end()
1122 return ezusb_access_ltv(upriv, ctx, 0, NULL, in ezusb_program_end()
1130 struct request_context *ctx; in ezusb_program_bytes() local
1134 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_PROG_SET_ADDR, EZUSB_RID_ACK); in ezusb_program_bytes()
1135 if (!ctx) in ezusb_program_bytes()
1138 err = ezusb_access_ltv(upriv, ctx, sizeof(data), &data, in ezusb_program_bytes()
1143 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_PROG_BYTES, EZUSB_RID_ACK); in ezusb_program_bytes()
1144 if (!ctx) in ezusb_program_bytes()
1147 return ezusb_access_ltv(upriv, ctx, len, buf, in ezusb_program_bytes()
1192 struct request_context *ctx; in ezusb_xmit() local
1227 ctx = ezusb_alloc_ctx(upriv, EZUSB_RID_TX, 0); in ezusb_xmit()
1228 if (!ctx) in ezusb_xmit()
1231 memset(ctx->buf, 0, BULK_BUF_SIZE); in ezusb_xmit()
1232 buf = ctx->buf->data; in ezusb_xmit()
1265 tx_size = ALIGN(buf - ctx->buf->data, 2); in ezusb_xmit()
1267 err = ezusb_access_ltv(upriv, ctx, tx_size, NULL, in ezusb_xmit()
1464 struct request_context *ctx; in ezusb_delete() local
1467 ctx = list_entry(item, struct request_context, list); in ezusb_delete()
1468 atomic_inc(&ctx->refcount); in ezusb_delete()
1470 ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK; in ezusb_delete()
1471 err = usb_unlink_urb(ctx->outurb); in ezusb_delete()
1475 wait_for_completion(&ctx->done); in ezusb_delete()
1477 del_timer_sync(&ctx->timer); in ezusb_delete()
1480 if (!list_empty(&ctx->list)) in ezusb_delete()
1481 ezusb_ctx_complete(ctx); in ezusb_delete()
1483 ezusb_request_context_put(ctx); in ezusb_delete()