anchors in disconnect of st5481
Oliver Neukum <[email protected]>
| Newsgroups | gmane.linux.usb.devel,gmane.linux.isdn.i4l.user |
|---|---|
| Message-ID | <[email protected]> |
Hi, this is to clean up disconnect() handling on this driver. Compiles, but I have no hardware to test on. Regards Oliver Signed-off-by: Oliver Neukum <[email protected]> ---- diff -urp linux-2.6.24-rc1/drivers/isdn/hisax/st5481_b.c hisax/drivers/isdn/hisax/st5481_b.c --- linux-2.6.24-rc1/drivers/isdn/hisax/st5481_b.c 2007-07-09 01:32:17.000000000 +0200 +++ hisax/drivers/isdn/hisax/st5481_b.c 2007-10-29 15:30:26.000000000 +0100 @@ -120,7 +120,7 @@ static void usb_b_out(struct st5481_bcs DBG_ISO_PACKET(0x200,urb); - SUBMIT_URB(urb, GFP_NOIO); + SUBMIT_URB(urb, adapter, GFP_NOIO); } /* diff -urp linux-2.6.24-rc1/drivers/isdn/hisax/st5481_d.c hisax/drivers/isdn/hisax/st5481_d.c --- linux-2.6.24-rc1/drivers/isdn/hisax/st5481_d.c 2007-07-09 01:32:17.000000000 +0200 +++ hisax/drivers/isdn/hisax/st5481_d.c 2007-10-29 15:29:37.000000000 +0100 @@ -355,12 +355,14 @@ static void usb_d_out(struct st5481_adap urb->start_frame = usb_get_current_frame_number(adapter->usb_dev)+2; DBG_ISO_PACKET(0x20,urb); + usb_anchor_urb(urb, &adapter->death_row); if (usb_submit_urb(urb, GFP_KERNEL) < 0) { // There is another URB queued up + usb_unanchor_urb(urb); urb->transfer_flags = URB_ISO_ASAP; - SUBMIT_URB(urb, GFP_KERNEL); - } + SUBMIT_URB(urb, adapter, GFP_KERNEL); + } } static void fifo_reseted(void *context) @@ -454,7 +456,7 @@ static void dout_start_xmit(struct FsmIn urb->transfer_flags = URB_ISO_ASAP; DBG_ISO_PACKET(0x20,urb); - SUBMIT_URB(urb, GFP_KERNEL); + SUBMIT_URB(urb, adapter, GFP_KERNEL); } static void dout_short_fifo(struct FsmInst *fsm, int event, void *arg) diff -urp linux-2.6.24-rc1/drivers/isdn/hisax/st5481.h hisax/drivers/isdn/hisax/st5481.h --- linux-2.6.24-rc1/drivers/isdn/hisax/st5481.h 2007-07-09 01:32:17.000000000 +0200 +++ hisax/drivers/isdn/hisax/st5481.h 2007-10-29 15:27:54.000000000 +0100 @@ -396,6 +396,7 @@ struct st5481_adapter { struct FsmTimer timer; struct st5481_bcs bcs[2]; + struct usb_anchor death_row; }; #define TIMER3_VALUE 7000 @@ -408,10 +409,12 @@ struct st5481_adapter { * Submit an URB with error reporting. This is a macro so * the __FUNCTION__ returns the caller function name. */ -#define SUBMIT_URB(urb, mem_flags) \ +#define SUBMIT_URB(urb, adapter, mem_flags) \ ({ \ int status; \ + usb_anchor_urb(urb, &adapter->death_row); \ if ((status = usb_submit_urb(urb, mem_flags)) < 0) { \ + usb_unanchor_urb(urb); \ WARN("usb_submit_urb failed,status=%d", status); \ } \ status; \ diff -urp linux-2.6.24-rc1/drivers/isdn/hisax/st5481_init.c hisax/drivers/isdn/hisax/st5481_init.c --- linux-2.6.24-rc1/drivers/isdn/hisax/st5481_init.c 2007-07-09 01:32:17.000000000 +0200 +++ hisax/drivers/isdn/hisax/st5481_init.c 2007-10-29 15:38:49.000000000 +0100 @@ -79,6 +79,7 @@ static int probe_st5481(struct usb_inter adapter->hisax_d_if.owner = THIS_MODULE; adapter->hisax_d_if.ifc.priv = adapter; adapter->hisax_d_if.ifc.l2l1 = st5481_d_l2l1; + init_usb_anchor(&adapter->death_row); for (i = 0; i < 2; i++) { adapter->bcs[i].adapter = adapter; @@ -148,8 +149,9 @@ static void disconnect_st5481(struct usb st5481_release_b(&adapter->bcs[1]); st5481_release_b(&adapter->bcs[0]); st5481_release_d(adapter); - // we would actually better wait for completion of outstanding urbs - mdelay(2); + + /* kill outstanding URBs */ + usb_kill_anchored_urbs(&adapter->death_row); st5481_release_usb(adapter); hisax_unregister(&adapter->hisax_d_if); diff -urp linux-2.6.24-rc1/drivers/isdn/hisax/st5481_usb.c hisax/drivers/isdn/hisax/st5481_usb.c --- linux-2.6.24-rc1/drivers/isdn/hisax/st5481_usb.c 2007-07-09 01:32:17.000000000 +0200 +++ hisax/drivers/isdn/hisax/st5481_usb.c 2007-10-29 15:37:26.000000000 +0100 @@ -50,7 +50,7 @@ static void usb_next_ctrl_msg(struct urb // Prepare the URB urb->dev = adapter->usb_dev; - SUBMIT_URB(urb, GFP_ATOMIC); + SUBMIT_URB(urb, adapter, GFP_ATOMIC); } /* @@ -233,9 +233,12 @@ static void usb_int_complete(struct urb urb->actual_length = 0; exit: + usb_anchor_urb(urb, &adapter->death_row); status = usb_submit_urb (urb, GFP_ATOMIC); - if (status) + if (status) { + usb_unanchor_urb(urb); WARN("usb_submit_urb failed with result %d", status); + } } /* ====================================================================== @@ -376,7 +379,7 @@ void st5481_start(struct st5481_adapter adapter->leds = RED_LED; // Start receiving on the interrupt endpoint - SUBMIT_URB(intr->urb, GFP_KERNEL); + SUBMIT_URB(intr->urb, adapter, GFP_KERNEL); while ((request = init_cmd_table[i++])) { value = init_cmd_table[i++]; @@ -541,7 +544,7 @@ static void usb_in_complete(struct urb * urb->dev = in->adapter->usb_dev; urb->actual_length = 0; - SUBMIT_URB(urb, GFP_ATOMIC); + SUBMIT_URB(urb, in->adapter, GFP_ATOMIC); } int st5481_setup_in(struct st5481_in *in) @@ -627,10 +630,10 @@ static void st5481_start_rcv(void *conte DBG(4,""); in->urb[0]->dev = adapter->usb_dev; - SUBMIT_URB(in->urb[0], GFP_KERNEL); + SUBMIT_URB(in->urb[0], adapter, GFP_KERNEL); in->urb[1]->dev = adapter->usb_dev; - SUBMIT_URB(in->urb[1], GFP_KERNEL); + SUBMIT_URB(in->urb[1], adapter, GFP_KERNEL); } void st5481_in_mode(struct st5481_in *in, int mode) ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ [email protected] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel