<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From: Greg KH &lt;greg@kroah.com&gt;
To: torvalds@transmeta.com
Cc: linux-usb-devel@lists.sourceforge.net
Subject: [PATCH 02 of 16] USB catc driver change

Hi,

Here's a patch against 2.5.3-pre3 for the USB catch driver that converts
it to dynamically allocate its urbs.

thanks,

greg k-h


diff -Nru a/drivers/usb/catc.c b/drivers/usb/catc.c
--- a/drivers/usb/catc.c	Tue Jan 22 12:54:25 2002
+++ b/drivers/usb/catc.c	Tue Jan 22 12:54:25 2002
@@ -179,7 +179,7 @@
 		void (*callback)(struct catc *catc, struct ctrl_queue *q);
 	} ctrl_queue[CTRL_QUEUE];
 
-	struct urb tx_urb, rx_urb, irq_urb, ctrl_urb;
+	struct urb *tx_urb, *rx_urb, *irq_urb, *ctrl_urb;
 };
 
 /*
@@ -256,8 +256,8 @@
 	}
 
 	if ((data[1] &amp; 0x80) &amp;&amp; !test_and_set_bit(RX_RUNNING, &amp;catc-&gt;flags)) {
-		catc-&gt;rx_urb.dev = catc-&gt;usbdev;
-		if ((status = usb_submit_urb(&amp;catc-&gt;rx_urb)) &lt; 0) {
+		catc-&gt;rx_urb-&gt;dev = catc-&gt;usbdev;
+		if ((status = usb_submit_urb(catc-&gt;rx_urb)) &lt; 0) {
 			err("submit(rx_urb) status %d", status);
 			return;
 		} 
@@ -282,11 +282,11 @@
 {
 	int status;
 
-	catc-&gt;tx_urb.transfer_buffer_length = catc-&gt;tx_ptr;
-	catc-&gt;tx_urb.transfer_buffer = catc-&gt;tx_buf[catc-&gt;tx_idx];
-	catc-&gt;tx_urb.dev = catc-&gt;usbdev;
+	catc-&gt;tx_urb-&gt;transfer_buffer_length = catc-&gt;tx_ptr;
+	catc-&gt;tx_urb-&gt;transfer_buffer = catc-&gt;tx_buf[catc-&gt;tx_idx];
+	catc-&gt;tx_urb-&gt;dev = catc-&gt;usbdev;
 
-	if ((status = usb_submit_urb(&amp;catc-&gt;tx_urb)) &lt; 0)
+	if ((status = usb_submit_urb(catc-&gt;tx_urb)) &lt; 0)
 		err("submit(tx_urb), status %d", status);
 
 	catc-&gt;tx_idx = !catc-&gt;tx_idx;
@@ -363,8 +363,8 @@
 	struct catc *catc = netdev-&gt;priv;
 
 	warn("Transmit timed out.");
-	catc-&gt;tx_urb.transfer_flags |= USB_ASYNC_UNLINK;
-	usb_unlink_urb(&amp;catc-&gt;tx_urb);
+	catc-&gt;tx_urb-&gt;transfer_flags |= USB_ASYNC_UNLINK;
+	usb_unlink_urb(catc-&gt;tx_urb);
 }
 
 /*
@@ -383,7 +383,7 @@
 {
 	struct ctrl_queue *q = catc-&gt;ctrl_queue + catc-&gt;ctrl_tail;
 	struct usb_device *usbdev = catc-&gt;usbdev;
-	struct urb *urb = &amp;catc-&gt;ctrl_urb;
+	struct urb *urb = catc-&gt;ctrl_urb;
 	struct usb_ctrlrequest *dr = &amp;catc-&gt;ctrl_dr;
 	int status;
 
@@ -402,7 +402,7 @@
 	if (!q-&gt;dir &amp;&amp; q-&gt;buf &amp;&amp; q-&gt;len)
 		memcpy(catc-&gt;ctrl_buf, q-&gt;buf, q-&gt;len);
 
-	if ((status = usb_submit_urb(&amp;catc-&gt;ctrl_urb)))
+	if ((status = usb_submit_urb(catc-&gt;ctrl_urb)))
 		err("submit(ctrl_urb) status %d", status);
 }
 
@@ -624,8 +624,8 @@
 	struct catc *catc = netdev-&gt;priv;
 	int status;
 
-	catc-&gt;irq_urb.dev = catc-&gt;usbdev;
-	if ((status = usb_submit_urb(&amp;catc-&gt;irq_urb)) &lt; 0) {
+	catc-&gt;irq_urb-&gt;dev = catc-&gt;usbdev;
+	if ((status = usb_submit_urb(catc-&gt;irq_urb)) &lt; 0) {
 		err("submit(irq_urb) status %d", status);
 		return -1;
 	}
@@ -645,10 +645,10 @@
 
 	del_timer_sync(&amp;catc-&gt;timer);
 
-	usb_unlink_urb(&amp;catc-&gt;rx_urb);
-	usb_unlink_urb(&amp;catc-&gt;tx_urb);
-	usb_unlink_urb(&amp;catc-&gt;irq_urb);
-	usb_unlink_urb(&amp;catc-&gt;ctrl_urb);
+	usb_unlink_urb(catc-&gt;rx_urb);
+	usb_unlink_urb(catc-&gt;tx_urb);
+	usb_unlink_urb(catc-&gt;irq_urb);
+	usb_unlink_urb(catc-&gt;ctrl_urb);
 
 	return 0;
 }
@@ -694,16 +694,26 @@
 	catc-&gt;timer.data = (long) catc;
 	catc-&gt;timer.function = catc_stats_timer;
 
-	FILL_CONTROL_URB(&amp;catc-&gt;ctrl_urb, usbdev, usb_sndctrlpipe(usbdev, 0),
+	catc-&gt;ctrl_urb = usb_alloc_urb(0);
+	catc-&gt;tx_urb = usb_alloc_urb(0);
+	catc-&gt;rx_urb = usb_alloc_urb(0);
+	catc-&gt;irq_urb = usb_alloc_urb(0);
+	if ((!catc-&gt;ctrl_urb) || (!catc-&gt;tx_urb) || 
+	    (!catc-&gt;rx_urb) || (!catc-&gt;irq_urb)) {
+		err("No free urbs available.");
+		return NULL;
+	}
+
+	FILL_CONTROL_URB(catc-&gt;ctrl_urb, usbdev, usb_sndctrlpipe(usbdev, 0),
 		NULL, NULL, 0, catc_ctrl_done, catc);
 
-	FILL_BULK_URB(&amp;catc-&gt;tx_urb, usbdev, usb_sndbulkpipe(usbdev, 1),
+	FILL_BULK_URB(catc-&gt;tx_urb, usbdev, usb_sndbulkpipe(usbdev, 1),
 		NULL, 0, catc_tx_done, catc);
 
-	FILL_BULK_URB(&amp;catc-&gt;rx_urb, usbdev, usb_rcvbulkpipe(usbdev, 1),
+	FILL_BULK_URB(catc-&gt;rx_urb, usbdev, usb_rcvbulkpipe(usbdev, 1),
 		catc-&gt;rx_buf, RX_MAX_BURST * (PKT_SZ + 2), catc_rx_done, catc);
 
-	FILL_INT_URB(&amp;catc-&gt;irq_urb, usbdev, usb_rcvintpipe(usbdev, 2),
+	FILL_INT_URB(catc-&gt;irq_urb, usbdev, usb_rcvintpipe(usbdev, 2),
                 catc-&gt;irq_buf, 2, catc_irq_done, catc, 1);
 
 	dbg("Checking memory size\n");
@@ -772,6 +782,10 @@
 {
 	struct catc *catc = dev_ptr;
 	unregister_netdev(catc-&gt;netdev);
+	usb_free_urb(catc-&gt;ctrl_urb);
+	usb_free_urb(catc-&gt;tx_urb);
+	usb_free_urb(catc-&gt;rx_urb);
+	usb_free_urb(catc-&gt;irq_urb);
 	kfree(catc-&gt;netdev);
 	kfree(catc);
 }

</pre></body></html>