speedtouch: simplify the receive urb lifecycle: allocate them in the usb probe function, free them on disconnect.
speedtouch.c | 81 +++++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 51 insertions(+), 30 deletions(-) diff -Nru a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c --- a/drivers/usb/misc/speedtouch.c Mon Jan 20 11:14:11 2003 +++ b/drivers/usb/misc/speedtouch.c Mon Jan 20 11:14:11 2003 @@ -688,18 +688,6 @@ for (i = 0, succes = 0; i < UDSL_NUMBER_RCV_URBS; i++) { struct udsl_data_ctx *ctx = &(instance->rcvbufs[i]); - ctx->urb = NULL; - ctx->skb = dev_alloc_skb (UDSL_RECEIVE_BUFFER_SIZE); - if (!ctx->skb) - continue; - - ctx->urb = usb_alloc_urb (0, GFP_KERNEL); - if (!ctx->urb) { - kfree_skb (ctx->skb); - ctx->skb = NULL; - break; - }; - usb_fill_bulk_urb (ctx->urb, instance->usb_dev, usb_rcvbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_IN), @@ -707,12 +695,6 @@ UDSL_RECEIVE_BUFFER_SIZE, udsl_usb_data_receive, ctx); - - ctx->instance = instance; - - PDEBUG ("udsl_usb_data_init: usb with skb->truesize = %d (Asked for %d)\n", - ctx->skb->truesize, UDSL_RECEIVE_BUFFER_SIZE); - if (usb_submit_urb (ctx->urb, GFP_KERNEL) < 0) PDEBUG ("udsl_usb_data_init: Submit failed, loosing urb.\n"); else @@ -753,10 +735,6 @@ continue; usb_unlink_urb (ctx->urb); - - usb_free_urb (ctx->urb); - kfree_skb (ctx->skb); - ctx->skb = NULL; } tasklet_kill (&instance->recvqueue_tasklet); @@ -842,6 +820,27 @@ tasklet_init (&instance->recvqueue_tasklet, udsl_atm_processqueue, (unsigned long) instance); + /* receive urb init */ + for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) { + struct udsl_data_ctx *ctx = &(instance->rcvbufs[i]); + + if (!(ctx->skb = dev_alloc_skb (UDSL_RECEIVE_BUFFER_SIZE))) { + PDEBUG ("No memory for skb %d!\n", i); + err = -ENOMEM; + goto fail_urbs; + } + + if (!(ctx->urb = usb_alloc_urb (0, GFP_KERNEL))) { + PDEBUG ("No memory for receive urb %d!\n", i); + err = -ENOMEM; + goto fail_urbs; + } + + ctx->instance = instance; + + PDEBUG ("skb->truesize = %d (asked for %d)\n", ctx->skb->truesize, +UDSL_RECEIVE_BUFFER_SIZE); + } + /* atm init */ if (!(instance->atm_dev = atm_dev_register (udsl_driver_name, &udsl_atm_devops, -1, 0))) { PDEBUG ("failed to register ATM device!\n"); @@ -874,6 +873,16 @@ return 0; fail_atm: +fail_urbs: + for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) { + struct udsl_data_ctx *ctx = &(instance->rcvbufs[i]); + + if (ctx->skb) + kfree_skb (ctx->skb); + + if (ctx->urb) + usb_free_urb (ctx->urb); + } kfree (instance); fail_instance: return err; @@ -882,20 +891,32 @@ static void udsl_usb_disconnect (struct usb_interface *intf) { struct udsl_instance_data *instance = usb_get_intfdata (intf); + int i; PDEBUG ("disconnecting\n"); usb_set_intfdata (intf, NULL); - if (instance) { - /* unlinking receive buffers */ - udsl_usb_data_exit (instance); - - /* removing atm device */ - if (instance->atm_dev) - udsl_atm_stopdevice (instance); - kfree (instance); + if (!instance) { + PDEBUG ("NULL instance!\n"); + return; } + + /* unlinking receive buffers */ + udsl_usb_data_exit (instance); + + for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) { + struct udsl_data_ctx *ctx = &(instance->rcvbufs[i]); + + usb_free_urb (ctx->urb); + kfree_skb (ctx->skb); + } + + /* removing atm device */ + if (instance->atm_dev) + udsl_atm_stopdevice (instance); + + kfree (instance); } ------------------------------------------------------- This SF.NET email is sponsored by: FREE SSL Guide from Thawte are you planning your Web Server Security? Click here to get a FREE Thawte SSL guide and find the answers to all your SSL security issues. http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0026en _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel