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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.